From c8753d1d3997b35a266d480b1f34c182447d52ea Mon Sep 17 00:00:00 2001
From: Ryan Hall
Date: Mon, 23 Sep 2024 12:11:15 -0400
Subject: [PATCH 01/32] merge FeePaid event into CCIPMessageSent (#1456)
## Motivation
Not sure actually why this was needed. Request was [made
here](https://smartcontract-it.atlassian.net/browse/CCIP-3446?atlOrigin=eyJpIjoiMTQ4ODMwNzU2N2I3NDI0NGE0ZDhiOTIyZTYwOTNjN2IiLCJwIjoiaiJ9).
This is the 2nd version, that alters the MessageSent struct. First
version [here](https://github.com/smartcontractkit/ccip/pull/1452).
## Solution
Merge fields from FeePaid event into CCIPMessageSent event
---
contracts/gas-snapshots/ccip.gas-snapshot | 94 +++++------
.../src/v0.8/ccip/libraries/Internal.sol | 1 +
contracts/src/v0.8/ccip/onRamp/OnRamp.sol | 16 +-
.../ccip/test/e2e/MultiRampsEnd2End.t.sol | 5 +-
.../ccip/test/feeQuoter/FeeQuoterSetup.t.sol | 2 +
.../src/v0.8/ccip/test/onRamp/OnRamp.t.sol | 8 +-
.../v0.8/ccip/test/onRamp/OnRampSetup.t.sol | 23 ++-
.../ccip_reader_tester/ccip_reader_tester.go | 7 +-
.../ccip/generated/onramp/onramp.go | 147 +-----------------
...rapper-dependency-versions-do-not-edit.txt | 4 +-
10 files changed, 97 insertions(+), 210 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 9861ed236c..740dfc0c8f 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -572,8 +572,8 @@ MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24234)
MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275)
MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933)
MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049)
-MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233778)
-MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1504663)
+MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233701)
+MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1500580)
NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778)
@@ -585,15 +585,15 @@ NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success(
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249120)
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237027)
NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153748)
-NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168959)
-NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 221148)
-NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126861)
-NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107723)
-NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123207)
+NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168256)
+NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 219631)
+NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126745)
+NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 106975)
+NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123102)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 43079)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64408)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert() (gas: 42943)
-NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66696)
+NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66666)
NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12070)
NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9705)
OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12210)
@@ -758,51 +758,51 @@ OffRamp_trialExecute:test_trialExecute_Success() (gas: 277894)
OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842)
OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18030)
OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67426)
-OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325124)
-OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 65227)
-OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 13446)
-OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 95048)
-OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92990)
-OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 98023)
-OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 93046)
-OnRamp_constructor:test_Constructor_Success() (gas: 2750875)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115146)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 145969)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145545)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143772)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145763)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145139)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 145974)
-OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38593)
-OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143056)
-OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36706)
-OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36509)
+OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325083)
+OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 65095)
+OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 13422)
+OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94996)
+OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92938)
+OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97971)
+OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92972)
+OnRamp_constructor:test_Constructor_Success() (gas: 2734391)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114527)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 145328)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 144925)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143086)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145122)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 144520)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 144604)
+OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38554)
+OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143051)
+OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36596)
+OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36527)
OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 18291)
-OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38454)
-OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23663)
-OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186202)
-OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212587)
-OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 125127)
-OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 141767)
-OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3618195)
+OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38431)
+OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23640)
+OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 183954)
+OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 210338)
+OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146154)
+OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 160259)
+OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3613942)
OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010)
-OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75826)
-OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38559)
-OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280050)
-OnRamp_getFee:test_EmptyMessage_Success() (gas: 98757)
-OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64779)
-OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86359)
-OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35185)
-OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113916)
-OnRamp_getFee:test_Unhealthy_Revert() (gas: 17171)
-OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10510)
-OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35372)
-OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 11581)
+OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866)
+OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599)
+OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 279390)
+OnRamp_getFee:test_EmptyMessage_Success() (gas: 98513)
+OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64645)
+OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86177)
+OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35097)
+OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113639)
+OnRamp_getFee:test_Unhealthy_Revert() (gas: 17061)
+OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10474)
+OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35348)
+OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 11536)
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZero_Revert() (gas: 13195)
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert() (gas: 11522)
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 16850)
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265)
-OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56460)
+OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56369)
OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302)
PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349)
PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310)
diff --git a/contracts/src/v0.8/ccip/libraries/Internal.sol b/contracts/src/v0.8/ccip/libraries/Internal.sol
index d09717f63a..13ffc56b91 100644
--- a/contracts/src/v0.8/ccip/libraries/Internal.sol
+++ b/contracts/src/v0.8/ccip/libraries/Internal.sol
@@ -342,6 +342,7 @@ library Internal {
bytes extraArgs; // destination-chain specific extra args, such as the gasLimit for EVM chains
address feeToken; // fee token
uint256 feeTokenAmount; // fee token amount
+ uint256 feeValueJuels; // fee amount in Juels
EVM2AnyTokenTransfer[] tokenAmounts; // array of tokens and amounts to transfer
}
diff --git a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
index 76e966311d..959d831a39 100644
--- a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
+++ b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
@@ -46,7 +46,6 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
event DestChainConfigSet(
uint64 indexed destChainSelector, uint64 sequenceNumber, IRouter router, bool allowListEnabled
);
- event FeePaid(address indexed feeToken, uint256 feeValueJuels);
event FeeTokenWithdrawn(address indexed feeAggregator, address indexed feeToken, uint256 amount);
/// RMN depends on this event, if changing, please notify the RMN maintainers.
event CCIPMessageSent(uint64 indexed destChainSelector, Internal.EVM2AnyRampMessage message);
@@ -211,6 +210,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
receiver: message.receiver,
feeToken: message.feeToken,
feeTokenAmount: feeTokenAmount,
+ feeValueJuels: 0, // calculated later
// Should be populated via lock / burn pool calls
tokenAmounts: new Internal.EVM2AnyTokenTransfer[](message.tokenAmounts.length)
});
@@ -224,17 +224,15 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
// Convert message fee to juels and retrieve converted args
// Validate pool return data after it is populated (view function - no state changes)
- (
- uint256 msgFeeJuels,
- bool isOutOfOrderExecution,
- bytes memory convertedExtraArgs,
- bytes[] memory destExecDataPerToken
- ) = IFeeQuoter(s_dynamicConfig.feeQuoter).processMessageArgs(
+ bool isOutOfOrderExecution;
+ bytes memory convertedExtraArgs;
+ bytes[] memory destExecDataPerToken;
+ (newMessage.feeValueJuels, isOutOfOrderExecution, convertedExtraArgs, destExecDataPerToken) = IFeeQuoter(
+ s_dynamicConfig.feeQuoter
+ ).processMessageArgs(
destChainSelector, message.feeToken, feeTokenAmount, message.extraArgs, newMessage.tokenAmounts, tokenAmounts
);
- emit FeePaid(message.feeToken, msgFeeJuels);
-
newMessage.header.nonce = isOutOfOrderExecution
? 0
: INonceManager(i_nonceManager).getIncrementedOutboundNonce(destChainSelector, originalSender);
diff --git a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
index 5f06a37e13..59f727c251 100644
--- a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
+++ b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
@@ -251,6 +251,8 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup {
IERC20(s_sourceTokens[0]).approve(address(router), i_tokenAmount0 + router.getFee(DEST_CHAIN_SELECTOR, message));
IERC20(s_sourceTokens[1]).approve(address(router), i_tokenAmount1);
+ uint256 feeAmount = router.getFee(DEST_CHAIN_SELECTOR, message);
+
message.receiver = abi.encode(address(s_receiver));
Internal.EVM2AnyRampMessage memory msgEvent = _messageToEvent(
message,
@@ -258,7 +260,8 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup {
DEST_CHAIN_SELECTOR,
expectedSeqNum,
nonce,
- router.getFee(DEST_CHAIN_SELECTOR, message),
+ feeAmount,
+ feeAmount,
OWNER,
metadataHash,
tokenAdminRegistry
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 340fe3662d..d630c55c0d 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol
@@ -367,6 +367,7 @@ contract FeeQuoterFeeSetup is FeeQuoterSetup {
uint64 seqNum,
uint64 nonce,
uint256 feeTokenAmount,
+ uint256 feeValueJuels,
address originalSender,
bytes32 metadataHash,
TokenAdminRegistry tokenAdminRegistry
@@ -388,6 +389,7 @@ contract FeeQuoterFeeSetup is FeeQuoterSetup {
extraArgs: Client._argsToBytes(extraArgs),
feeToken: message.feeToken,
feeTokenAmount: feeTokenAmount,
+ feeValueJuels: feeValueJuels,
tokenAmounts: new Internal.EVM2AnyTokenTransfer[](message.tokenAmounts.length)
});
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
index 72be798738..2a7fac892c 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
@@ -287,7 +287,8 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount);
vm.expectEmit();
- emit OnRamp.FeePaid(s_sourceFeeToken, feeAmount);
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_onRamp)), feeAmount);
@@ -307,7 +308,8 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
uint256 expectedJuels = (feeAmount * conversionRate) / 1e18;
vm.expectEmit();
- emit OnRamp.FeePaid(s_sourceTokens[1], expectedJuels);
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _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);
@@ -352,8 +354,6 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
Internal.EVM2AnyRampMessage memory expectedEvent = _messageToEvent(message, 1, 1, feeTokenAmount, originalSender);
vm.expectEmit();
- emit OnRamp.FeePaid(s_sourceFeeToken, feeTokenAmount);
- vm.expectEmit(false, false, false, true);
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, expectedEvent);
// Assert the message Id is correct
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
index ddcbbd5620..6ecd3a5807 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
@@ -64,13 +64,33 @@ contract OnRampSetup is FeeQuoterFeeSetup {
});
}
+ /// @dev a helper function to compose EVM2AnyRampMessage messages
+ /// @dev it is assummed that LINK is the payment token because feeTokenAmount == feeValueJuels
function _messageToEvent(
Client.EVM2AnyMessage memory message,
uint64 seqNum,
uint64 nonce,
uint256 feeTokenAmount,
address originalSender
- ) public view returns (Internal.EVM2AnyRampMessage memory) {
+ ) internal view returns (Internal.EVM2AnyRampMessage memory) {
+ return _messageToEvent(
+ message,
+ seqNum,
+ nonce,
+ feeTokenAmount, // fee paid
+ feeTokenAmount, // converstion to jules is the same
+ originalSender
+ );
+ }
+
+ function _messageToEvent(
+ Client.EVM2AnyMessage memory message,
+ uint64 seqNum,
+ uint64 nonce,
+ uint256 feeTokenAmount,
+ uint256 feeValueJuels,
+ address originalSender
+ ) internal view returns (Internal.EVM2AnyRampMessage memory) {
return _messageToEvent(
message,
SOURCE_CHAIN_SELECTOR,
@@ -78,6 +98,7 @@ contract OnRampSetup is FeeQuoterFeeSetup {
seqNum,
nonce,
feeTokenAmount,
+ feeValueJuels,
originalSender,
s_metadataHash,
s_tokenAdminRegistry
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 efdc46ebf2..bb6639d7e8 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
@@ -43,6 +43,7 @@ type InternalEVM2AnyRampMessage struct {
ExtraArgs []byte
FeeToken common.Address
FeeTokenAmount *big.Int
+ FeeValueJuels *big.Int
TokenAmounts []InternalEVM2AnyTokenTransfer
}
@@ -100,8 +101,8 @@ type OffRampSourceChainConfig struct {
}
var CCIPReaderTesterMetaData = &bind.MetaData{
- ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"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\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"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\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\"},{\"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\":\"emitCCIPSendRequested\",\"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\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\"}],\"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\"},{\"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: "0x608060405234801561001057600080fd5b506113d3806100206000396000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c8063198b821c146100725780634cf66e36146100875780639041be3d1461009a578063c1a5a355146100ca578063e4d0223414610106578063e83eabba14610119578063e9d68a8e1461012c575b600080fd5b6100856100803660046107bd565b61014c565b005b610085610095366004610954565b610186565b6100ad6100a83660046109d2565b6101db565b6040516001600160401b0390911681526020015b60405180910390f35b6100856100d83660046109f4565b6001600160401b03918216600090815260016020526040902080546001600160401b03191691909216179055565b610085610114366004610bb5565b61020a565b610085610127366004610ce3565b61024f565b61013f61013a3660046109d2565b6102db565b6040516100c19190610de4565b7f062172a2ae1a84d7c8d18965d6267b71d579aeca033bbd2e0548947798c3d4628160405161017b9190610f80565b60405180910390a150565b82846001600160401b0316866001600160401b03167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df285856040516101cc929190611061565b60405180910390a45050505050565b6001600160401b0380821660009081526001602081905260408220549192610204921690611098565b92915050565b816001600160401b03167fe07a589f12eccf1bc0f7421666687a6986a0c8dbbdc877d1af562a97ba60ecfd82604051610243919061117a565b60405180910390a25050565b6001600160401b0380831660009081526020818152604091829020845181549286015193860151909416600160a81b02600160a81b600160e81b0319931515600160a01b026001600160a81b03199093166001600160a01b03909516949094179190911791909116919091178155606082015182919060018201906102d49082611307565b5050505050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b038781168452838352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b9092049092169483019490945260018401805493949293918401916103669061127c565b80601f01602080910402602001604051908101604052809291908181526020018280546103929061127c565b80156103df5780601f106103b4576101008083540402835291602001916103df565b820191906000526020600020905b8154815290600101906020018083116103c257829003601f168201915b5050505050815250509050919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610427576104276103ef565b60405290565b60405160a081016001600160401b0381118282101715610427576104276103ef565b604051608081016001600160401b0381118282101715610427576104276103ef565b60405161010081016001600160401b0381118282101715610427576104276103ef565b604051601f8201601f191681016001600160401b03811182821017156104bc576104bc6103ef565b604052919050565b60006001600160401b038211156104dd576104dd6103ef565b5060051b60200190565b6001600160a01b03811681146104fc57600080fd5b50565b803561050a816104e7565b919050565b80356001600160e01b038116811461050a57600080fd5b80356001600160401b038116811461050a57600080fd5b600082601f83011261054e57600080fd5b8135602061056361055e836104c4565b610494565b82815260069290921b8401810191818101908684111561058257600080fd5b8286015b848110156105cf576040818903121561059f5760008081fd5b6105a7610405565b6105b082610526565b81526105bd85830161050f565b81860152835291830191604001610586565b509695505050505050565b600082601f8301126105eb57600080fd5b81356001600160401b03811115610604576106046103ef565b610617601f8201601f1916602001610494565b81815284602083860101111561062c57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261065a57600080fd5b8135602061066a61055e836104c4565b82815260059290921b8401810191818101908684111561068957600080fd5b8286015b848110156105cf5780356001600160401b03808211156106ad5760008081fd5b9088019060a0828b03601f19018113156106c75760008081fd5b6106cf61042d565b6106da888501610526565b8152604080850135848111156106f05760008081fd5b6106fe8e8b838901016105da565b8a8401525060609350610712848601610526565b908201526080610723858201610526565b9382019390935292013590820152835291830191830161068d565b600082601f83011261074f57600080fd5b8135602061075f61055e836104c4565b82815260069290921b8401810191818101908684111561077e57600080fd5b8286015b848110156105cf576040818903121561079b5760008081fd5b6107a3610405565b813581528482013585820152835291830191604001610782565b600060208083850312156107d057600080fd5b82356001600160401b03808211156107e757600080fd5b90840190608082870312156107fb57600080fd5b61080361044f565b82358281111561081257600080fd5b8301604081890381131561082557600080fd5b61082d610405565b82358581111561083c57600080fd5b8301601f81018b1361084d57600080fd5b803561085b61055e826104c4565b81815260069190911b8201890190898101908d83111561087a57600080fd5b928a01925b828410156108ca5785848f0312156108975760008081fd5b61089f610405565b84356108aa816104e7565b81526108b7858d0161050f565b818d0152825292850192908a019061087f565b8452505050828701359150848211156108e257600080fd5b6108ee8a83850161053d565b8188015283525050828401358281111561090757600080fd5b61091388828601610649565b8583015250604083013593508184111561092c57600080fd5b6109388785850161073e565b6040820152606083013560608201528094505050505092915050565b600080600080600060a0868803121561096c57600080fd5b61097586610526565b945061098360208701610526565b93506040860135925060608601356004811061099e57600080fd5b915060808601356001600160401b038111156109b957600080fd5b6109c5888289016105da565b9150509295509295909350565b6000602082840312156109e457600080fd5b6109ed82610526565b9392505050565b60008060408385031215610a0757600080fd5b610a1083610526565b9150610a1e60208401610526565b90509250929050565b600060a08284031215610a3957600080fd5b610a4161042d565b905081358152610a5360208301610526565b6020820152610a6460408301610526565b6040820152610a7560608301610526565b6060820152610a8660808301610526565b608082015292915050565b600082601f830112610aa257600080fd5b81356020610ab261055e836104c4565b82815260059290921b84018101918181019086841115610ad157600080fd5b8286015b848110156105cf5780356001600160401b0380821115610af55760008081fd5b9088019060a0828b03601f1901811315610b0f5760008081fd5b610b1761042d565b610b228885016104ff565b815260408085013584811115610b385760008081fd5b610b468e8b838901016105da565b8a8401525060608086013585811115610b5f5760008081fd5b610b6d8f8c838a01016105da565b83850152506080915081860135818401525082850135925083831115610b935760008081fd5b610ba18d8a858801016105da565b908201528652505050918301918301610ad5565b60008060408385031215610bc857600080fd5b610bd183610526565b915060208301356001600160401b0380821115610bed57600080fd5b908401906101808287031215610c0257600080fd5b610c0a610471565b610c148784610a27565b8152610c2260a084016104ff565b602082015260c083013582811115610c3957600080fd5b610c45888286016105da565b60408301525060e083013582811115610c5d57600080fd5b610c69888286016105da565b60608301525061010083013582811115610c8257600080fd5b610c8e888286016105da565b608083015250610ca161012084016104ff565b60a082015261014083013560c082015261016083013582811115610cc457600080fd5b610cd088828601610a91565b60e0830152508093505050509250929050565b60008060408385031215610cf657600080fd5b610cff83610526565b915060208301356001600160401b0380821115610d1b57600080fd5b9084019060808287031215610d2f57600080fd5b610d3761044f565b8235610d42816104e7565b815260208301358015158114610d5757600080fd5b6020820152610d6860408401610526565b6040820152606083013582811115610d7f57600080fd5b610d8b888286016105da565b6060830152508093505050509250929050565b6000815180845260005b81811015610dc457602081850181015186830182015201610da8565b506000602082860101526020601f19601f83011685010191505092915050565b602080825282516001600160a01b03168282015282015115156040808301919091528201516001600160401b0316606080830191909152820151608080830152600090610e3460a0840182610d9e565b949350505050565b6001600160a01b03169052565b60008151808452602080850194506020840160005b83811015610e9757815180516001600160401b031688528301516001600160e01b03168388015260409096019590820190600101610e5e565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b84811015610f3757858303601f19018952815180516001600160401b0390811685528582015160a08787018190529190610efb83880182610d9e565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101610ebf565b5090979650505050505050565b60008151808452602080850194506020840160005b83811015610e97578151805188528301518388015260409096019590820190600101610f59565b602080825282516080838301528051604060a08501819052815160e08601819052600094939284019185916101008801905b80841015610fed57845180516001600160a01b031683528701516001600160e01b031687830152938601936001939093019290820190610fb2565b5093850151878503609f190160c0890152936110098186610e49565b945050505050818501519150601f198085830301604086015261102c8284610ea2565b925060408601519150808584030160608601525061104a8282610f44565b915050606084015160808401528091505092915050565b60006004841061108157634e487b7160e01b600052602160045260246000fd5b83825260406020830152610e346040830184610d9e565b6001600160401b038181168382160190808211156110c657634e487b7160e01b600052601160045260246000fd5b5092915050565b600082825180855260208086019550808260051b84010181860160005b84811015610f3757858303601f19018952815180516001600160a01b031684528481015160a08686018190529061112382870182610d9e565b9150506040808301518683038288015261113d8382610d9e565b925050506060808301518187015250608080830151925085820381870152506111668183610d9e565b9a86019a94505050908301906001016110ea565b602081526111c7602082018351805182526020808201516001600160401b039081169184019190915260408083015182169084015260608083015182169084015260809182015116910152565b600060208301516111db60c0840182610e3c565b5060408301516101808060e08501526111f86101a0850183610d9e565b91506060850151601f1980868503016101008701526112178483610d9e565b93506080870151915080868503016101208701526112358483610d9e565b935060a0870151915061124c610140870183610e3c565b60c087015161016087015260e087015191508086850301838701525061127283826110cd565b9695505050505050565b600181811c9082168061129057607f821691505b6020821081036112b057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611302576000816000526020600020601f850160051c810160208610156112df5750805b601f850160051c820191505b818110156112fe578281556001016112eb565b5050505b505050565b81516001600160401b03811115611320576113206103ef565b6113348161132e845461127c565b846112b6565b602080601f83116001811461136957600084156113515750858301515b600019600386901b1c1916600185901b1785556112fe565b600085815260208120601f198616915b8281101561139857888601518255948401946001909101908401611379565b50858210156113b65787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000818000a",
+ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"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\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"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\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\":\"emitCCIPSendRequested\",\"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\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\"}],\"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\"},{\"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: "0x608060405234801561001057600080fd5b506113e9806100206000396000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c8063198b821c146100725780634cf66e36146100875780639041be3d1461009a578063c081a962146100ca578063c1a5a355146100dd578063e83eabba14610119578063e9d68a8e1461012c575b600080fd5b6100856100803660046107bd565b61014c565b005b610085610095366004610954565b610186565b6100ad6100a83660046109d2565b6101db565b6040516001600160401b0390911681526020015b60405180910390f35b6100856100d8366004610b82565b61020a565b6100856100eb366004610cbc565b6001600160401b03918216600090815260016020526040902080546001600160401b03191691909216179055565b610085610127366004610cef565b61024f565b61013f61013a3660046109d2565b6102db565b6040516100c19190610df0565b7f062172a2ae1a84d7c8d18965d6267b71d579aeca033bbd2e0548947798c3d4628160405161017b9190610f8c565b60405180910390a150565b82846001600160401b0316866001600160401b03167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df285856040516101cc92919061106d565b60405180910390a45050505050565b6001600160401b03808216600090815260016020819052604082205491926102049216906110a4565b92915050565b816001600160401b03167f273f5ec254c4821d9795f26fddd245b3658bf1126d45d9d1c13a1d18a4c77750826040516102439190611186565b60405180910390a25050565b6001600160401b0380831660009081526020818152604091829020845181549286015193860151909416600160a81b02600160a81b600160e81b0319931515600160a01b026001600160a81b03199093166001600160a01b03909516949094179190911791909116919091178155606082015182919060018201906102d4908261131d565b5050505050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b038781168452838352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b90920490921694830194909452600184018054939492939184019161036690611292565b80601f016020809104026020016040519081016040528092919081815260200182805461039290611292565b80156103df5780601f106103b4576101008083540402835291602001916103df565b820191906000526020600020905b8154815290600101906020018083116103c257829003601f168201915b5050505050815250509050919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610427576104276103ef565b60405290565b60405160a081016001600160401b0381118282101715610427576104276103ef565b604051608081016001600160401b0381118282101715610427576104276103ef565b60405161012081016001600160401b0381118282101715610427576104276103ef565b604051601f8201601f191681016001600160401b03811182821017156104bc576104bc6103ef565b604052919050565b60006001600160401b038211156104dd576104dd6103ef565b5060051b60200190565b6001600160a01b03811681146104fc57600080fd5b50565b803561050a816104e7565b919050565b80356001600160e01b038116811461050a57600080fd5b80356001600160401b038116811461050a57600080fd5b600082601f83011261054e57600080fd5b8135602061056361055e836104c4565b610494565b82815260069290921b8401810191818101908684111561058257600080fd5b8286015b848110156105cf576040818903121561059f5760008081fd5b6105a7610405565b6105b082610526565b81526105bd85830161050f565b81860152835291830191604001610586565b509695505050505050565b600082601f8301126105eb57600080fd5b81356001600160401b03811115610604576106046103ef565b610617601f8201601f1916602001610494565b81815284602083860101111561062c57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261065a57600080fd5b8135602061066a61055e836104c4565b82815260059290921b8401810191818101908684111561068957600080fd5b8286015b848110156105cf5780356001600160401b03808211156106ad5760008081fd5b9088019060a0828b03601f19018113156106c75760008081fd5b6106cf61042d565b6106da888501610526565b8152604080850135848111156106f05760008081fd5b6106fe8e8b838901016105da565b8a8401525060609350610712848601610526565b908201526080610723858201610526565b9382019390935292013590820152835291830191830161068d565b600082601f83011261074f57600080fd5b8135602061075f61055e836104c4565b82815260069290921b8401810191818101908684111561077e57600080fd5b8286015b848110156105cf576040818903121561079b5760008081fd5b6107a3610405565b813581528482013585820152835291830191604001610782565b600060208083850312156107d057600080fd5b82356001600160401b03808211156107e757600080fd5b90840190608082870312156107fb57600080fd5b61080361044f565b82358281111561081257600080fd5b8301604081890381131561082557600080fd5b61082d610405565b82358581111561083c57600080fd5b8301601f81018b1361084d57600080fd5b803561085b61055e826104c4565b81815260069190911b8201890190898101908d83111561087a57600080fd5b928a01925b828410156108ca5785848f0312156108975760008081fd5b61089f610405565b84356108aa816104e7565b81526108b7858d0161050f565b818d0152825292850192908a019061087f565b8452505050828701359150848211156108e257600080fd5b6108ee8a83850161053d565b8188015283525050828401358281111561090757600080fd5b61091388828601610649565b8583015250604083013593508184111561092c57600080fd5b6109388785850161073e565b6040820152606083013560608201528094505050505092915050565b600080600080600060a0868803121561096c57600080fd5b61097586610526565b945061098360208701610526565b93506040860135925060608601356004811061099e57600080fd5b915060808601356001600160401b038111156109b957600080fd5b6109c5888289016105da565b9150509295509295909350565b6000602082840312156109e457600080fd5b6109ed82610526565b9392505050565b600060a08284031215610a0657600080fd5b610a0e61042d565b905081358152610a2060208301610526565b6020820152610a3160408301610526565b6040820152610a4260608301610526565b6060820152610a5360808301610526565b608082015292915050565b600082601f830112610a6f57600080fd5b81356020610a7f61055e836104c4565b82815260059290921b84018101918181019086841115610a9e57600080fd5b8286015b848110156105cf5780356001600160401b0380821115610ac25760008081fd5b9088019060a0828b03601f1901811315610adc5760008081fd5b610ae461042d565b610aef8885016104ff565b815260408085013584811115610b055760008081fd5b610b138e8b838901016105da565b8a8401525060608086013585811115610b2c5760008081fd5b610b3a8f8c838a01016105da565b83850152506080915081860135818401525082850135925083831115610b605760008081fd5b610b6e8d8a858801016105da565b908201528652505050918301918301610aa2565b60008060408385031215610b9557600080fd5b610b9e83610526565b915060208301356001600160401b0380821115610bba57600080fd5b908401906101a08287031215610bcf57600080fd5b610bd7610471565b610be187846109f4565b8152610bef60a084016104ff565b602082015260c083013582811115610c0657600080fd5b610c12888286016105da565b60408301525060e083013582811115610c2a57600080fd5b610c36888286016105da565b6060830152506101008084013583811115610c5057600080fd5b610c5c898287016105da565b608084015250610c6f61012085016104ff565b60a083015261014084013560c083015261016084013560e083015261018084013583811115610c9d57600080fd5b610ca989828701610a5e565b8284015250508093505050509250929050565b60008060408385031215610ccf57600080fd5b610cd883610526565b9150610ce660208401610526565b90509250929050565b60008060408385031215610d0257600080fd5b610d0b83610526565b915060208301356001600160401b0380821115610d2757600080fd5b9084019060808287031215610d3b57600080fd5b610d4361044f565b8235610d4e816104e7565b815260208301358015158114610d6357600080fd5b6020820152610d7460408401610526565b6040820152606083013582811115610d8b57600080fd5b610d97888286016105da565b6060830152508093505050509250929050565b6000815180845260005b81811015610dd057602081850181015186830182015201610db4565b506000602082860101526020601f19601f83011685010191505092915050565b602080825282516001600160a01b03168282015282015115156040808301919091528201516001600160401b0316606080830191909152820151608080830152600090610e4060a0840182610daa565b949350505050565b6001600160a01b03169052565b60008151808452602080850194506020840160005b83811015610ea357815180516001600160401b031688528301516001600160e01b03168388015260409096019590820190600101610e6a565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b84811015610f4357858303601f19018952815180516001600160401b0390811685528582015160a08787018190529190610f0783880182610daa565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101610ecb565b5090979650505050505050565b60008151808452602080850194506020840160005b83811015610ea3578151805188528301518388015260409096019590820190600101610f65565b602080825282516080838301528051604060a08501819052815160e08601819052600094939284019185916101008801905b80841015610ff957845180516001600160a01b031683528701516001600160e01b031687830152938601936001939093019290820190610fbe565b5093850151878503609f190160c0890152936110158186610e55565b945050505050818501519150601f19808583030160408601526110388284610eae565b92506040860151915080858403016060860152506110568282610f50565b915050606084015160808401528091505092915050565b60006004841061108d57634e487b7160e01b600052602160045260246000fd5b83825260406020830152610e406040830184610daa565b6001600160401b038181168382160190808211156110d257634e487b7160e01b600052601160045260246000fd5b5092915050565b600082825180855260208086019550808260051b84010181860160005b84811015610f4357858303601f19018952815180516001600160a01b031684528481015160a08686018190529061112f82870182610daa565b915050604080830151868303828801526111498382610daa565b925050506060808301518187015250608080830151925085820381870152506111728183610daa565b9a86019a94505050908301906001016110f6565b602081526111d3602082018351805182526020808201516001600160401b039081169184019190915260408083015182169084015260608083015182169084015260809182015116910152565b600060208301516111e760c0840182610e48565b5060408301516101a08060e08501526112046101c0850183610daa565b91506060850151601f196101008187860301818801526112248584610daa565b94506080880151925081878603016101208801526112428584610daa565b945060a08801519250611259610140880184610e48565b60c088015161016088015260e088015161018088015287015186850390910183870152905061128883826110d9565b9695505050505050565b600181811c908216806112a657607f821691505b6020821081036112c657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611318576000816000526020600020601f850160051c810160208610156112f55750805b601f850160051c820191505b8181101561131457828155600101611301565b5050505b505050565b81516001600160401b03811115611336576113366103ef565b61134a816113448454611292565b846112cc565b602080601f83116001811461137f57600084156113675750858301515b600019600386901b1c1916600185901b178555611314565b600085815260208120601f198616915b828110156113ae5788860151825594840194600190910190840161138f565b50858210156113cc5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000818000a",
}
var CCIPReaderTesterABI = CCIPReaderTesterMetaData.ABI
@@ -751,7 +752,7 @@ func (_CCIPReaderTester *CCIPReaderTester) ParseLog(log types.Log) (generated.Ab
}
func (CCIPReaderTesterCCIPSendRequested) Topic() common.Hash {
- return common.HexToHash("0xe07a589f12eccf1bc0f7421666687a6986a0c8dbbdc877d1af562a97ba60ecfd")
+ return common.HexToHash("0x273f5ec254c4821d9795f26fddd245b3658bf1126d45d9d1c13a1d18a4c77750")
}
func (CCIPReaderTesterCommitReportAccepted) Topic() common.Hash {
diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/onramp/onramp.go
index 25dd768201..71d25dec61 100644
--- a/core/gethwrappers/ccip/generated/onramp/onramp.go
+++ b/core/gethwrappers/ccip/generated/onramp/onramp.go
@@ -51,6 +51,7 @@ type InternalEVM2AnyRampMessage struct {
ExtraArgs []byte
FeeToken common.Address
FeeTokenAmount *big.Int
+ FeeValueJuels *big.Int
TokenAmounts []InternalEVM2AnyTokenTransfer
}
@@ -98,8 +99,8 @@ type OnRampStaticConfig struct {
}
var OnRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"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\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"}],\"name\":\"FeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeTokenWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\"}],\"internalType\":\"structOnRamp.AllowListConfigArgs[]\",\"name\":\"allowListConfigArgsItems\",\"type\":\"tuple[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b506040516200429a3803806200429a83398101604081905262000035916200073f565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d81620003e0565b50505062000840565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060608101516001600160a01b0316155b8062000261575080602001515b1562000280576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191620003d591849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b81518110156200051f5760008282815181106200040457620004046200082a565b6020026020010151905060008383815181106200042557620004256200082a565b6020026020010151600001519050806001600160401b03166000036200046a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050620003e3565b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200055e576200055e62000523565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200058f576200058f62000523565b604052919050565b80516001600160401b0381168114620005af57600080fd5b919050565b6001600160a01b0381168114620005ca57600080fd5b50565b600060a08284031215620005e057600080fd5b60405160a081016001600160401b038111828210171562000605576200060562000523565b806040525080915082516200061a81620005b4565b8152602083015180151581146200063057600080fd5b602082015260408301516200064581620005b4565b604082015260608301516200065a81620005b4565b606082015260808301516200066f81620005b4565b6080919091015292915050565b600082601f8301126200068e57600080fd5b815160206001600160401b03821115620006ac57620006ac62000523565b620006bc818360051b0162000564565b82815260069290921b84018101918181019086841115620006dc57600080fd5b8286015b84811015620007345760408189031215620006fb5760008081fd5b6200070562000539565b620007108262000597565b8152848201516200072181620005b4565b81860152835291830191604001620006e0565b509695505050505050565b60008060008385036101408112156200075757600080fd5b60808112156200076657600080fd5b50604051608081016001600160401b0380821183831017156200078d576200078d62000523565b816040526200079c8762000597565b835260208701519150620007b082620005b4565b81602084015260408701519150620007c882620005b4565b81604084015260608701519150620007e082620005b4565b816060840152829550620007f88860808901620005cd565b94506101208701519250808311156200081057600080fd5b505062000820868287016200067c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e0516139e1620008b96000396000818161022c01528181610cfd0152611c3f0152600081816101f00152818161163a0152611c180152600081816101b4015281816106080152611bee0152600081816101840152818161114b015281816117550152611bca01526139e16000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e914610557578063f2fde38b1461056a578063fbca3b741461057d57600080fd5b8063972b4612146104ea578063d77d5ed01461050a57600080fd5b80637437ff9f146103ee57806379ba5097146104985780638da5cb5b146104a05780639041be3d146104be57600080fd5b806327e936f1116101095780633a019940116100ee5780633a0199401461030f57806348a98aa4146103175780636def4ce71461034f57600080fd5b806327e936f1146102e957806334adf494146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e610149366004612837565b610590565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161027691906128fa565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b60405161027691906129bf565b6102db6102d63660046129ea565b6105a4565b604051908152602001610276565b61014e6102f7366004612a58565b61075d565b61014e61030a366004612af0565b61076e565b61014e610a8a565b61032a610325366004612b65565b610cb5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b6103b261035d366004612b9e565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61048b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102769190612bbb565b61014e610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff1661032a565b6104d16104cc366004612b9e565b610e67565b60405167ffffffffffffffff9091168152602001610276565b6104fd6104f8366004612b9e565b610e90565b6040516102769190612c14565b61032a610518366004612b9e565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db610565366004612c6e565b610eb8565b61014e610578366004612cda565b611832565b6104fd61058b366004612b9e565b611843565b610598611877565b6105a1816118fa565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612cf7565b156106bb576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906107139086908690600401612e28565b602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612f71565b90505b92915050565b610765611877565b6105a181611a71565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107de5760055473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a855760008383838181106107fd576107fd612f8a565b905060200281019061080f9190612fb9565b6108189061306a565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909116178155908201515191925090156109d8578160200151156109975760005b826040015151811015610947576000836040015182815181106108b1576108b1612f8a565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109305783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b61093d6001840182611ca1565b505060010161088c565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161098a9190612c14565b60405180910390a26109d8565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b60005b826060015151811015610a2457610a1b83606001518281518110610a0157610a01612f8a565b602002602001015183600101611cc390919063ffffffff16565b506001016109db565b5060608201515115610a7b57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610a729190612c14565b60405180910390a25b50506001016107e1565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f919081019061311b565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a85576000838281518110610b7b57610b7b612f8a565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612f71565b90508015610cab57610c4373ffffffffffffffffffffffffffffffffffffffff83168583611ce5565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610ca291815260200190565b60405180910390a35b5050600101610b5e565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075491906131aa565b60015473ffffffffffffffffffffffffffffffffffffffff163314610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106b2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff8082166000908152600660205260408120549091610757911660016131f6565b67ffffffffffffffff8116600090815260066020526040902060609061075790600101611d72565b60025460009074010000000000000000000000000000000000000000900460ff1615610f10576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610fb5576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff161561102657610fd86001820184611d86565b611026576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016106b2565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611083576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff168015611129576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e506906110f6908a908a90600401612e28565b600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050505b50604080516101a081019091526000610100820181815267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166101208501528981166101408501528454929392839291610160840191879187916111979116613217565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187806020019061120b919061323e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161124f888061323e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016112ab6080890160608a01612cda565b73ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018780604001906112dc91906132a3565b905067ffffffffffffffff8111156112f6576112f6612734565b60405190808252806020026020018201604052801561136f57816020015b61135c6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8152602001906001900390816113145790505b5090529050600061138360408801886132a3565b808060200260200160405190810160405280939291908181526020016000905b828210156113cf576113c06040830286013681900381019061330b565b815260200190600101906113a3565b5050505050905060005b6113e660408901896132a3565b905081101561147f5761145682828151811061140457611404612f8a565b60209081029190910101518a61141a8b8061323e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611db5915050565b8360e00151828151811061146c5761146c612f8a565b60209081029190910101526001016113d9565b50600080600080600260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663430d138c8d8d60600160208101906114db9190612cda565b8d8f80608001906114ec919061323e565b8c60e001518c6040518863ffffffff1660e01b81526004016115149796959493929190613428565b600060405180830381865afa158015611531573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611577919081019061355a565b9296509094509250905061159160808c0160608d01612cda565b73ffffffffffffffffffffffffffffffffffffffff167f075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f856040516115d891815260200190565b60405180910390a2826116ac576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8d16600482015273ffffffffffffffffffffffffffffffffffffffff8a811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af1158015611683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a7919061364d565b6116af565b60005b865167ffffffffffffffff909116608091820152860182905260005b8660e001515181101561171f578181815181106116ea576116ea612f8a565b60200260200101518760e00151828151811061170857611708612f8a565b6020908102919091010151608001526001016116cb565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908d1660608201523060808201526117af90879060a001604051602081830303815290604052805190602001206120cc565b86515260405167ffffffffffffffff8d16907f9f4bd3af5ec85ce7c750c95aca08cf5460a4a3f952cf1db9c2bbf22cdfe78bbf906117ee90899061366a565b60405180910390a25050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050905151925050505b949350505050565b61183a611877565b6105a18161221d565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146118f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106b2565b565b60005b8151811015611a6d57600082828151811061191a5761191a612f8a565b60200260200101519050600083838151811061193857611938612f8a565b60200260200101516000015190508067ffffffffffffffff16600003611996576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106b2565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a25050508060010190506118fd565b5050565b805173ffffffffffffffffffffffffffffffffffffffff161580611aad5750606081015173ffffffffffffffffffffffffffffffffffffffff16155b80611ab9575080602001515b15611af0576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611c969184906137b8565b60405180910390a150565b60006107548373ffffffffffffffffffffffffffffffffffffffff8416612312565b60006107548373ffffffffffffffffffffffffffffffffffffffff8416612361565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a8590849061245b565b60606000611d7f83612567565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610754565b611dfd6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611e3b576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e4b858760000151610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81161580611f1b57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f199190612cf7565b155b15611f6d5785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016106b2565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b815260040161200c9190613866565b6000604051808303816000875af115801561202b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261207191908101906138dc565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c0015160405160200161214a95949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b604051602081830303815290604052805190602001208560600151805190602001208660400151805190602001208760e0015160405160200161218d919061396d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff82160361229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260018301602052604081205461235957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610757565b506000610757565b6000818152600183016020526040812054801561244a576000612385600183613980565b855490915060009061239990600190613980565b90508082146123fe5760008660000182815481106123b9576123b9612f8a565b90600052602060002001549050808760000184815481106123dc576123dc612f8a565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061240f5761240f613993565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610757565b6000915050610757565b5092915050565b60006124bd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125c39092919063ffffffff16565b805190915015610a8557808060200190518101906124db9190612cf7565b610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106b2565b6060816000018054806020026020016040519081016040528092919081815260200182805480156125b757602002820191906000526020600020905b8154815260200190600101908083116125a3575b50505050509050919050565b606061182a8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125f791906139c2565b60006040518083038185875af1925050503d8060008114612634576040519150601f19603f3d011682016040523d82523d6000602084013e612639565b606091505b509150915061264a87838387612655565b979650505050505050565b606083156126eb5782516000036126e45773ffffffffffffffffffffffffffffffffffffffff85163b6126e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b2565b508161182a565b61182a83838151156127005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b291906129bf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561278657612786612734565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127d3576127d3612734565b604052919050565b600067ffffffffffffffff8211156127f5576127f5612734565b5060051b60200190565b67ffffffffffffffff811681146105a157600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105a157600080fd5b6000602080838503121561284a57600080fd5b823567ffffffffffffffff81111561286157600080fd5b8301601f8101851361287257600080fd5b8035612885612880826127db565b61278c565b81815260069190911b820183019083810190878311156128a457600080fd5b928401925b8284101561264a57604084890312156128c25760008081fd5b6128ca612763565b84356128d5816127ff565b8152848601356128e481612815565b81870152825260409390930192908401906128a9565b60808101610757828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b8381101561296c578181015183820152602001612954565b50506000910152565b6000815180845261298d816020860160208601612951565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107546020830184612975565b600060a082840312156129e457600080fd5b50919050565b600080604083850312156129fd57600080fd5b8235612a08816127ff565b9150602083013567ffffffffffffffff811115612a2457600080fd5b612a30858286016129d2565b9150509250929050565b8035612a4581612815565b919050565b80151581146105a157600080fd5b600060a08284031215612a6a57600080fd5b60405160a0810181811067ffffffffffffffff82111715612a8d57612a8d612734565b6040528235612a9b81612815565b81526020830135612aab81612a4a565b60208201526040830135612abe81612815565b60408201526060830135612ad181612815565b60608201526080830135612ae481612815565b60808201529392505050565b60008060208385031215612b0357600080fd5b823567ffffffffffffffff80821115612b1b57600080fd5b818501915085601f830112612b2f57600080fd5b813581811115612b3e57600080fd5b8660208260051b8501011115612b5357600080fd5b60209290920196919550909350505050565b60008060408385031215612b7857600080fd5b8235612b83816127ff565b91506020830135612b9381612815565b809150509250929050565b600060208284031215612bb057600080fd5b8135611d7f816127ff565b60a08101610757828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b6020808252825182820181905260009190848201906040850190845b81811015612c6257835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612c30565b50909695505050505050565b60008060008060808587031215612c8457600080fd5b8435612c8f816127ff565b9350602085013567ffffffffffffffff811115612cab57600080fd5b612cb7878288016129d2565b935050604085013591506060850135612ccf81612815565b939692955090935050565b600060208284031215612cec57600080fd5b8135611d7f81612815565b600060208284031215612d0957600080fd5b8151611d7f81612a4a565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612d4957600080fd5b830160208101925035905067ffffffffffffffff811115612d6957600080fd5b803603821315612d7857600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612e1d578135612deb81612815565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612dd8565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612e498485612d14565b60a06040860152612e5e60e086018284612d7f565b915050612e6e6020860186612d14565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612ea4848385612d7f565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612edd57600080fd5b60209288019283019235915084821115612ef657600080fd5b8160061b3603831315612f0857600080fd5b80878503016080880152612f1d848385612dc8565b9450612f2b60608901612a3a565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612f566080890189612d14565b94509250808786030160c0880152505061264a838383612d7f565b600060208284031215612f8357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612fed57600080fd5b9190910192915050565b600082601f83011261300857600080fd5b81356020613018612880836127db565b8083825260208201915060208460051b87010193508684111561303a57600080fd5b602086015b8481101561305f57803561305281612815565b835291830191830161303f565b509695505050505050565b60006080823603121561307c57600080fd5b6040516080810167ffffffffffffffff82821081831117156130a0576130a0612734565b81604052843591506130b1826127ff565b9082526020840135906130c382612a4a565b81602084015260408501359150808211156130dd57600080fd5b6130e936838701612ff7565b6040840152606085013591508082111561310257600080fd5b5061310f36828601612ff7565b60608301525092915050565b6000602080838503121561312e57600080fd5b825167ffffffffffffffff81111561314557600080fd5b8301601f8101851361315657600080fd5b8051613164612880826127db565b81815260059190911b8201830190838101908783111561318357600080fd5b928401925b8284101561264a57835161319b81612815565b82529284019290840190613188565b6000602082840312156131bc57600080fd5b8151611d7f81612815565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115612454576124546131c7565b600067ffffffffffffffff808316818103613234576132346131c7565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261327357600080fd5b83018035915067ffffffffffffffff82111561328e57600080fd5b602001915036819003821315612d7857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132d857600080fd5b83018035915067ffffffffffffffff8211156132f357600080fd5b6020019150600681901b3603821315612d7857600080fd5b60006040828403121561331d57600080fd5b613325612763565b823561333081612815565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b8481101561341b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff82511685528582015181878701526133c482870182612975565b915050604080830151868303828801526133de8382612975565b925050506060808301518187015250608080830151925085820381870152506134078183612975565b9a86019a9450505090830190600101613362565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c0606086015261347260c08601898b612d7f565b85810360808701526134848189613345565b86810360a0880152875180825285890192509085019060005b818110156134c457835180518716845287015187840152928601929184019160010161349d565b50909e9d5050505050505050505050505050565b600082601f8301126134e957600080fd5b815167ffffffffffffffff81111561350357613503612734565b61353460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161278c565b81815284602083860101111561354957600080fd5b61182a826020830160208701612951565b6000806000806080858703121561357057600080fd5b8451935060208086015161358381612a4a565b604087015190945067ffffffffffffffff808211156135a157600080fd5b6135ad89838a016134d8565b945060608801519150808211156135c357600080fd5b818801915088601f8301126135d757600080fd5b81516135e5612880826127db565b81815260059190911b8301840190848101908b83111561360457600080fd5b8585015b8381101561363c578051858111156136205760008081fd5b61362e8e89838a01016134d8565b845250918601918601613608565b50989b979a50959850505050505050565b60006020828403121561365f57600080fd5b8151611d7f816127ff565b602081526136bb60208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b600060208301516136e460c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101808060e08501526137016101a0850183612975565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808685030161010087015261373e8483612975565b935060808701519150808685030161012087015261375c8483612975565b935060a0870151915061378861014087018373ffffffffffffffffffffffffffffffffffffffff169052565b60c087015161016087015260e08701519150808685030183870152506137ae8382613345565b9695505050505050565b6101208101613810828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611d7f565b602081526000825160a0602084015261388260c0840182612975565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b6000602082840312156138ee57600080fd5b815167ffffffffffffffff8082111561390657600080fd5b908301906040828603121561391a57600080fd5b613922612763565b82518281111561393157600080fd5b61393d878286016134d8565b82525060208301518281111561395257600080fd5b61395e878286016134d8565b60208301525095945050505050565b6020815260006107546020830184613345565b81810381811115610757576107576131c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612fed81846020870161295156fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\"},{\"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\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101006040523480156200001257600080fd5b506040516200422f3803806200422f83398101604081905262000035916200073f565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d81620003e0565b50505062000840565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060608101516001600160a01b0316155b8062000261575080602001515b1562000280576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191620003d591849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b81518110156200051f5760008282815181106200040457620004046200082a565b6020026020010151905060008383815181106200042557620004256200082a565b6020026020010151600001519050806001600160401b03166000036200046a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050620003e3565b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200055e576200055e62000523565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200058f576200058f62000523565b604052919050565b80516001600160401b0381168114620005af57600080fd5b919050565b6001600160a01b0381168114620005ca57600080fd5b50565b600060a08284031215620005e057600080fd5b60405160a081016001600160401b038111828210171562000605576200060562000523565b806040525080915082516200061a81620005b4565b8152602083015180151581146200063057600080fd5b602082015260408301516200064581620005b4565b604082015260608301516200065a81620005b4565b606082015260808301516200066f81620005b4565b6080919091015292915050565b600082601f8301126200068e57600080fd5b815160206001600160401b03821115620006ac57620006ac62000523565b620006bc818360051b0162000564565b82815260069290921b84018101918181019086841115620006dc57600080fd5b8286015b84811015620007345760408189031215620006fb5760008081fd5b6200070562000539565b620007108262000597565b8152848201516200072181620005b4565b81860152835291830191604001620006e0565b509695505050505050565b60008060008385036101408112156200075757600080fd5b60808112156200076657600080fd5b50604051608081016001600160401b0380821183831017156200078d576200078d62000523565b816040526200079c8762000597565b835260208701519150620007b082620005b4565b81602084015260408701519150620007c882620005b4565b81604084015260608701519150620007e082620005b4565b816060840152829550620007f88860808901620005cd565b94506101208701519250808311156200081057600080fd5b505062000820868287016200067c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051613976620008b96000396000818161022c01528181610cfd0152611bc90152600081816101f0015281816115c40152611ba20152600081816101b4015281816106080152611b780152600081816101840152818161114b015281816116e10152611b5401526139766000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e914610557578063f2fde38b1461056a578063fbca3b741461057d57600080fd5b8063972b4612146104ea578063d77d5ed01461050a57600080fd5b80637437ff9f146103ee57806379ba5097146104985780638da5cb5b146104a05780639041be3d146104be57600080fd5b806327e936f1116101095780633a019940116100ee5780633a0199401461030f57806348a98aa4146103175780636def4ce71461034f57600080fd5b806327e936f1146102e957806334adf494146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e6101493660046127c2565b610590565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102769190612885565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b604051610276919061294a565b6102db6102d6366004612975565b6105a4565b604051908152602001610276565b61014e6102f73660046129e3565b61075d565b61014e61030a366004612a7b565b61076e565b61014e610a8a565b61032a610325366004612af0565b610cb5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b6103b261035d366004612b29565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61048b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102769190612b46565b61014e610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff1661032a565b6104d16104cc366004612b29565b610e67565b60405167ffffffffffffffff9091168152602001610276565b6104fd6104f8366004612b29565b610e90565b6040516102769190612b9f565b61032a610518366004612b29565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db610565366004612bf9565b610eb8565b61014e610578366004612c65565b6117bc565b6104fd61058b366004612b29565b6117cd565b610598611801565b6105a181611884565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612c82565b156106bb576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906107139086908690600401612db3565b602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612efc565b90505b92915050565b610765611801565b6105a1816119fb565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107de5760055473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a855760008383838181106107fd576107fd612f15565b905060200281019061080f9190612f44565b61081890612ff5565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909116178155908201515191925090156109d8578160200151156109975760005b826040015151811015610947576000836040015182815181106108b1576108b1612f15565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109305783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b61093d6001840182611c2b565b505060010161088c565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161098a9190612b9f565b60405180910390a26109d8565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b60005b826060015151811015610a2457610a1b83606001518281518110610a0157610a01612f15565b602002602001015183600101611c4d90919063ffffffff16565b506001016109db565b5060608201515115610a7b57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610a729190612b9f565b60405180910390a25b50506001016107e1565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f91908101906130a6565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a85576000838281518110610b7b57610b7b612f15565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612efc565b90508015610cab57610c4373ffffffffffffffffffffffffffffffffffffffff83168583611c6f565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610ca291815260200190565b60405180910390a35b5050600101610b5e565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190613135565b60015473ffffffffffffffffffffffffffffffffffffffff163314610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106b2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff808216600090815260066020526040812054909161075791166001613181565b67ffffffffffffffff8116600090815260066020526040902060609061075790600101611cfc565b60025460009074010000000000000000000000000000000000000000900460ff1615610f10576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610fb5576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff161561102657610fd86001820184611d10565b611026576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016106b2565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611083576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff168015611129576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e506906110f6908a908a90600401612db3565b600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050505b50604080516101c081019091526000610120820181815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811661014085015289811661016085015284549293928392916101808401918791879161119791166131a2565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187806020019061120b91906131c9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161124f88806131c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016112ab6080890160608a01612c65565b73ffffffffffffffffffffffffffffffffffffffff168152602001868152602001600081526020018780604001906112e3919061322e565b905067ffffffffffffffff8111156112fd576112fd6126bf565b60405190808252806020026020018201604052801561137657816020015b6113636040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b81526020019060019003908161131b5790505b5090529050600061138a604088018861322e565b808060200260200160405190810160405280939291908181526020016000905b828210156113d6576113c760408302860136819003810190613296565b815260200190600101906113aa565b5050505050905060005b6113ed604089018961322e565b90508110156114875761145d82828151811061140b5761140b612f15565b60209081029190910101518a6114218b806131c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611d3f915050565b836101000151828151811061147457611474612f15565b60209081029190910101526001016113e0565b50600254600090606090819073ffffffffffffffffffffffffffffffffffffffff1663430d138c8c6114be60808e018e8601612c65565b8c8e80608001906114cf91906131c9565b8b61010001518b6040518863ffffffff1660e01b81526004016114f897969594939291906133b3565b600060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155b91908101906134e5565b60e08901939093529094509250905082611636576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163191906135d8565b611639565b60005b855167ffffffffffffffff909116608091820152850182905260005b856101000151518110156116ab5781818151811061167557611675612f15565b6020026020010151866101000151828151811061169457611694612f15565b602090810291909101015160800152600101611655565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c16606082015230608082015261173b90869060a00160405160208183030381529060405280519060200120612056565b85515260405167ffffffffffffffff8c16907f8cd775d4a25bd349439a70817fd110144d6ab229ae1b9f54a1e5777d2041bfed9061177a9088906135f5565b60405180910390a25050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505051519150505b949350505050565b6117c4611801565b6105a1816121a8565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106b2565b565b60005b81518110156119f75760008282815181106118a4576118a4612f15565b6020026020010151905060008383815181106118c2576118c2612f15565b60200260200101516000015190508067ffffffffffffffff16600003611920576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106b2565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611887565b5050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a375750606081015173ffffffffffffffffffffffffffffffffffffffff16155b80611a43575080602001515b15611a7a576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611c2091849061374d565b60405180910390a150565b60006107548373ffffffffffffffffffffffffffffffffffffffff841661229d565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122ec565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a859084906123e6565b60606000611d09836124f2565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610754565b611d876040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611dc5576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dd5858760000151610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81161580611ea557506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea39190612c82565b155b15611ef75785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016106b2565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611f9691906137fb565b6000604051808303816000875af1158015611fb5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ffb9190810190613871565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c001516040516020016120d495949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b604051602081830303815290604052805190602001208560600151805190602001208660400151805190602001208761010001516040516020016121189190613902565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff821603612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546122e457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610757565b506000610757565b600081815260018301602052604081205480156123d5576000612310600183613915565b855490915060009061232490600190613915565b905080821461238957600086600001828154811061234457612344612f15565b906000526020600020015490508087600001848154811061236757612367612f15565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061239a5761239a613928565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610757565b6000915050610757565b5092915050565b6000612448826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661254e9092919063ffffffff16565b805190915015610a8557808060200190518101906124669190612c82565b610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106b2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561254257602002820191906000526020600020905b81548152602001906001019080831161252e575b50505050509050919050565b60606117b48484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125829190613957565b60006040518083038185875af1925050503d80600081146125bf576040519150601f19603f3d011682016040523d82523d6000602084013e6125c4565b606091505b50915091506125d5878383876125e0565b979650505050505050565b6060831561267657825160000361266f5773ffffffffffffffffffffffffffffffffffffffff85163b61266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b2565b50816117b4565b6117b4838381511561268b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b2919061294a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612711576127116126bf565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561275e5761275e6126bf565b604052919050565b600067ffffffffffffffff821115612780576127806126bf565b5060051b60200190565b67ffffffffffffffff811681146105a157600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105a157600080fd5b600060208083850312156127d557600080fd5b823567ffffffffffffffff8111156127ec57600080fd5b8301601f810185136127fd57600080fd5b803561281061280b82612766565b612717565b81815260069190911b8201830190838101908783111561282f57600080fd5b928401925b828410156125d5576040848903121561284d5760008081fd5b6128556126ee565b84356128608161278a565b81528486013561286f816127a0565b8187015282526040939093019290840190612834565b60808101610757828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156128f75781810151838201526020016128df565b50506000910152565b600081518084526129188160208601602086016128dc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107546020830184612900565b600060a0828403121561296f57600080fd5b50919050565b6000806040838503121561298857600080fd5b82356129938161278a565b9150602083013567ffffffffffffffff8111156129af57600080fd5b6129bb8582860161295d565b9150509250929050565b80356129d0816127a0565b919050565b80151581146105a157600080fd5b600060a082840312156129f557600080fd5b60405160a0810181811067ffffffffffffffff82111715612a1857612a186126bf565b6040528235612a26816127a0565b81526020830135612a36816129d5565b60208201526040830135612a49816127a0565b60408201526060830135612a5c816127a0565b60608201526080830135612a6f816127a0565b60808201529392505050565b60008060208385031215612a8e57600080fd5b823567ffffffffffffffff80821115612aa657600080fd5b818501915085601f830112612aba57600080fd5b813581811115612ac957600080fd5b8660208260051b8501011115612ade57600080fd5b60209290920196919550909350505050565b60008060408385031215612b0357600080fd5b8235612b0e8161278a565b91506020830135612b1e816127a0565b809150509250929050565b600060208284031215612b3b57600080fd5b8135611d098161278a565b60a08101610757828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b6020808252825182820181905260009190848201906040850190845b81811015612bed57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bbb565b50909695505050505050565b60008060008060808587031215612c0f57600080fd5b8435612c1a8161278a565b9350602085013567ffffffffffffffff811115612c3657600080fd5b612c428782880161295d565b935050604085013591506060850135612c5a816127a0565b939692955090935050565b600060208284031215612c7757600080fd5b8135611d09816127a0565b600060208284031215612c9457600080fd5b8151611d09816129d5565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612cd457600080fd5b830160208101925035905067ffffffffffffffff811115612cf457600080fd5b803603821315612d0357600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612da8578135612d76816127a0565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612d63565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612dd48485612c9f565b60a06040860152612de960e086018284612d0a565b915050612df96020860186612c9f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612e2f848385612d0a565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612e6857600080fd5b60209288019283019235915084821115612e8157600080fd5b8160061b3603831315612e9357600080fd5b80878503016080880152612ea8848385612d53565b9450612eb6606089016129c5565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612ee16080890189612c9f565b94509250808786030160c088015250506125d5838383612d0a565b600060208284031215612f0e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612f7857600080fd5b9190910192915050565b600082601f830112612f9357600080fd5b81356020612fa361280b83612766565b8083825260208201915060208460051b870101935086841115612fc557600080fd5b602086015b84811015612fea578035612fdd816127a0565b8352918301918301612fca565b509695505050505050565b60006080823603121561300757600080fd5b6040516080810167ffffffffffffffff828210818311171561302b5761302b6126bf565b816040528435915061303c8261278a565b90825260208401359061304e826129d5565b816020840152604085013591508082111561306857600080fd5b61307436838701612f82565b6040840152606085013591508082111561308d57600080fd5b5061309a36828601612f82565b60608301525092915050565b600060208083850312156130b957600080fd5b825167ffffffffffffffff8111156130d057600080fd5b8301601f810185136130e157600080fd5b80516130ef61280b82612766565b81815260059190911b8201830190838101908783111561310e57600080fd5b928401925b828410156125d5578351613126816127a0565b82529284019290840190613113565b60006020828403121561314757600080fd5b8151611d09816127a0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156123df576123df613152565b600067ffffffffffffffff8083168181036131bf576131bf613152565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126131fe57600080fd5b83018035915067ffffffffffffffff82111561321957600080fd5b602001915036819003821315612d0357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261326357600080fd5b83018035915067ffffffffffffffff82111561327e57600080fd5b6020019150600681901b3603821315612d0357600080fd5b6000604082840312156132a857600080fd5b6132b06126ee565b82356132bb816127a0565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b848110156133a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff825116855285820151818787015261334f82870182612900565b915050604080830151868303828801526133698382612900565b925050506060808301518187015250608080830151925085820381870152506133928183612900565b9a86019a94505050908301906001016132ed565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c060608601526133fd60c08601898b612d0a565b858103608087015261340f81896132d0565b86810360a0880152875180825285890192509085019060005b8181101561344f578351805187168452870151878401529286019291840191600101613428565b50909e9d5050505050505050505050505050565b600082601f83011261347457600080fd5b815167ffffffffffffffff81111561348e5761348e6126bf565b6134bf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612717565b8181528460208386010111156134d457600080fd5b6117b48260208301602087016128dc565b600080600080608085870312156134fb57600080fd5b8451935060208086015161350e816129d5565b604087015190945067ffffffffffffffff8082111561352c57600080fd5b61353889838a01613463565b9450606088015191508082111561354e57600080fd5b818801915088601f83011261356257600080fd5b815161357061280b82612766565b81815260059190911b8301840190848101908b83111561358f57600080fd5b8585015b838110156135c7578051858111156135ab5760008081fd5b6135b98e89838a0101613463565b845250918601918601613593565b50989b979a50959850505050505050565b6000602082840312156135ea57600080fd5b8151611d098161278a565b6020815261364660208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161366f60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e085015261368c6101c0850183612900565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101008187860301818801526136ca8584612900565b94506080880151925081878603016101208801526136e88584612900565b945060a0880151925061371461014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e088015161018088015287015186850390910183870152905061374383826132d0565b9695505050505050565b61012081016137a5828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611d09565b602081526000825160a0602084015261381760c0840182612900565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b60006020828403121561388357600080fd5b815167ffffffffffffffff8082111561389b57600080fd5b90830190604082860312156138af57600080fd5b6138b76126ee565b8251828111156138c657600080fd5b6138d287828601613463565b8252506020830151828111156138e757600080fd5b6138f387828601613463565b60208301525095945050505050565b60208152600061075460208301846132d0565b8181038181111561075757610757613152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612f788184602087016128dc56fea164736f6c6343000818000a",
}
var OnRampABI = OnRampMetaData.ABI
@@ -1332,134 +1333,6 @@ func (_OnRamp *OnRampFilterer) ParseDestChainConfigSet(log types.Log) (*OnRampDe
return event, nil
}
-type OnRampFeePaidIterator struct {
- Event *OnRampFeePaid
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *OnRampFeePaidIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(OnRampFeePaid)
- 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(OnRampFeePaid)
- 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 *OnRampFeePaidIterator) Error() error {
- return it.fail
-}
-
-func (it *OnRampFeePaidIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type OnRampFeePaid struct {
- FeeToken common.Address
- FeeValueJuels *big.Int
- Raw types.Log
-}
-
-func (_OnRamp *OnRampFilterer) FilterFeePaid(opts *bind.FilterOpts, feeToken []common.Address) (*OnRampFeePaidIterator, error) {
-
- var feeTokenRule []interface{}
- for _, feeTokenItem := range feeToken {
- feeTokenRule = append(feeTokenRule, feeTokenItem)
- }
-
- logs, sub, err := _OnRamp.contract.FilterLogs(opts, "FeePaid", feeTokenRule)
- if err != nil {
- return nil, err
- }
- return &OnRampFeePaidIterator{contract: _OnRamp.contract, event: "FeePaid", logs: logs, sub: sub}, nil
-}
-
-func (_OnRamp *OnRampFilterer) WatchFeePaid(opts *bind.WatchOpts, sink chan<- *OnRampFeePaid, feeToken []common.Address) (event.Subscription, error) {
-
- var feeTokenRule []interface{}
- for _, feeTokenItem := range feeToken {
- feeTokenRule = append(feeTokenRule, feeTokenItem)
- }
-
- logs, sub, err := _OnRamp.contract.WatchLogs(opts, "FeePaid", feeTokenRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(OnRampFeePaid)
- if err := _OnRamp.contract.UnpackLog(event, "FeePaid", 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 (_OnRamp *OnRampFilterer) ParseFeePaid(log types.Log) (*OnRampFeePaid, error) {
- event := new(OnRampFeePaid)
- if err := _OnRamp.contract.UnpackLog(event, "FeePaid", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
type OnRampFeeTokenWithdrawnIterator struct {
Event *OnRampFeeTokenWithdrawn
@@ -1889,8 +1762,6 @@ func (_OnRamp *OnRamp) ParseLog(log types.Log) (generated.AbigenLog, error) {
return _OnRamp.ParseConfigSet(log)
case _OnRamp.abi.Events["DestChainConfigSet"].ID:
return _OnRamp.ParseDestChainConfigSet(log)
- case _OnRamp.abi.Events["FeePaid"].ID:
- return _OnRamp.ParseFeePaid(log)
case _OnRamp.abi.Events["FeeTokenWithdrawn"].ID:
return _OnRamp.ParseFeeTokenWithdrawn(log)
case _OnRamp.abi.Events["OwnershipTransferRequested"].ID:
@@ -1916,7 +1787,7 @@ func (OnRampAllowListSendersRemoved) Topic() common.Hash {
}
func (OnRampCCIPMessageSent) Topic() common.Hash {
- return common.HexToHash("0x9f4bd3af5ec85ce7c750c95aca08cf5460a4a3f952cf1db9c2bbf22cdfe78bbf")
+ return common.HexToHash("0x8cd775d4a25bd349439a70817fd110144d6ab229ae1b9f54a1e5777d2041bfed")
}
func (OnRampConfigSet) Topic() common.Hash {
@@ -1927,10 +1798,6 @@ func (OnRampDestChainConfigSet) Topic() common.Hash {
return common.HexToHash("0xd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5")
}
-func (OnRampFeePaid) Topic() common.Hash {
- return common.HexToHash("0x075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f")
-}
-
func (OnRampFeeTokenWithdrawn) Topic() common.Hash {
return common.HexToHash("0x508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e")
}
@@ -2022,12 +1889,6 @@ type OnRampInterface interface {
ParseDestChainConfigSet(log types.Log) (*OnRampDestChainConfigSet, error)
- FilterFeePaid(opts *bind.FilterOpts, feeToken []common.Address) (*OnRampFeePaidIterator, error)
-
- WatchFeePaid(opts *bind.WatchOpts, sink chan<- *OnRampFeePaid, feeToken []common.Address) (event.Subscription, error)
-
- ParseFeePaid(log types.Log) (*OnRampFeePaid, error)
-
FilterFeeTokenWithdrawn(opts *bind.FilterOpts, feeAggregator []common.Address, feeToken []common.Address) (*OnRampFeeTokenWithdrawnIterator, error)
WatchFeeTokenWithdrawn(opts *bind.WatchOpts, sink chan<- *OnRampFeeTokenWithdrawn, feeAggregator []common.Address, feeToken []common.Address) (event.Subscription, error)
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 4a2054edf2..fca33c5443 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
@@ -6,7 +6,7 @@ burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMint
burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 08ed1235dda921ce8841b26aa18d0c0f36db4884779dd7670857159801b6d597
ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin f67d4a98804a9534a6554da3a57779632d55ad76db5ecc16ade74774769cdd69
ccip_encoding_utils: ../../../contracts/solc/v0.8.24/CCIPEncodingUtils/CCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/CCIPEncodingUtils/CCIPEncodingUtils.bin ebabd5311ad4374df0f2f5cd5640bb58d938d92f5a82962ac4df7b6e5af2c197
-ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 1181c7150062d6f0793beb50cb6b984c7f7adef0b9528ef1b419923fffcfdcac
+ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 32916b41e0070cb6853d558bbff06ab367324fa52cac59893065e8f616ff14f0
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin 274d87db70b643e00ab0a7e7845bb4b791f3b613bfc87708d33fc5a8369e2a41
commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin f7128dcc2ee6dbcbc976288abcc16970ffb19b59412c5202ef6b259d2007f801
ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
@@ -25,7 +25,7 @@ multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Help
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin d507c3ac70a7d1033b75151c1e5b854b41aaee164dfaa3e5477de400db1aa1f7
offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 941b18b4e2aef977195fefba514e17c9475667e6f8513b18cabfb07ff90136ce
-onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 1f31a62ebb3fa5f4702ee27d4fa86604de5afff56787ef67c8dac764eefd2956
+onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 4f29f05261bdaf9b99e675c1169c0d5cba841b6dd7ca3a8997cc0d3cae7ba850
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b
price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2
registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 75be86323c227917a9bbc3f799d7ed02f92db546653a36db30ed0ebe64461353
From 94ab7f217ff83326aaf005f3da570a2d7814330f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Friedemann=20F=C3=BCrst?=
<59653747+friedemannf@users.noreply.github.com>
Date: Mon, 23 Sep 2024 19:39:16 +0200
Subject: [PATCH 02/32] Change Polygon zkEVM to use FeeHistory estimator
(#14161)
* Change Polygon zkEVM to use SuggestedPriceEstimator
(SHIP-2885)
* Set PriceMin to 1mwei for Polygon zkEVM
* Remove Polygon zkEVM Goerli
* Enable FeeHistory estimator for Polygon zkEVM
* Update PriceMin
* apply suggestions
* Set CacheTimeout to 2 seconds
* Revert back to 5s cachetimeout
* Change timeout to 4 seconds
---------
Co-authored-by: joaoluisam
# Conflicts:
# docs/CONFIG.md
---
.changeset/tender-lemons-obey.md | 5 +
.../toml/defaults/Polygon_Zkevm_Cardona.toml | 10 +-
.../toml/defaults/Polygon_Zkevm_Goerli.toml | 24 ----
.../toml/defaults/Polygon_Zkevm_Mainnet.toml | 10 +-
docs/CONFIG.md | 118 ++----------------
5 files changed, 27 insertions(+), 140 deletions(-)
create mode 100644 .changeset/tender-lemons-obey.md
delete mode 100644 core/chains/evm/config/toml/defaults/Polygon_Zkevm_Goerli.toml
diff --git a/.changeset/tender-lemons-obey.md b/.changeset/tender-lemons-obey.md
new file mode 100644
index 0000000000..2d6cb774b0
--- /dev/null
+++ b/.changeset/tender-lemons-obey.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+Enable FeeHistory estimator for Polygon zkEVM #nops
diff --git a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Cardona.toml b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Cardona.toml
index cd91465dae..46ce80e29f 100644
--- a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Cardona.toml
+++ b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Cardona.toml
@@ -13,12 +13,14 @@ ContractConfirmations = 1
ResendAfterThreshold = '3m'
[GasEstimator]
-PriceMin = '1 mwei'
+Mode = 'FeeHistory'
+# The FeeHistory estimator does not enforce PriceMin, setting it to 0 to not place any limits on the price
+PriceMin = '0'
BumpPercent = 40
-BumpMin = '20 mwei'
-[GasEstimator.BlockHistory]
-BlockHistorySize = 12
+[GasEstimator.FeeHistory]
+# Refresh the suggested price every 4 seconds, to stay slightly below their polling rate of 5s
+CacheTimeout = '4s'
[HeadTracker]
HistoryDepth = 2000
diff --git a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Goerli.toml b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Goerli.toml
deleted file mode 100644
index 6a9b47190f..0000000000
--- a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Goerli.toml
+++ /dev/null
@@ -1,24 +0,0 @@
-ChainID = '1442'
-ChainType = 'zkevm'
-FinalityDepth = 500
-NoNewHeadsThreshold = '12m'
-MinIncomingConfirmations = 1
-LogPollInterval = '30s'
-RPCDefaultBatchSize = 100
-
-[OCR]
-ContractConfirmations = 1
-
-[Transactions]
-ResendAfterThreshold = '3m'
-
-[GasEstimator]
-PriceMin = '50 mwei'
-BumpPercent = 40
-BumpMin = '20 mwei'
-
-[GasEstimator.BlockHistory]
-BlockHistorySize = 12
-
-[HeadTracker]
-HistoryDepth = 2000
diff --git a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Mainnet.toml b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Mainnet.toml
index 79e0cb0fce..2fef7874d1 100644
--- a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Mainnet.toml
+++ b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Mainnet.toml
@@ -14,12 +14,14 @@ ContractConfirmations = 1
ResendAfterThreshold = '3m'
[GasEstimator]
-PriceMin = '100 mwei'
+Mode = 'FeeHistory'
+# The FeeHistory estimator does not enforce PriceMin, setting it to 0 to not place any limits on the price
+PriceMin = '0'
BumpPercent = 40
-BumpMin = '100 mwei'
-[GasEstimator.BlockHistory]
-BlockHistorySize = 12
+[GasEstimator.FeeHistory]
+# Refresh the suggested price every 4 seconds, to stay slightly below their polling rate of 5s
+CacheTimeout = '4s'
[HeadTracker]
# Polygon suffers from a tremendous number of re-orgs, we need to set this to something very large to be conservative enough
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 95743363ab..980635a9fe 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -4652,16 +4652,16 @@ Enabled = false
Enabled = true
[GasEstimator]
-Mode = 'BlockHistory'
+Mode = 'FeeHistory'
PriceDefault = '20 gwei'
PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '100 mwei'
+PriceMin = '0'
LimitDefault = 8000000
LimitMax = 8000000
LimitMultiplier = '1'
LimitTransfer = 21000
EstimateLimit = false
-BumpMin = '100 mwei'
+BumpMin = '5 gwei'
BumpPercent = 40
BumpThreshold = 3
EIP1559DynamicFees = false
@@ -4671,13 +4671,13 @@ TipCapMin = '1 wei'
[GasEstimator.BlockHistory]
BatchSize = 25
-BlockHistorySize = 12
+BlockHistorySize = 8
CheckInclusionBlocks = 12
CheckInclusionPercentile = 90
TransactionPercentile = 60
[GasEstimator.FeeHistory]
-CacheTimeout = '10s'
+CacheTimeout = '4s'
[HeadTracker]
HistoryDepth = 2000
@@ -5005,104 +5005,6 @@ GasLimit = 5400000
-Polygon Zkevm Goerli (1442)
-
-```toml
-AutoCreateKey = true
-BlockBackfillDepth = 10
-BlockBackfillSkip = false
-ChainType = 'zkevm'
-FinalityDepth = 500
-FinalityTagEnabled = false
-LogBackfillBatchSize = 1000
-LogPollInterval = '30s'
-LogKeepBlocksDepth = 100000
-LogPrunePageSize = 10000
-BackupLogPollerBlockDelay = 100
-MinIncomingConfirmations = 1
-MinContractPayment = '0.00001 link'
-NonceAutoSync = true
-NoNewHeadsThreshold = '12m0s'
-RPCDefaultBatchSize = 100
-RPCBlockQueryDelay = 1
-FinalizedBlockOffset = 0
-NoNewFinalizedHeadsThreshold = '0s'
-
-[Transactions]
-ForwardersEnabled = false
-MaxInFlight = 16
-MaxQueued = 250
-ReaperInterval = '1h0m0s'
-ReaperThreshold = '168h0m0s'
-ResendAfterThreshold = '3m0s'
-
-[Transactions.AutoPurge]
-Enabled = false
-
-[BalanceMonitor]
-Enabled = true
-
-[GasEstimator]
-Mode = 'BlockHistory'
-PriceDefault = '20 gwei'
-PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '50 mwei'
-LimitDefault = 8000000
-LimitMax = 8000000
-LimitMultiplier = '1'
-LimitTransfer = 21000
-EstimateLimit = false
-BumpMin = '20 mwei'
-BumpPercent = 40
-BumpThreshold = 3
-EIP1559DynamicFees = false
-FeeCapDefault = '100 gwei'
-TipCapDefault = '1 wei'
-TipCapMin = '1 wei'
-
-[GasEstimator.BlockHistory]
-BatchSize = 25
-BlockHistorySize = 12
-CheckInclusionBlocks = 12
-CheckInclusionPercentile = 90
-TransactionPercentile = 60
-
-[GasEstimator.FeeHistory]
-CacheTimeout = '10s'
-
-[HeadTracker]
-HistoryDepth = 2000
-MaxBufferSize = 3
-SamplingInterval = '1s'
-MaxAllowedFinalityDepth = 10000
-FinalityTagBypass = true
-
-[NodePool]
-PollFailureThreshold = 5
-PollInterval = '10s'
-SelectionMode = 'HighestHead'
-SyncThreshold = 5
-LeaseDuration = '0s'
-NodeIsSyncingEnabled = false
-FinalizedBlockPollInterval = '5s'
-EnforceRepeatableRead = false
-DeathDeclarationDelay = '10s'
-
-[OCR]
-ContractConfirmations = 1
-ContractTransmitterTransmitTimeout = '10s'
-DatabaseTimeout = '10s'
-DeltaCOverride = '168h0m0s'
-DeltaCJitterOverride = '1h0m0s'
-ObservationGracePeriod = '1s'
-
-[OCR2]
-[OCR2.Automation]
-GasLimit = 5400000
-```
-
-
-
Kroma Sepolia (2358)
```toml
@@ -5239,16 +5141,16 @@ Enabled = false
Enabled = true
[GasEstimator]
-Mode = 'BlockHistory'
+Mode = 'FeeHistory'
PriceDefault = '20 gwei'
PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '1 mwei'
+PriceMin = '0'
LimitDefault = 8000000
LimitMax = 8000000
LimitMultiplier = '1'
LimitTransfer = 21000
EstimateLimit = false
-BumpMin = '20 mwei'
+BumpMin = '5 gwei'
BumpPercent = 40
BumpThreshold = 3
EIP1559DynamicFees = false
@@ -5258,13 +5160,13 @@ TipCapMin = '1 wei'
[GasEstimator.BlockHistory]
BatchSize = 25
-BlockHistorySize = 12
+BlockHistorySize = 8
CheckInclusionBlocks = 12
CheckInclusionPercentile = 90
TransactionPercentile = 60
[GasEstimator.FeeHistory]
-CacheTimeout = '10s'
+CacheTimeout = '4s'
[HeadTracker]
HistoryDepth = 2000
From ebc7094c3e722e693ee7dc59f445b65887fbd5be Mon Sep 17 00:00:00 2001
From: Valerii Kabisov <172247313+valerii-kabisov-cll@users.noreply.github.com>
Date: Wed, 25 Sep 2024 00:31:37 +0900
Subject: [PATCH 03/32] =?UTF-8?q?[CCIP-3376]=20Add=20component=20into=20CC?=
=?UTF-8?q?IP=20price=20estimators=20to=20account=20for=20c=E2=80=A6=20(#1?=
=?UTF-8?q?446)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[https://smartcontract-it.atlassian.net/browse/CCIP-3376](https://smartcontract-it.atlassian.net/browse/CCIP-3376)
The CCIP gas limit is set by customers. This cannot be changed because
this limit is directly used within the contracts (which expect limits in
terms of ETH). Also, the L2 gas price returned from our current
estimators for Mantle is in MNT. Therefore, the final formula needed for
CCIP to calculate L2 transaction fees is the following:
gasLimit_EVM * (gasPrice_Mantle * TokenRatio)
Therefore, we need to multiply the gas price returned from our gas
estimators by tokenRatio for CCIP. This should happen in the CCIP price
estimator. Currently, we have no component here for chain-specific
logic, so we will need to add this functionality.
---------
Co-authored-by: Matt Yang
---
.mockery.yaml | 7 +-
.../plugins/ccip/estimatorconfig/config.go | 37 +++++-
.../ccip/estimatorconfig/config_test.go | 64 +++++++++++
.../interceptors/mantle/interceptor.go | 80 +++++++++++++
.../interceptors/mantle/interceptor_test.go | 96 ++++++++++++++++
.../mocks/gas_price_interceptor_mock.go | 106 ++++++++++++++++++
.../ccipdata/commit_store_reader_test.go | 11 +-
.../internal/ccipdata/fee_estimator_config.go | 2 +
.../mocks/fee_estimator_config_mock.go | 71 ++++++++++++
.../plugins/ccip/prices/da_price_estimator.go | 10 +-
.../ccip/prices/da_price_estimator_test.go | 52 ++++++++-
core/services/relay/evm/evm.go | 22 ++++
.../evm/interceptors/mantle/interceptor.go | 80 +++++++++++++
.../interceptors/mantle/interceptor_test.go | 96 ++++++++++++++++
14 files changed, 725 insertions(+), 9 deletions(-)
create mode 100644 core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle/interceptor.go
create mode 100644 core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle/interceptor_test.go
create mode 100644 core/services/ocr2/plugins/ccip/estimatorconfig/mocks/gas_price_interceptor_mock.go
create mode 100644 core/services/relay/evm/interceptors/mantle/interceptor.go
create mode 100644 core/services/relay/evm/interceptors/mantle/interceptor_test.go
diff --git a/.mockery.yaml b/.mockery.yaml
index fa36213ff7..cfe202ac59 100644
--- a/.mockery.yaml
+++ b/.mockery.yaml
@@ -467,7 +467,7 @@ packages:
filename: optimism_portal2_interface.go
outpkg: mock_optimism_portal_2
interfaces:
- OptimismPortal2Interface:
+ OptimismPortal2Interface:
github.com/smartcontractkit/chainlink/v2/core/gethwrappers/liquiditymanager/generated/optimism_dispute_game_factory:
config:
dir: core/gethwrappers/liquiditymanager/mocks/mock_optimism_dispute_game_factory/
@@ -503,6 +503,11 @@ packages:
USDCReader:
config:
filename: usdc_reader_mock.go
+ github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig:
+ interfaces:
+ GasPriceInterceptor:
+ config:
+ filename: gas_price_interceptor_mock.go
github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/batchreader:
config:
filename: token_pool_batched_reader_mock.go
diff --git a/core/services/ocr2/plugins/ccip/estimatorconfig/config.go b/core/services/ocr2/plugins/ccip/estimatorconfig/config.go
index 2eda88d441..0e66f4fb39 100644
--- a/core/services/ocr2/plugins/ccip/estimatorconfig/config.go
+++ b/core/services/ocr2/plugins/ccip/estimatorconfig/config.go
@@ -3,6 +3,7 @@ package estimatorconfig
import (
"context"
"errors"
+ "math/big"
"github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
)
@@ -13,11 +14,18 @@ import (
// fields for the daGasEstimator from the encapsulated onRampReader.
type FeeEstimatorConfigProvider interface {
SetOnRampReader(reader ccip.OnRampReader)
+ AddGasPriceInterceptor(GasPriceInterceptor)
+ ModifyGasPriceComponents(ctx context.Context, execGasPrice, daGasPrice *big.Int) (modExecGasPrice, modDAGasPrice *big.Int, err error)
GetDataAvailabilityConfig(ctx context.Context) (destDataAvailabilityOverheadGas, destGasPerDataAvailabilityByte, destDataAvailabilityMultiplierBps int64, err error)
}
+type GasPriceInterceptor interface {
+ ModifyGasPriceComponents(ctx context.Context, execGasPrice, daGasPrice *big.Int) (modExecGasPrice, modDAGasPrice *big.Int, err error)
+}
+
type FeeEstimatorConfigService struct {
- onRampReader ccip.OnRampReader
+ onRampReader ccip.OnRampReader
+ gasPriceInterceptors []GasPriceInterceptor
}
func NewFeeEstimatorConfigService() *FeeEstimatorConfigService {
@@ -47,3 +55,30 @@ func (c *FeeEstimatorConfigService) GetDataAvailabilityConfig(ctx context.Contex
int64(cfg.DestDataAvailabilityMultiplierBps),
err
}
+
+// AddGasPriceInterceptor adds price interceptors that can modify gas price.
+func (c *FeeEstimatorConfigService) AddGasPriceInterceptor(gpi GasPriceInterceptor) {
+ if gpi != nil {
+ c.gasPriceInterceptors = append(c.gasPriceInterceptors, gpi)
+ }
+}
+
+// ModifyGasPriceComponents applies gasPrice interceptors and returns modified gasPrice.
+func (c *FeeEstimatorConfigService) ModifyGasPriceComponents(ctx context.Context, gasPrice, daGasPrice *big.Int) (*big.Int, *big.Int, error) {
+ if len(c.gasPriceInterceptors) == 0 {
+ return gasPrice, daGasPrice, nil
+ }
+
+ // values are mutable, it is necessary to copy the values to protect the arguments from modification.
+ cpGasPrice := new(big.Int).Set(gasPrice)
+ cpDAGasPrice := new(big.Int).Set(daGasPrice)
+
+ var err error
+ for _, interceptor := range c.gasPriceInterceptors {
+ if cpGasPrice, cpDAGasPrice, err = interceptor.ModifyGasPriceComponents(ctx, cpGasPrice, cpDAGasPrice); err != nil {
+ return nil, nil, err
+ }
+ }
+
+ return cpGasPrice, cpDAGasPrice, nil
+}
diff --git a/core/services/ocr2/plugins/ccip/estimatorconfig/config_test.go b/core/services/ocr2/plugins/ccip/estimatorconfig/config_test.go
index 05226f8b48..0ed7510591 100644
--- a/core/services/ocr2/plugins/ccip/estimatorconfig/config_test.go
+++ b/core/services/ocr2/plugins/ccip/estimatorconfig/config_test.go
@@ -3,10 +3,13 @@ package estimatorconfig_test
import (
"context"
"errors"
+ "math/big"
"testing"
"github.com/stretchr/testify/require"
+ mocks2 "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig/mocks"
+
"github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks"
@@ -43,3 +46,64 @@ func TestFeeEstimatorConfigService(t *testing.T) {
_, _, _, err = svc.GetDataAvailabilityConfig(ctx)
require.Error(t, err)
}
+
+func TestModifyGasPriceComponents(t *testing.T) {
+ t.Run("success modification", func(t *testing.T) {
+ svc := estimatorconfig.NewFeeEstimatorConfigService()
+ ctx := context.Background()
+
+ initialExecGasPrice, initialDaGasPrice := big.NewInt(10), big.NewInt(1)
+
+ gpi1 := mocks2.NewGasPriceInterceptor(t)
+ svc.AddGasPriceInterceptor(gpi1)
+
+ // change in first interceptor
+ firstModExecGasPrice, firstModDaGasPrice := big.NewInt(5), big.NewInt(2)
+ gpi1.On("ModifyGasPriceComponents", ctx, initialExecGasPrice, initialDaGasPrice).
+ Return(firstModExecGasPrice, firstModDaGasPrice, nil)
+
+ gpi2 := mocks2.NewGasPriceInterceptor(t)
+ svc.AddGasPriceInterceptor(gpi2)
+
+ // change in second iterceptor
+ secondModExecGasPrice, secondModDaGasPrice := big.NewInt(50), big.NewInt(20)
+ gpi2.On("ModifyGasPriceComponents", ctx, firstModExecGasPrice, firstModDaGasPrice).
+ Return(secondModExecGasPrice, secondModDaGasPrice, nil)
+
+ // has to return second interceptor values
+ resGasPrice, resDAGasPrice, err := svc.ModifyGasPriceComponents(ctx, initialExecGasPrice, initialDaGasPrice)
+ require.NoError(t, err)
+ require.Equal(t, secondModExecGasPrice.Int64(), resGasPrice.Int64())
+ require.Equal(t, secondModDaGasPrice.Int64(), resDAGasPrice.Int64())
+ })
+
+ t.Run("error modification", func(t *testing.T) {
+ svc := estimatorconfig.NewFeeEstimatorConfigService()
+ ctx := context.Background()
+
+ initialExecGasPrice, initialDaGasPrice := big.NewInt(10), big.NewInt(1)
+ gpi1 := mocks2.NewGasPriceInterceptor(t)
+ svc.AddGasPriceInterceptor(gpi1)
+ gpi1.On("ModifyGasPriceComponents", ctx, initialExecGasPrice, initialDaGasPrice).
+ Return(nil, nil, errors.New("test"))
+
+ // has to return second interceptor values
+ _, _, err := svc.ModifyGasPriceComponents(ctx, initialExecGasPrice, initialDaGasPrice)
+ require.Error(t, err)
+ })
+
+ t.Run("without interceptors", func(t *testing.T) {
+ svc := estimatorconfig.NewFeeEstimatorConfigService()
+ ctx := context.Background()
+
+ initialExecGasPrice, initialDaGasPrice := big.NewInt(10), big.NewInt(1)
+
+ // has to return second interceptor values
+ resGasPrice, resDAGasPrice, err := svc.ModifyGasPriceComponents(ctx, initialExecGasPrice, initialDaGasPrice)
+ require.NoError(t, err)
+
+ // values should not be modified
+ require.Equal(t, initialExecGasPrice, resGasPrice)
+ require.Equal(t, initialDaGasPrice, resDAGasPrice)
+ })
+}
diff --git a/core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle/interceptor.go b/core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle/interceptor.go
new file mode 100644
index 0000000000..8d5d3bb6c2
--- /dev/null
+++ b/core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle/interceptor.go
@@ -0,0 +1,80 @@
+package mantle
+
+import (
+ "context"
+ "fmt"
+ "math/big"
+ "strings"
+ "time"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/common"
+
+ evmClient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/gas/rollups"
+)
+
+const (
+ // tokenRatio is not volatile and can be requested not often.
+ tokenRatioUpdateInterval = 60 * time.Minute
+ // tokenRatio fetches the tokenRatio used for Mantle's gas price calculation
+ tokenRatioMethod = "tokenRatio"
+ mantleTokenRatioAbiString = `[{"inputs":[],"name":"tokenRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]`
+)
+
+type Interceptor struct {
+ client evmClient.Client
+ tokenRatioCallData []byte
+ tokenRatio *big.Int
+ tokenRatioLastUpdate time.Time
+}
+
+func NewInterceptor(_ context.Context, client evmClient.Client) (*Interceptor, error) {
+ // Encode calldata for tokenRatio method
+ tokenRatioMethodAbi, err := abi.JSON(strings.NewReader(mantleTokenRatioAbiString))
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse GasPriceOracle %s() method ABI for Mantle; %v", tokenRatioMethod, err)
+ }
+ tokenRatioCallData, err := tokenRatioMethodAbi.Pack(tokenRatioMethod)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse GasPriceOracle %s() calldata for Mantle; %v", tokenRatioMethod, err)
+ }
+
+ return &Interceptor{
+ client: client,
+ tokenRatioCallData: tokenRatioCallData,
+ }, nil
+}
+
+// ModifyGasPriceComponents returns modified gasPrice.
+func (i *Interceptor) ModifyGasPriceComponents(ctx context.Context, execGasPrice, daGasPrice *big.Int) (*big.Int, *big.Int, error) {
+ if time.Since(i.tokenRatioLastUpdate) > tokenRatioUpdateInterval {
+ mantleTokenRatio, err := i.getMantleTokenRatio(ctx)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ i.tokenRatio, i.tokenRatioLastUpdate = mantleTokenRatio, time.Now()
+ }
+
+ // multiply daGasPrice and execGas price by tokenRatio
+ newExecGasPrice := new(big.Int).Mul(execGasPrice, i.tokenRatio)
+ newDAGasPrice := new(big.Int).Mul(daGasPrice, i.tokenRatio)
+ return newExecGasPrice, newDAGasPrice, nil
+}
+
+// getMantleTokenRatio Requests and returns a token ratio value for the Mantle chain.
+func (i *Interceptor) getMantleTokenRatio(ctx context.Context) (*big.Int, error) {
+ precompile := common.HexToAddress(rollups.OPGasOracleAddress)
+ tokenRatio, err := i.client.CallContract(ctx, ethereum.CallMsg{
+ To: &precompile,
+ Data: i.tokenRatioCallData,
+ }, nil)
+
+ if err != nil {
+ return nil, fmt.Errorf("getMantleTokenRatio call failed: %w", err)
+ }
+
+ return new(big.Int).SetBytes(tokenRatio), nil
+}
diff --git a/core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle/interceptor_test.go b/core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle/interceptor_test.go
new file mode 100644
index 0000000000..9134d996c2
--- /dev/null
+++ b/core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle/interceptor_test.go
@@ -0,0 +1,96 @@
+package mantle
+
+import (
+ "context"
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/mock"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client/mocks"
+)
+
+func TestInterceptor(t *testing.T) {
+ ethClient := mocks.NewClient(t)
+ ctx := context.Background()
+
+ tokenRatio := big.NewInt(10)
+ interceptor, err := NewInterceptor(ctx, ethClient)
+ require.NoError(t, err)
+
+ // request token ratio
+ ethClient.On("CallContract", ctx, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).
+ Return(common.BigToHash(tokenRatio).Bytes(), nil).Once()
+
+ modExecGasPrice, modDAGasPrice, err := interceptor.ModifyGasPriceComponents(ctx, big.NewInt(1), big.NewInt(1))
+ require.NoError(t, err)
+ require.Equal(t, int64(10), modExecGasPrice.Int64())
+ require.Equal(t, int64(10), modDAGasPrice.Int64())
+
+ // second call won't invoke eth client
+ modExecGasPrice, modDAGasPrice, err = interceptor.ModifyGasPriceComponents(ctx, big.NewInt(2), big.NewInt(1))
+ require.NoError(t, err)
+ require.Equal(t, int64(20), modExecGasPrice.Int64())
+ require.Equal(t, int64(10), modDAGasPrice.Int64())
+}
+
+func TestModifyGasPriceComponents(t *testing.T) {
+ testCases := map[string]struct {
+ execGasPrice *big.Int
+ daGasPrice *big.Int
+ tokenRatio *big.Int
+ resultExecGasPrice *big.Int
+ resultDAGasPrice *big.Int
+ }{
+ "regular": {
+ execGasPrice: big.NewInt(1000),
+ daGasPrice: big.NewInt(100),
+ resultExecGasPrice: big.NewInt(2000),
+ resultDAGasPrice: big.NewInt(200),
+ tokenRatio: big.NewInt(2),
+ },
+ "zero DAGasPrice": {
+ execGasPrice: big.NewInt(1000),
+ daGasPrice: big.NewInt(0),
+ resultExecGasPrice: big.NewInt(5000),
+ resultDAGasPrice: big.NewInt(0),
+ tokenRatio: big.NewInt(5),
+ },
+ "zero ExecGasPrice": {
+ execGasPrice: big.NewInt(0),
+ daGasPrice: big.NewInt(10),
+ resultExecGasPrice: big.NewInt(0),
+ resultDAGasPrice: big.NewInt(50),
+ tokenRatio: big.NewInt(5),
+ },
+ "zero token ratio": {
+ execGasPrice: big.NewInt(15),
+ daGasPrice: big.NewInt(10),
+ resultExecGasPrice: big.NewInt(0),
+ resultDAGasPrice: big.NewInt(0),
+ tokenRatio: big.NewInt(0),
+ },
+ }
+
+ for tcName, tc := range testCases {
+ t.Run(tcName, func(t *testing.T) {
+ ethClient := mocks.NewClient(t)
+ ctx := context.Background()
+
+ interceptor, err := NewInterceptor(ctx, ethClient)
+ require.NoError(t, err)
+
+ // request token ratio
+ ethClient.On("CallContract", ctx, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).
+ Return(common.BigToHash(tc.tokenRatio).Bytes(), nil).Once()
+
+ modExecGasPrice, modDAGasPrice, err := interceptor.ModifyGasPriceComponents(ctx, tc.execGasPrice, tc.daGasPrice)
+ require.NoError(t, err)
+ require.Equal(t, tc.resultExecGasPrice.Int64(), modExecGasPrice.Int64())
+ require.Equal(t, tc.resultDAGasPrice.Int64(), modDAGasPrice.Int64())
+ })
+ }
+}
diff --git a/core/services/ocr2/plugins/ccip/estimatorconfig/mocks/gas_price_interceptor_mock.go b/core/services/ocr2/plugins/ccip/estimatorconfig/mocks/gas_price_interceptor_mock.go
new file mode 100644
index 0000000000..62ec5a2207
--- /dev/null
+++ b/core/services/ocr2/plugins/ccip/estimatorconfig/mocks/gas_price_interceptor_mock.go
@@ -0,0 +1,106 @@
+// Code generated by mockery v2.43.2. DO NOT EDIT.
+
+package mocks
+
+import (
+ context "context"
+ big "math/big"
+
+ mock "github.com/stretchr/testify/mock"
+)
+
+// GasPriceInterceptor is an autogenerated mock type for the GasPriceInterceptor type
+type GasPriceInterceptor struct {
+ mock.Mock
+}
+
+type GasPriceInterceptor_Expecter struct {
+ mock *mock.Mock
+}
+
+func (_m *GasPriceInterceptor) EXPECT() *GasPriceInterceptor_Expecter {
+ return &GasPriceInterceptor_Expecter{mock: &_m.Mock}
+}
+
+// ModifyGasPriceComponents provides a mock function with given fields: ctx, execGasPrice, daGasPrice
+func (_m *GasPriceInterceptor) ModifyGasPriceComponents(ctx context.Context, execGasPrice *big.Int, daGasPrice *big.Int) (*big.Int, *big.Int, error) {
+ ret := _m.Called(ctx, execGasPrice, daGasPrice)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ModifyGasPriceComponents")
+ }
+
+ var r0 *big.Int
+ var r1 *big.Int
+ var r2 error
+ if rf, ok := ret.Get(0).(func(context.Context, *big.Int, *big.Int) (*big.Int, *big.Int, error)); ok {
+ return rf(ctx, execGasPrice, daGasPrice)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *big.Int, *big.Int) *big.Int); ok {
+ r0 = rf(ctx, execGasPrice, daGasPrice)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*big.Int)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *big.Int, *big.Int) *big.Int); ok {
+ r1 = rf(ctx, execGasPrice, daGasPrice)
+ } else {
+ if ret.Get(1) != nil {
+ r1 = ret.Get(1).(*big.Int)
+ }
+ }
+
+ if rf, ok := ret.Get(2).(func(context.Context, *big.Int, *big.Int) error); ok {
+ r2 = rf(ctx, execGasPrice, daGasPrice)
+ } else {
+ r2 = ret.Error(2)
+ }
+
+ return r0, r1, r2
+}
+
+// GasPriceInterceptor_ModifyGasPriceComponents_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ModifyGasPriceComponents'
+type GasPriceInterceptor_ModifyGasPriceComponents_Call struct {
+ *mock.Call
+}
+
+// ModifyGasPriceComponents is a helper method to define mock.On call
+// - ctx context.Context
+// - execGasPrice *big.Int
+// - daGasPrice *big.Int
+func (_e *GasPriceInterceptor_Expecter) ModifyGasPriceComponents(ctx interface{}, execGasPrice interface{}, daGasPrice interface{}) *GasPriceInterceptor_ModifyGasPriceComponents_Call {
+ return &GasPriceInterceptor_ModifyGasPriceComponents_Call{Call: _e.mock.On("ModifyGasPriceComponents", ctx, execGasPrice, daGasPrice)}
+}
+
+func (_c *GasPriceInterceptor_ModifyGasPriceComponents_Call) Run(run func(ctx context.Context, execGasPrice *big.Int, daGasPrice *big.Int)) *GasPriceInterceptor_ModifyGasPriceComponents_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(*big.Int), args[2].(*big.Int))
+ })
+ return _c
+}
+
+func (_c *GasPriceInterceptor_ModifyGasPriceComponents_Call) Return(modExecGasPrice *big.Int, modDAGasPrice *big.Int, err error) *GasPriceInterceptor_ModifyGasPriceComponents_Call {
+ _c.Call.Return(modExecGasPrice, modDAGasPrice, err)
+ return _c
+}
+
+func (_c *GasPriceInterceptor_ModifyGasPriceComponents_Call) RunAndReturn(run func(context.Context, *big.Int, *big.Int) (*big.Int, *big.Int, error)) *GasPriceInterceptor_ModifyGasPriceComponents_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// NewGasPriceInterceptor creates a new instance of GasPriceInterceptor. 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 NewGasPriceInterceptor(t interface {
+ mock.TestingT
+ Cleanup(func())
+}) *GasPriceInterceptor {
+ mock := &GasPriceInterceptor{}
+ mock.Mock.Test(t)
+
+ t.Cleanup(func() { mock.AssertExpectations(t) })
+
+ return mock
+}
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go
index e9266c4fb2..81807e66fe 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go
@@ -194,7 +194,14 @@ func TestCommitStoreReaders(t *testing.T) {
ge.On("L1Oracle").Return(lm)
feeEstimatorConfig := ccipdatamocks.NewFeeEstimatorConfigReader(t)
-
+ feeEstimatorConfig.On(
+ "ModifyGasPriceComponents",
+ mock.AnythingOfType("context.backgroundCtx"),
+ mock.AnythingOfType("*big.Int"),
+ mock.AnythingOfType("*big.Int"),
+ ).Return(func(ctx context.Context, x, y *big.Int) (*big.Int, *big.Int, error) {
+ return x, y, nil
+ })
maxGasPrice := big.NewInt(1e8)
c10r, err := factory.NewCommitStoreReader(lggr, factory.NewEvmVersionFinder(), ccipcalc.EvmAddrToGeneric(addr), ec, lp, feeEstimatorConfig) // ge, maxGasPrice
require.NoError(t, err)
@@ -372,8 +379,10 @@ func TestCommitStoreReaders(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, commonOffchain, c2)
// We should be able to query for gas prices now.
+
gpe, err := cr.GasPriceEstimator(ctx)
require.NoError(t, err)
+
gp, err := gpe.GetGasPrice(context.Background())
require.NoError(t, err)
assert.True(t, gp.Cmp(big.NewInt(0)) > 0)
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/fee_estimator_config.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/fee_estimator_config.go
index a1a9370528..0b4d1ce75a 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/fee_estimator_config.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/fee_estimator_config.go
@@ -2,8 +2,10 @@ package ccipdata
import (
"context"
+ "math/big"
)
type FeeEstimatorConfigReader interface {
GetDataAvailabilityConfig(ctx context.Context) (destDAOverheadGas, destGasPerDAByte, destDAMultiplierBps int64, err error)
+ ModifyGasPriceComponents(ctx context.Context, execGasPrice, daGasPrice *big.Int) (modExecGasPrice, modDAGasPrice *big.Int, err error)
}
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/fee_estimator_config_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/fee_estimator_config_mock.go
index b19f4cd882..e62cdec87a 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/fee_estimator_config_mock.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/fee_estimator_config_mock.go
@@ -3,6 +3,8 @@
package mocks
import (
+ big "math/big"
+
context "context"
mock "github.com/stretchr/testify/mock"
@@ -91,6 +93,75 @@ func (_c *FeeEstimatorConfigReader_GetDataAvailabilityConfig_Call) RunAndReturn(
return _c
}
+// ModifyGasPriceComponents provides a mock function with given fields: ctx, execGasPrice, daGasPrice
+func (_m *FeeEstimatorConfigReader) ModifyGasPriceComponents(ctx context.Context, execGasPrice *big.Int, daGasPrice *big.Int) (*big.Int, *big.Int, error) {
+ ret := _m.Called(ctx, execGasPrice, daGasPrice)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ModifyGasPriceComponents")
+ }
+
+ var r0 *big.Int
+ var r1 *big.Int
+ var r2 error
+ if rf, ok := ret.Get(0).(func(context.Context, *big.Int, *big.Int) (*big.Int, *big.Int, error)); ok {
+ return rf(ctx, execGasPrice, daGasPrice)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *big.Int, *big.Int) *big.Int); ok {
+ r0 = rf(ctx, execGasPrice, daGasPrice)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*big.Int)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *big.Int, *big.Int) *big.Int); ok {
+ r1 = rf(ctx, execGasPrice, daGasPrice)
+ } else {
+ if ret.Get(1) != nil {
+ r1 = ret.Get(1).(*big.Int)
+ }
+ }
+
+ if rf, ok := ret.Get(2).(func(context.Context, *big.Int, *big.Int) error); ok {
+ r2 = rf(ctx, execGasPrice, daGasPrice)
+ } else {
+ r2 = ret.Error(2)
+ }
+
+ return r0, r1, r2
+}
+
+// FeeEstimatorConfigReader_ModifyGasPriceComponents_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ModifyGasPriceComponents'
+type FeeEstimatorConfigReader_ModifyGasPriceComponents_Call struct {
+ *mock.Call
+}
+
+// ModifyGasPriceComponents is a helper method to define mock.On call
+// - ctx context.Context
+// - execGasPrice *big.Int
+// - daGasPrice *big.Int
+func (_e *FeeEstimatorConfigReader_Expecter) ModifyGasPriceComponents(ctx interface{}, execGasPrice interface{}, daGasPrice interface{}) *FeeEstimatorConfigReader_ModifyGasPriceComponents_Call {
+ return &FeeEstimatorConfigReader_ModifyGasPriceComponents_Call{Call: _e.mock.On("ModifyGasPriceComponents", ctx, execGasPrice, daGasPrice)}
+}
+
+func (_c *FeeEstimatorConfigReader_ModifyGasPriceComponents_Call) Run(run func(ctx context.Context, execGasPrice *big.Int, daGasPrice *big.Int)) *FeeEstimatorConfigReader_ModifyGasPriceComponents_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(*big.Int), args[2].(*big.Int))
+ })
+ return _c
+}
+
+func (_c *FeeEstimatorConfigReader_ModifyGasPriceComponents_Call) Return(modExecGasPrice *big.Int, modDAGasPrice *big.Int, err error) *FeeEstimatorConfigReader_ModifyGasPriceComponents_Call {
+ _c.Call.Return(modExecGasPrice, modDAGasPrice, err)
+ return _c
+}
+
+func (_c *FeeEstimatorConfigReader_ModifyGasPriceComponents_Call) RunAndReturn(run func(context.Context, *big.Int, *big.Int) (*big.Int, *big.Int, error)) *FeeEstimatorConfigReader_ModifyGasPriceComponents_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// NewFeeEstimatorConfigReader creates a new instance of FeeEstimatorConfigReader. 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 NewFeeEstimatorConfigReader(t interface {
diff --git a/core/services/ocr2/plugins/ccip/prices/da_price_estimator.go b/core/services/ocr2/plugins/ccip/prices/da_price_estimator.go
index b27494ad60..34239398c8 100644
--- a/core/services/ocr2/plugins/ccip/prices/da_price_estimator.go
+++ b/core/services/ocr2/plugins/ccip/prices/da_price_estimator.go
@@ -43,6 +43,7 @@ func (g DAGasPriceEstimator) GetGasPrice(ctx context.Context) (*big.Int, error)
return nil, err
}
var gasPrice *big.Int = execGasPrice
+
if gasPrice.BitLen() > int(g.priceEncodingLength) {
return nil, fmt.Errorf("native gas price exceeded max range %+v", gasPrice)
}
@@ -56,7 +57,14 @@ func (g DAGasPriceEstimator) GetGasPrice(ctx context.Context) (*big.Int, error)
return nil, err
}
- if daGasPrice := daGasPriceWei.ToInt(); daGasPrice.Cmp(big.NewInt(0)) > 0 {
+ daGasPrice := daGasPriceWei.ToInt()
+
+ gasPrice, daGasPrice, err = g.feeEstimatorConfig.ModifyGasPriceComponents(ctx, gasPrice, daGasPrice)
+ if err != nil {
+ return nil, fmt.Errorf("gasPrice modification failed: %v", err)
+ }
+
+ if daGasPrice.Cmp(big.NewInt(0)) > 0 {
if daGasPrice.BitLen() > int(g.priceEncodingLength) {
return nil, fmt.Errorf("data availability gas price exceeded max range %+v", daGasPrice)
}
diff --git a/core/services/ocr2/plugins/ccip/prices/da_price_estimator_test.go b/core/services/ocr2/plugins/ccip/prices/da_price_estimator_test.go
index 158f02c4f0..52ef8c3800 100644
--- a/core/services/ocr2/plugins/ccip/prices/da_price_estimator_test.go
+++ b/core/services/ocr2/plugins/ccip/prices/da_price_estimator_test.go
@@ -23,11 +23,13 @@ func TestDAPriceEstimator_GetGasPrice(t *testing.T) {
ctx := context.Background()
testCases := []struct {
- name string
- daGasPrice *big.Int
- execGasPrice *big.Int
- expPrice *big.Int
- expErr bool
+ name string
+ daGasPrice *big.Int
+ execGasPrice *big.Int
+ expPrice *big.Int
+ modExecGasPrice *big.Int
+ modDAGasPrice *big.Int
+ expErr bool
}{
{
name: "base",
@@ -57,6 +59,31 @@ func TestDAPriceEstimator_GetGasPrice(t *testing.T) {
expPrice: encodeGasPrice(big.NewInt(1e9), big.NewInt(0)),
expErr: false,
},
+ {
+ name: "execGasPrice Modified",
+ daGasPrice: big.NewInt(1e9),
+ execGasPrice: big.NewInt(0),
+ modExecGasPrice: big.NewInt(1),
+ expPrice: encodeGasPrice(big.NewInt(1e9), big.NewInt(1)),
+ expErr: false,
+ },
+ {
+ name: "daGasPrice Modified",
+ daGasPrice: big.NewInt(1e9),
+ execGasPrice: big.NewInt(0),
+ modDAGasPrice: big.NewInt(1),
+ expPrice: encodeGasPrice(big.NewInt(1), big.NewInt(0)),
+ expErr: false,
+ },
+ {
+ name: "daGasPrice and execGasPrice Modified",
+ daGasPrice: big.NewInt(1e9),
+ execGasPrice: big.NewInt(0),
+ modDAGasPrice: big.NewInt(1),
+ modExecGasPrice: big.NewInt(2),
+ expPrice: encodeGasPrice(big.NewInt(1), big.NewInt(2)),
+ expErr: false,
+ },
{
name: "price out of bounds",
daGasPrice: new(big.Int).Lsh(big.NewInt(1), daGasPriceEncodingLength),
@@ -74,10 +101,25 @@ func TestDAPriceEstimator_GetGasPrice(t *testing.T) {
l1Oracle := mocks.NewL1Oracle(t)
l1Oracle.On("GasPrice", ctx).Return(assets.NewWei(tc.daGasPrice), nil)
+ feeEstimatorConfig := ccipdatamocks.NewFeeEstimatorConfigReader(t)
+
+ modRespExecGasPrice := tc.execGasPrice
+ if tc.modExecGasPrice != nil {
+ modRespExecGasPrice = tc.modExecGasPrice
+ }
+
+ modRespDAGasPrice := tc.daGasPrice
+ if tc.modDAGasPrice != nil {
+ modRespDAGasPrice = tc.modDAGasPrice
+ }
+ feeEstimatorConfig.On("ModifyGasPriceComponents", mock.Anything, tc.execGasPrice, tc.daGasPrice).
+ Return(modRespExecGasPrice, modRespDAGasPrice, nil)
+
g := DAGasPriceEstimator{
execEstimator: execEstimator,
l1Oracle: l1Oracle,
priceEncodingLength: daGasPriceEncodingLength,
+ feeEstimatorConfig: feeEstimatorConfig,
}
gasPrice, err := g.GetGasPrice(ctx)
diff --git a/core/services/relay/evm/evm.go b/core/services/relay/evm/evm.go
index 85cb3486ca..ae5244f5f0 100644
--- a/core/services/relay/evm/evm.go
+++ b/core/services/relay/evm/evm.go
@@ -12,6 +12,8 @@ import (
"sync"
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/chaintype"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/ccipcommit"
@@ -409,6 +411,16 @@ func (r *Relayer) NewCCIPCommitProvider(rargs commontypes.RelayArgs, pargs commo
feeEstimatorConfig := estimatorconfig.NewFeeEstimatorConfigService()
+ // CCIPCommit reads only when source chain is Mantle, then reports to dest chain
+ // to minimize misconfigure risk, might make sense to wire Mantle only when Commit + Mantle + IsSourceProvider
+ if r.chain.Config().EVM().ChainType() == chaintype.ChainMantle && commitPluginConfig.IsSourceProvider {
+ mantleInterceptor, iErr := mantle.NewInterceptor(ctx, r.chain.Client())
+ if iErr != nil {
+ return nil, iErr
+ }
+ feeEstimatorConfig.AddGasPriceInterceptor(mantleInterceptor)
+ }
+
// The src chain implementation of this provider does not need a configWatcher or contractTransmitter;
// bail early.
if commitPluginConfig.IsSourceProvider {
@@ -480,6 +492,16 @@ func (r *Relayer) NewCCIPExecProvider(rargs commontypes.RelayArgs, pargs commont
feeEstimatorConfig := estimatorconfig.NewFeeEstimatorConfigService()
+ // CCIPExec reads when dest chain is mantle, and uses it to calc boosting in batching
+ // to minimize misconfigure risk, make sense to wire Mantle only when Exec + Mantle + !IsSourceProvider
+ if r.chain.Config().EVM().ChainType() == chaintype.ChainMantle && !execPluginConfig.IsSourceProvider {
+ mantleInterceptor, iErr := mantle.NewInterceptor(ctx, r.chain.Client())
+ if iErr != nil {
+ return nil, iErr
+ }
+ feeEstimatorConfig.AddGasPriceInterceptor(mantleInterceptor)
+ }
+
// The src chain implementation of this provider does not need a configWatcher or contractTransmitter;
// bail early.
if execPluginConfig.IsSourceProvider {
diff --git a/core/services/relay/evm/interceptors/mantle/interceptor.go b/core/services/relay/evm/interceptors/mantle/interceptor.go
new file mode 100644
index 0000000000..8d5d3bb6c2
--- /dev/null
+++ b/core/services/relay/evm/interceptors/mantle/interceptor.go
@@ -0,0 +1,80 @@
+package mantle
+
+import (
+ "context"
+ "fmt"
+ "math/big"
+ "strings"
+ "time"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/common"
+
+ evmClient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/gas/rollups"
+)
+
+const (
+ // tokenRatio is not volatile and can be requested not often.
+ tokenRatioUpdateInterval = 60 * time.Minute
+ // tokenRatio fetches the tokenRatio used for Mantle's gas price calculation
+ tokenRatioMethod = "tokenRatio"
+ mantleTokenRatioAbiString = `[{"inputs":[],"name":"tokenRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]`
+)
+
+type Interceptor struct {
+ client evmClient.Client
+ tokenRatioCallData []byte
+ tokenRatio *big.Int
+ tokenRatioLastUpdate time.Time
+}
+
+func NewInterceptor(_ context.Context, client evmClient.Client) (*Interceptor, error) {
+ // Encode calldata for tokenRatio method
+ tokenRatioMethodAbi, err := abi.JSON(strings.NewReader(mantleTokenRatioAbiString))
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse GasPriceOracle %s() method ABI for Mantle; %v", tokenRatioMethod, err)
+ }
+ tokenRatioCallData, err := tokenRatioMethodAbi.Pack(tokenRatioMethod)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse GasPriceOracle %s() calldata for Mantle; %v", tokenRatioMethod, err)
+ }
+
+ return &Interceptor{
+ client: client,
+ tokenRatioCallData: tokenRatioCallData,
+ }, nil
+}
+
+// ModifyGasPriceComponents returns modified gasPrice.
+func (i *Interceptor) ModifyGasPriceComponents(ctx context.Context, execGasPrice, daGasPrice *big.Int) (*big.Int, *big.Int, error) {
+ if time.Since(i.tokenRatioLastUpdate) > tokenRatioUpdateInterval {
+ mantleTokenRatio, err := i.getMantleTokenRatio(ctx)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ i.tokenRatio, i.tokenRatioLastUpdate = mantleTokenRatio, time.Now()
+ }
+
+ // multiply daGasPrice and execGas price by tokenRatio
+ newExecGasPrice := new(big.Int).Mul(execGasPrice, i.tokenRatio)
+ newDAGasPrice := new(big.Int).Mul(daGasPrice, i.tokenRatio)
+ return newExecGasPrice, newDAGasPrice, nil
+}
+
+// getMantleTokenRatio Requests and returns a token ratio value for the Mantle chain.
+func (i *Interceptor) getMantleTokenRatio(ctx context.Context) (*big.Int, error) {
+ precompile := common.HexToAddress(rollups.OPGasOracleAddress)
+ tokenRatio, err := i.client.CallContract(ctx, ethereum.CallMsg{
+ To: &precompile,
+ Data: i.tokenRatioCallData,
+ }, nil)
+
+ if err != nil {
+ return nil, fmt.Errorf("getMantleTokenRatio call failed: %w", err)
+ }
+
+ return new(big.Int).SetBytes(tokenRatio), nil
+}
diff --git a/core/services/relay/evm/interceptors/mantle/interceptor_test.go b/core/services/relay/evm/interceptors/mantle/interceptor_test.go
new file mode 100644
index 0000000000..9134d996c2
--- /dev/null
+++ b/core/services/relay/evm/interceptors/mantle/interceptor_test.go
@@ -0,0 +1,96 @@
+package mantle
+
+import (
+ "context"
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/mock"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client/mocks"
+)
+
+func TestInterceptor(t *testing.T) {
+ ethClient := mocks.NewClient(t)
+ ctx := context.Background()
+
+ tokenRatio := big.NewInt(10)
+ interceptor, err := NewInterceptor(ctx, ethClient)
+ require.NoError(t, err)
+
+ // request token ratio
+ ethClient.On("CallContract", ctx, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).
+ Return(common.BigToHash(tokenRatio).Bytes(), nil).Once()
+
+ modExecGasPrice, modDAGasPrice, err := interceptor.ModifyGasPriceComponents(ctx, big.NewInt(1), big.NewInt(1))
+ require.NoError(t, err)
+ require.Equal(t, int64(10), modExecGasPrice.Int64())
+ require.Equal(t, int64(10), modDAGasPrice.Int64())
+
+ // second call won't invoke eth client
+ modExecGasPrice, modDAGasPrice, err = interceptor.ModifyGasPriceComponents(ctx, big.NewInt(2), big.NewInt(1))
+ require.NoError(t, err)
+ require.Equal(t, int64(20), modExecGasPrice.Int64())
+ require.Equal(t, int64(10), modDAGasPrice.Int64())
+}
+
+func TestModifyGasPriceComponents(t *testing.T) {
+ testCases := map[string]struct {
+ execGasPrice *big.Int
+ daGasPrice *big.Int
+ tokenRatio *big.Int
+ resultExecGasPrice *big.Int
+ resultDAGasPrice *big.Int
+ }{
+ "regular": {
+ execGasPrice: big.NewInt(1000),
+ daGasPrice: big.NewInt(100),
+ resultExecGasPrice: big.NewInt(2000),
+ resultDAGasPrice: big.NewInt(200),
+ tokenRatio: big.NewInt(2),
+ },
+ "zero DAGasPrice": {
+ execGasPrice: big.NewInt(1000),
+ daGasPrice: big.NewInt(0),
+ resultExecGasPrice: big.NewInt(5000),
+ resultDAGasPrice: big.NewInt(0),
+ tokenRatio: big.NewInt(5),
+ },
+ "zero ExecGasPrice": {
+ execGasPrice: big.NewInt(0),
+ daGasPrice: big.NewInt(10),
+ resultExecGasPrice: big.NewInt(0),
+ resultDAGasPrice: big.NewInt(50),
+ tokenRatio: big.NewInt(5),
+ },
+ "zero token ratio": {
+ execGasPrice: big.NewInt(15),
+ daGasPrice: big.NewInt(10),
+ resultExecGasPrice: big.NewInt(0),
+ resultDAGasPrice: big.NewInt(0),
+ tokenRatio: big.NewInt(0),
+ },
+ }
+
+ for tcName, tc := range testCases {
+ t.Run(tcName, func(t *testing.T) {
+ ethClient := mocks.NewClient(t)
+ ctx := context.Background()
+
+ interceptor, err := NewInterceptor(ctx, ethClient)
+ require.NoError(t, err)
+
+ // request token ratio
+ ethClient.On("CallContract", ctx, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).
+ Return(common.BigToHash(tc.tokenRatio).Bytes(), nil).Once()
+
+ modExecGasPrice, modDAGasPrice, err := interceptor.ModifyGasPriceComponents(ctx, tc.execGasPrice, tc.daGasPrice)
+ require.NoError(t, err)
+ require.Equal(t, tc.resultExecGasPrice.Int64(), modExecGasPrice.Int64())
+ require.Equal(t, tc.resultDAGasPrice.Int64(), modDAGasPrice.Int64())
+ })
+ }
+}
From d0c97c5b4ee18a5c9c7950b43933ec3f27b3f0be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Friedemann=20F=C3=BCrst?=
<59653747+friedemannf@users.noreply.github.com>
Date: Tue, 24 Sep 2024 16:47:38 +0200
Subject: [PATCH 04/32] Add Zircuit Configs (#14541)
* Add Zircuit Configs
* Add Changeset
* Update changeset
---
.changeset/khaki-tigers-agree.md | 5 +
.../config/toml/defaults/Zircuit_Mainnet.toml | 36 +++
.../config/toml/defaults/Zircuit_Sepolia.toml | 36 +++
docs/CONFIG.md | 212 ++++++++++++++++++
4 files changed, 289 insertions(+)
create mode 100644 .changeset/khaki-tigers-agree.md
create mode 100644 core/chains/evm/config/toml/defaults/Zircuit_Mainnet.toml
create mode 100644 core/chains/evm/config/toml/defaults/Zircuit_Sepolia.toml
diff --git a/.changeset/khaki-tigers-agree.md b/.changeset/khaki-tigers-agree.md
new file mode 100644
index 0000000000..ba9e56cc1d
--- /dev/null
+++ b/.changeset/khaki-tigers-agree.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+#added #nops Add Zircuit Configs
diff --git a/core/chains/evm/config/toml/defaults/Zircuit_Mainnet.toml b/core/chains/evm/config/toml/defaults/Zircuit_Mainnet.toml
new file mode 100644
index 0000000000..ec336d3efe
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/Zircuit_Mainnet.toml
@@ -0,0 +1,36 @@
+ChainID = '48900'
+ChainType = 'optimismBedrock'
+FinalityTagEnabled = true
+FinalityDepth = 1000
+LinkContractAddress = '0x5D6d033B4FbD2190D99D930719fAbAcB64d2439a'
+LogPollInterval = "2s"
+NoNewHeadsThreshold = "40s"
+NoNewFinalizedHeadsThreshold = "15m"
+
+[GasEstimator]
+EIP1559DynamicFees = true
+PriceMin = '1 wei'
+BumpMin = '100 wei'
+
+[GasEstimator.BlockHistory]
+BlockHistorySize = 24
+
+[Transactions]
+ResendAfterThreshold = '30s'
+
+[HeadTracker]
+HistoryDepth = 2000
+
+[NodePool]
+SyncThreshold = 10
+
+[OCR]
+ContractConfirmations = 1
+
+[OCR2.Automation]
+GasLimit = 6500000
+
+[Transactions.AutoPurge]
+Enabled = true
+Threshold = 90 # 90 blocks at 2s block time ~3 minutes
+MinAttempts = 3
\ No newline at end of file
diff --git a/core/chains/evm/config/toml/defaults/Zircuit_Sepolia.toml b/core/chains/evm/config/toml/defaults/Zircuit_Sepolia.toml
new file mode 100644
index 0000000000..d6934d533d
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/Zircuit_Sepolia.toml
@@ -0,0 +1,36 @@
+ChainID = '48899'
+ChainType = 'optimismBedrock'
+FinalityTagEnabled = true
+FinalityDepth = 1000
+LinkContractAddress = '0xDEE94506570cA186BC1e3516fCf4fd719C312cCD'
+LogPollInterval = "2s"
+NoNewHeadsThreshold = "40s"
+NoNewFinalizedHeadsThreshold = "15m"
+
+[GasEstimator]
+EIP1559DynamicFees = true
+PriceMin = '1 wei'
+BumpMin = '100 wei'
+
+[GasEstimator.BlockHistory]
+BlockHistorySize = 60
+
+[Transactions]
+ResendAfterThreshold = '30s'
+
+[HeadTracker]
+HistoryDepth = 2000
+
+[NodePool]
+SyncThreshold = 10
+
+[OCR]
+ContractConfirmations = 1
+
+[OCR2.Automation]
+GasLimit = 6500000
+
+[Transactions.AutoPurge]
+Enabled = true
+Threshold = 90 # 90 blocks at 2s block time ~3 minutes
+MinAttempts = 3
\ No newline at end of file
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 95743363ab..6742b7354f 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -6577,6 +6577,218 @@ GasLimit = 5400000
+Zircuit Sepolia (48899)
+
+```toml
+AutoCreateKey = true
+BlockBackfillDepth = 10
+BlockBackfillSkip = false
+ChainType = 'optimismBedrock'
+FinalityDepth = 1000
+FinalityTagEnabled = true
+LinkContractAddress = '0xDEE94506570cA186BC1e3516fCf4fd719C312cCD'
+LogBackfillBatchSize = 1000
+LogPollInterval = '2s'
+LogKeepBlocksDepth = 100000
+LogPrunePageSize = 0
+BackupLogPollerBlockDelay = 100
+MinIncomingConfirmations = 3
+MinContractPayment = '0.00001 link'
+NonceAutoSync = true
+NoNewHeadsThreshold = '40s'
+LogBroadcasterEnabled = true
+RPCDefaultBatchSize = 250
+RPCBlockQueryDelay = 1
+FinalizedBlockOffset = 0
+NoNewFinalizedHeadsThreshold = '15m0s'
+
+[Transactions]
+ForwardersEnabled = false
+MaxInFlight = 16
+MaxQueued = 250
+ReaperInterval = '1h0m0s'
+ReaperThreshold = '168h0m0s'
+ResendAfterThreshold = '30s'
+
+[Transactions.AutoPurge]
+Enabled = true
+Threshold = 90
+MinAttempts = 3
+
+[BalanceMonitor]
+Enabled = true
+
+[GasEstimator]
+Mode = 'BlockHistory'
+PriceDefault = '20 gwei'
+PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
+PriceMin = '1 wei'
+LimitDefault = 500000
+LimitMax = 500000
+LimitMultiplier = '1'
+LimitTransfer = 21000
+EstimateLimit = false
+BumpMin = '100 wei'
+BumpPercent = 20
+BumpThreshold = 3
+EIP1559DynamicFees = true
+FeeCapDefault = '100 gwei'
+TipCapDefault = '1 wei'
+TipCapMin = '1 wei'
+
+[GasEstimator.BlockHistory]
+BatchSize = 25
+BlockHistorySize = 60
+CheckInclusionBlocks = 12
+CheckInclusionPercentile = 90
+TransactionPercentile = 60
+
+[GasEstimator.FeeHistory]
+CacheTimeout = '10s'
+
+[HeadTracker]
+HistoryDepth = 2000
+MaxBufferSize = 3
+SamplingInterval = '1s'
+MaxAllowedFinalityDepth = 10000
+FinalityTagBypass = true
+
+[NodePool]
+PollFailureThreshold = 5
+PollInterval = '10s'
+SelectionMode = 'HighestHead'
+SyncThreshold = 10
+LeaseDuration = '0s'
+NodeIsSyncingEnabled = false
+FinalizedBlockPollInterval = '5s'
+EnforceRepeatableRead = false
+DeathDeclarationDelay = '10s'
+NewHeadsPollInterval = '0s'
+
+[OCR]
+ContractConfirmations = 1
+ContractTransmitterTransmitTimeout = '10s'
+DatabaseTimeout = '10s'
+DeltaCOverride = '168h0m0s'
+DeltaCJitterOverride = '1h0m0s'
+ObservationGracePeriod = '1s'
+
+[OCR2]
+[OCR2.Automation]
+GasLimit = 6500000
+
+[Workflow]
+GasLimitDefault = 400000
+```
+
+
+
+Zircuit Mainnet (48900)
+
+```toml
+AutoCreateKey = true
+BlockBackfillDepth = 10
+BlockBackfillSkip = false
+ChainType = 'optimismBedrock'
+FinalityDepth = 1000
+FinalityTagEnabled = true
+LinkContractAddress = '0x5D6d033B4FbD2190D99D930719fAbAcB64d2439a'
+LogBackfillBatchSize = 1000
+LogPollInterval = '2s'
+LogKeepBlocksDepth = 100000
+LogPrunePageSize = 0
+BackupLogPollerBlockDelay = 100
+MinIncomingConfirmations = 3
+MinContractPayment = '0.00001 link'
+NonceAutoSync = true
+NoNewHeadsThreshold = '40s'
+LogBroadcasterEnabled = true
+RPCDefaultBatchSize = 250
+RPCBlockQueryDelay = 1
+FinalizedBlockOffset = 0
+NoNewFinalizedHeadsThreshold = '15m0s'
+
+[Transactions]
+ForwardersEnabled = false
+MaxInFlight = 16
+MaxQueued = 250
+ReaperInterval = '1h0m0s'
+ReaperThreshold = '168h0m0s'
+ResendAfterThreshold = '30s'
+
+[Transactions.AutoPurge]
+Enabled = true
+Threshold = 90
+MinAttempts = 3
+
+[BalanceMonitor]
+Enabled = true
+
+[GasEstimator]
+Mode = 'BlockHistory'
+PriceDefault = '20 gwei'
+PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
+PriceMin = '1 wei'
+LimitDefault = 500000
+LimitMax = 500000
+LimitMultiplier = '1'
+LimitTransfer = 21000
+EstimateLimit = false
+BumpMin = '100 wei'
+BumpPercent = 20
+BumpThreshold = 3
+EIP1559DynamicFees = true
+FeeCapDefault = '100 gwei'
+TipCapDefault = '1 wei'
+TipCapMin = '1 wei'
+
+[GasEstimator.BlockHistory]
+BatchSize = 25
+BlockHistorySize = 24
+CheckInclusionBlocks = 12
+CheckInclusionPercentile = 90
+TransactionPercentile = 60
+
+[GasEstimator.FeeHistory]
+CacheTimeout = '10s'
+
+[HeadTracker]
+HistoryDepth = 2000
+MaxBufferSize = 3
+SamplingInterval = '1s'
+MaxAllowedFinalityDepth = 10000
+FinalityTagBypass = true
+
+[NodePool]
+PollFailureThreshold = 5
+PollInterval = '10s'
+SelectionMode = 'HighestHead'
+SyncThreshold = 10
+LeaseDuration = '0s'
+NodeIsSyncingEnabled = false
+FinalizedBlockPollInterval = '5s'
+EnforceRepeatableRead = false
+DeathDeclarationDelay = '10s'
+NewHeadsPollInterval = '0s'
+
+[OCR]
+ContractConfirmations = 1
+ContractTransmitterTransmitTimeout = '10s'
+DatabaseTimeout = '10s'
+DeltaCOverride = '168h0m0s'
+DeltaCJitterOverride = '1h0m0s'
+ObservationGracePeriod = '1s'
+
+[OCR2]
+[OCR2.Automation]
+GasLimit = 6500000
+
+[Workflow]
+GasLimitDefault = 400000
+```
+
+
+
Linea Goerli (59140)
```toml
From 0f28999f5ab87f13032a508a58d4018c1e347d98 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Friedemann=20F=C3=BCrst?=
Date: Tue, 24 Sep 2024 18:18:30 +0200
Subject: [PATCH 05/32] Regenerate CONFIG.md
---
docs/CONFIG.md | 22 ++++++----------------
1 file changed, 6 insertions(+), 16 deletions(-)
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 6742b7354f..352d95b94f 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -6590,13 +6590,12 @@ LinkContractAddress = '0xDEE94506570cA186BC1e3516fCf4fd719C312cCD'
LogBackfillBatchSize = 1000
LogPollInterval = '2s'
LogKeepBlocksDepth = 100000
-LogPrunePageSize = 0
+LogPrunePageSize = 10000
BackupLogPollerBlockDelay = 100
MinIncomingConfirmations = 3
MinContractPayment = '0.00001 link'
NonceAutoSync = true
NoNewHeadsThreshold = '40s'
-LogBroadcasterEnabled = true
RPCDefaultBatchSize = 250
RPCBlockQueryDelay = 1
FinalizedBlockOffset = 0
@@ -6623,8 +6622,8 @@ Mode = 'BlockHistory'
PriceDefault = '20 gwei'
PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
PriceMin = '1 wei'
-LimitDefault = 500000
-LimitMax = 500000
+LimitDefault = 8000000
+LimitMax = 8000000
LimitMultiplier = '1'
LimitTransfer = 21000
EstimateLimit = false
@@ -6663,7 +6662,6 @@ NodeIsSyncingEnabled = false
FinalizedBlockPollInterval = '5s'
EnforceRepeatableRead = false
DeathDeclarationDelay = '10s'
-NewHeadsPollInterval = '0s'
[OCR]
ContractConfirmations = 1
@@ -6676,9 +6674,6 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
GasLimit = 6500000
-
-[Workflow]
-GasLimitDefault = 400000
```
@@ -6696,13 +6691,12 @@ LinkContractAddress = '0x5D6d033B4FbD2190D99D930719fAbAcB64d2439a'
LogBackfillBatchSize = 1000
LogPollInterval = '2s'
LogKeepBlocksDepth = 100000
-LogPrunePageSize = 0
+LogPrunePageSize = 10000
BackupLogPollerBlockDelay = 100
MinIncomingConfirmations = 3
MinContractPayment = '0.00001 link'
NonceAutoSync = true
NoNewHeadsThreshold = '40s'
-LogBroadcasterEnabled = true
RPCDefaultBatchSize = 250
RPCBlockQueryDelay = 1
FinalizedBlockOffset = 0
@@ -6729,8 +6723,8 @@ Mode = 'BlockHistory'
PriceDefault = '20 gwei'
PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
PriceMin = '1 wei'
-LimitDefault = 500000
-LimitMax = 500000
+LimitDefault = 8000000
+LimitMax = 8000000
LimitMultiplier = '1'
LimitTransfer = 21000
EstimateLimit = false
@@ -6769,7 +6763,6 @@ NodeIsSyncingEnabled = false
FinalizedBlockPollInterval = '5s'
EnforceRepeatableRead = false
DeathDeclarationDelay = '10s'
-NewHeadsPollInterval = '0s'
[OCR]
ContractConfirmations = 1
@@ -6782,9 +6775,6 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
GasLimit = 6500000
-
-[Workflow]
-GasLimitDefault = 400000
```
From 75b4250b67c2ce855c430ff95d0eb6af6fab5290 Mon Sep 17 00:00:00 2001
From: nogo <110664798+0xnogo@users.noreply.github.com>
Date: Wed, 25 Sep 2024 10:47:20 +0400
Subject: [PATCH 06/32] Add RMNHomeAddress in the OCR3Config (#1449)
Adding `rmnHomeAddress` in the `OCR3Config` struct + generated wrappers.
---
contracts/gas-snapshots/ccip.gas-snapshot | 88 +++++++-------
.../src/v0.8/ccip/capability/CCIPConfig.sol | 6 +
.../capability/libraries/CCIPConfigTypes.sol | 1 +
.../ccip/test/capability/CCIPConfig.t.sol | 115 +++++++++++++-----
.../ccip/generated/ccip_config/ccip_config.go | 7 +-
.../ocr3_config_encoder.go | 3 +-
...rapper-dependency-versions-do-not-edit.txt | 4 +-
7 files changed, 142 insertions(+), 82 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 740dfc0c8f..00f9512d00 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -36,29 +36,29 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050)
BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24170)
CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431)
CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9508)
-CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 83274)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 354656)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 466876)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 433253)
-CCIPConfig_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 28063)
-CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 61002)
-CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 60940)
-CCIPConfig_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11668)
+CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 87751)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 359022)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 478323)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 443187)
+CCIPConfig_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 31646)
+CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 64324)
+CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 64262)
+CCIPConfig_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11734)
CCIPConfig_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8783)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 305974)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 46142)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 25040)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 362471)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 110001)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 141606)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 362211)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 141673)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 308111)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 48274)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 27945)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 368614)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 116145)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 149842)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 368354)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 149909)
CCIPConfig_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9632)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1699166)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 991503)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 991534)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1798048)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1040966)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1040997)
CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_Reverts() (gas: 9665)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16042)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16115)
CCIPConfig_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9596)
CCIPConfig_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 185139)
CCIPConfig_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 347170)
@@ -67,30 +67,32 @@ CCIPConfig_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success()
CCIPConfig_chainConfig:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14943)
CCIPConfig_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9617)
CCIPConfig_chainConfig:test_getPaginatedCCIPConfigs_Success() (gas: 370770)
-CCIPConfig_constructor:test_constructor_Success() (gas: 3155264)
-CCIPConfig_constructor:test_constructor_ZeroAddressNotAllowed_Revert() (gas: 61226)
-CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 22160)
-CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 19491)
+CCIPConfig_constructor:test_constructor_Success() (gas: 3275156)
+CCIPConfig_constructor:test_constructor_ZeroAddressNotAllowed_Revert() (gas: 61370)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 24518)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 21077)
CCIPConfig_updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9654)
-CCIPConfig_updatePluginConfig:test_updatePluginConfig_InitToRunning_Success() (gas: 1039133)
-CCIPConfig_updatePluginConfig:test_updatePluginConfig_RunningToStaging_Success() (gas: 1923111)
-CCIPConfig_updatePluginConfig:test_updatePluginConfig_StagingToRunning_Success() (gas: 1923145)
-CCIPConfig_validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 333177)
-CCIPConfig_validateConfig:test__validateConfigSmallerFChain_Success() (gas: 464532)
-CCIPConfig_validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 288463)
-CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 291264)
-CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 288096)
-CCIPConfig_validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 335512)
-CCIPConfig_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 289648)
-CCIPConfig_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 289087)
-CCIPConfig_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 342330)
-CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 306844)
-CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1209806)
-CCIPConfig_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 288202)
-CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 299119)
-CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 788872)
-CCIPConfig_validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 292418)
-CCIPConfig_validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 292467)
+CCIPConfig_updatePluginConfig:test_updatePluginConfig_InitToRunning_Success() (gas: 1092200)
+CCIPConfig_updatePluginConfig:test_updatePluginConfig_RunningToStaging_Success() (gas: 2043837)
+CCIPConfig_updatePluginConfig:test_updatePluginConfig_StagingToRunning_Success() (gas: 2043872)
+CCIPConfig_validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334491)
+CCIPConfig_validateConfig:test__validateConfigSmallerFChain_Success() (gas: 465605)
+CCIPConfig_validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289551)
+CCIPConfig_validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 289846)
+CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 292593)
+CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 289185)
+CCIPConfig_validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 336851)
+CCIPConfig_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 290977)
+CCIPConfig_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 290416)
+CCIPConfig_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 343692)
+CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 309173)
+CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1211220)
+CCIPConfig_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 289247)
+CCIPConfig_validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 289485)
+CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 300450)
+CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 790349)
+CCIPConfig_validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 293748)
+CCIPConfig_validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 293820)
CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9596)
CommitStore_constructor:test_Constructor_Success() (gas: 2855567)
CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73954)
diff --git a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol b/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
index 3414f4912f..e677c132f9 100644
--- a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
+++ b/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
@@ -41,6 +41,7 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
error FChainTooHigh(uint256 fChain, uint256 FRoleDON);
error InvalidPluginType();
error OfframpAddressCannotBeZero();
+ error RMNHomeAddressCannotBeZero();
error InvalidConfigLength(uint256 length);
error InvalidConfigStateTransition(
CCIPConfigTypes.ConfigState currentState, CCIPConfigTypes.ConfigState proposedState
@@ -227,6 +228,7 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
ocr3Config.FRoleDON = newOcr3Config.FRoleDON;
ocr3Config.offchainConfigVersion = newOcr3Config.offchainConfigVersion;
ocr3Config.offrampAddress = newOcr3Config.offrampAddress;
+ ocr3Config.rmnHomeAddress = newOcr3Config.rmnHomeAddress;
ocr3Config.offchainConfig = newOcr3Config.offchainConfig;
// Remove all excess nodes
@@ -426,6 +428,9 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
if (cfg.offrampAddress.length == 0 || keccak256(cfg.offrampAddress) == EMPTY_ENCODED_ADDRESS_HASH) {
revert OfframpAddressCannotBeZero();
}
+ if (cfg.rmnHomeAddress.length == 0 || keccak256(cfg.rmnHomeAddress) == EMPTY_ENCODED_ADDRESS_HASH) {
+ revert RMNHomeAddressCannotBeZero();
+ }
if (!s_remoteChainSelectors.contains(cfg.chainSelector)) revert ChainSelectorNotFound(cfg.chainSelector);
// fChain cannot exceed FRoleDON, since it is a subcommittee in the larger DON
@@ -494,6 +499,7 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
donId,
ocr3Config.pluginType,
ocr3Config.offrampAddress,
+ ocr3Config.rmnHomeAddress,
configCount,
ocr3Config.nodes,
ocr3Config.FRoleDON,
diff --git a/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol b/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
index eca133f5dd..59ddb39b5a 100644
--- a/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
+++ b/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
@@ -55,6 +55,7 @@ library CCIPConfigTypes {
uint8 FRoleDON; // | The "big F" parameter for the role DON.
uint64 offchainConfigVersion; // ─────────────╯ The version of the offchain configuration.
bytes offrampAddress; // The remote chain offramp address.
+ bytes rmnHomeAddress; // The home chain RMN home address.
OCR3Node[] nodes; // Keys & IDs of nodes part of the role DON
bytes offchainConfig; // The offchain configuration for the OCR3 protocol. Protobuf encoded.
}
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
index a64fee8b9a..0f95d8b42c 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
@@ -30,7 +30,7 @@ contract CCIPConfigSetup is Test {
function _makeBytesArray(uint256 length, uint256 seed) internal pure returns (bytes[] memory arr) {
arr = new bytes[](length);
for (uint256 i = 0; i < length; i++) {
- arr[i] = abi.encodePacked(keccak256(abi.encode(i, 1, seed)));
+ arr[i] = abi.encode(keccak256(abi.encode(i, 1, seed)));
}
return arr;
}
@@ -122,6 +122,7 @@ contract CCIPConfigSetup is Test {
assertEq(a.FRoleDON, b.FRoleDON, "FRoleDON must match");
assertEq(a.offchainConfigVersion, b.offchainConfigVersion, "offchainConfigVersion must match");
assertEq(a.offrampAddress, b.offrampAddress, "offrampAddress must match");
+ assertEq(a.rmnHomeAddress, b.rmnHomeAddress, "rmnHomeAddress must match");
assertEq(a.nodes.length, b.nodes.length, "nodes length must match");
assertEq(a.offchainConfig, b.offchainConfig, "offchainConfig must match");
@@ -375,7 +376,8 @@ contract CCIPConfig_validateConfig is CCIPConfigSetup {
return CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: FRoleDON,
@@ -437,6 +439,22 @@ contract CCIPConfig_validateConfig is CCIPConfigSetup {
s_ccipCC.validateConfig(config);
}
+ function test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() public {
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.rmnHomeAddress = ""; // invalid
+
+ vm.expectRevert(CCIPConfig.RMNHomeAddressCannotBeZero.selector);
+ s_ccipCC.validateConfig(config);
+ }
+
+ function test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() public {
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.rmnHomeAddress = abi.encode(address(0)); // invalid
+
+ vm.expectRevert(CCIPConfig.RMNHomeAddressCannotBeZero.selector);
+ s_ccipCC.validateConfig(config);
+ }
+
function test__validateConfig_ChainSelectorNotFound_Reverts() public {
CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
config.chainSelector = 2; // not set
@@ -599,7 +617,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -646,7 +665,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
for (uint256 i = 0; i < numCommitCfgs; i++) {
cfgs[i] = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -657,7 +677,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
for (uint256 i = 0; i < numExecCfgs; i++) {
cfgs[numCommitCfgs + i] = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Execution,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -687,7 +708,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](1);
newConfig[0] = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -717,7 +739,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -726,7 +749,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
});
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -789,7 +813,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -798,7 +823,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
});
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -843,7 +869,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -867,7 +894,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -876,7 +904,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
});
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -911,7 +940,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -920,7 +950,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
});
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -966,7 +997,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
for (uint256 i = 0; i < 3; i++) {
cfgs[i] = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(p2pIds, signers, transmitters),
FRoleDON: 1,
@@ -986,7 +1018,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
for (uint256 i = 0; i < 3; i++) {
cfgs[i] = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Execution,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(p2pIds, signers, transmitters),
FRoleDON: 1,
@@ -1008,7 +1041,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
// p2pIds: _makeBytes32Array(4, 0),
@@ -1035,7 +1069,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
FRoleDON: 1,
@@ -1044,7 +1079,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
});
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
// p2pIds: _makeBytes32Array(4, 0),
@@ -1088,7 +1124,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
FRoleDON: 1,
@@ -1097,7 +1134,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
});
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
FRoleDON: 1,
@@ -1132,7 +1170,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
FRoleDON: 1,
@@ -1141,7 +1180,8 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
});
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
FRoleDON: 1,
@@ -1194,7 +1234,8 @@ contract CCIPConfig_updatePluginConfig is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -1228,7 +1269,8 @@ contract CCIPConfig_updatePluginConfig is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -1242,7 +1284,8 @@ contract CCIPConfig_updatePluginConfig is CCIPConfigSetup {
s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, startConfigs);
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -1283,7 +1326,8 @@ contract CCIPConfig_updatePluginConfig is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -1297,7 +1341,8 @@ contract CCIPConfig_updatePluginConfig is CCIPConfigSetup {
s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, startConfigs);
CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -1366,7 +1411,8 @@ contract CCIPConfig_beforeCapabilityConfigSet is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -1395,7 +1441,8 @@ contract CCIPConfig_beforeCapabilityConfigSet is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Execution,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -1426,7 +1473,8 @@ contract CCIPConfig_beforeCapabilityConfigSet is CCIPConfigSetup {
uint32 donId = 1;
CCIPConfigTypes.OCR3Config memory blueCommitConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
@@ -1435,7 +1483,8 @@ contract CCIPConfig_beforeCapabilityConfigSet is CCIPConfigSetup {
});
CCIPConfigTypes.OCR3Config memory blueExecConfig = CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Execution,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
chainSelector: 1,
nodes: nodes,
FRoleDON: 1,
diff --git a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go b/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
index 990209e958..d13dadc2b0 100644
--- a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
+++ b/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
@@ -47,6 +47,7 @@ type CCIPConfigTypesOCR3Config struct {
FRoleDON uint8
OffchainConfigVersion uint64
OfframpAddress []byte
+ RmnHomeAddress []byte
Nodes []CCIPConfigTypesOCR3Node
OffchainConfig []byte
}
@@ -64,8 +65,8 @@ type CCIPConfigTypesOCR3Node struct {
}
var CCIPConfigMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidConfigLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"currentState\",\"type\":\"uint8\"},{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"proposedState\",\"type\":\"uint8\"}],\"name\":\"InvalidConfigStateTransition\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Node\",\"name\":\"node\",\"type\":\"tuple\"}],\"name\":\"InvalidNode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentConfigTransition\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOCR3Configs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"}],\"name\":\"WrongConfigCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigestBlueGreen\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"components\":[{\"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\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"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\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilityRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumChainConfigurations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getOCRConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b506040516200410a3803806200410a8339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b608051613f08620002026000396000818161010301528181610e5c01526110cc0152613f086000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638318ed5d11610081578063f2fde38b1161005b578063f2fde38b14610230578063f442c89a14610243578063fba64a7c1461025657600080fd5b80638318ed5d146101d15780638da5cb5b146101f2578063b74b23561461021057600080fd5b80634bd0473f116100b25780634bd0473f1461019157806379ba5097146101b15780637ac0d41e146101bb57600080fd5b806301ffc9a7146100d9578063020330e614610101578063181f5a7714610148575b600080fd5b6100ec6100e7366004612d37565b610269565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b6101846040518060400160405280601481526020017f43434950436f6e66696720312e362e302d64657600000000000000000000000081525081565b6040516100f89190612ddd565b6101a461019f366004612e21565b610302565b6040516100f89190612f45565b6101b96106fd565b005b6101c36107ff565b6040519081526020016100f8565b6101846101df3660046130b7565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff16610123565b61022361021e3660046130d4565b610810565b6040516100f89190613164565b6101b961023e3660046131f4565b610a91565b6101b9610251366004613276565b610aa5565b6101b96102643660046132fa565b610e44565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea7210000000000000000000000000000000000000000000000000000000014806102fc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b63ffffffff8216600090815260056020526040812060609183600181111561032c5761032c612e56565b600181111561033d5761033d612e56565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106f157600084815260209020604080516101408101909152600684029091018054829060608201908390829060ff1660018111156103b0576103b0612e56565b60018111156103c1576103c1612e56565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610419906133b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610445906133b7565b80156104925780601f1061046757610100808354040283529160200191610492565b820191906000526020600020905b81548152906001019060200180831161047557829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156106205783829060005260206000209060030201604051806060016040529081600082015481526020016001820180546104fd906133b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610529906133b7565b80156105765780601f1061054b57610100808354040283529160200191610576565b820191906000526020600020905b81548152906001019060200180831161055957829003601f168201915b5050505050815260200160028201805461058f906133b7565b80601f01602080910402602001604051908101604052809291908181526020018280546105bb906133b7565b80156106085780601f106105dd57610100808354040283529160200191610608565b820191906000526020600020905b8154815290600101906020018083116105eb57829003601f168201915b505050505081525050815260200190600101906104c0565b505050508152602001600382018054610638906133b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610664906133b7565b80156106b15780601f10610686576101008083540402835291602001916106b1565b820191906000526020600020905b81548152906001019060200180831161069457829003601f168201915b505050919092525050508152600482015467ffffffffffffffff16602080830191909152600590920154604090910152908252600192909201910161036b565b50505050905092915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600061080b6003610eff565b905090565b6060600061081e6003610eff565b9050600061082c8486613439565b905083158061083b5750818110155b1561087b576040805160008082526020820190925290610871565b61085e612b31565b8152602001906001900390816108565790505b50925050506102fc565b6000610887858361347f565b9050828111156108945750815b60006108a08383613492565b67ffffffffffffffff8111156108b8576108b8613450565b6040519080825280602002602001820160405280156108f157816020015b6108de612b31565b8152602001906001900390816108d65790505b50905060006109006003610f09565b9050835b83811015610a84576000828281518110610920576109206134a5565b60209081029190910181015160408051808201825267ffffffffffffffff8316808252600090815260028552829020825181546080818802830181019095526060820181815295975092958601949093919284928491908401828280156109a657602002820191906000526020600020905b815481526020019060010190808311610992575b5050509183525050600182015460ff1660208201526002820180546040909201916109d0906133b7565b80601f01602080910402602001604051908101604052809291908181526020018280546109fc906133b7565b8015610a495780601f10610a1e57610100808354040283529160200191610a49565b820191906000526020600020905b815481529060010190602001808311610a2c57829003601f168201915b50505091909252505050905284610a608885613492565b81518110610a7057610a706134a5565b602090810291909101015250600101610904565b5090979650505050505050565b610a99610f1d565b610aa281610fa0565b50565b610aad610f1d565b60005b83811015610c9357610af4858583818110610acd57610acd6134a5565b9050602002016020810190610ae291906134d4565b60039067ffffffffffffffff16611095565b610b5e57848482818110610b0a57610b0a6134a5565b9050602002016020810190610b1f91906134d4565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161077a565b60026000868684818110610b7457610b746134a5565b9050602002016020810190610b8991906134d4565b67ffffffffffffffff1681526020810191909152604001600090812090610bb08282612b79565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610be8600283016000612b97565b5050610c26858583818110610bff57610bff6134a5565b9050602002016020810190610c1491906134d4565b60039067ffffffffffffffff166110ad565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110610c5a57610c5a6134a5565b9050602002016020810190610c6f91906134d4565b60405167ffffffffffffffff909116815260200160405180910390a1600101610ab0565b5060005b81811015610e3d576000838383818110610cb357610cb36134a5565b9050602002810190610cc591906134ef565b610cd390602081019061352d565b610cdc906136bf565b90506000848484818110610cf257610cf26134a5565b9050602002810190610d0491906134ef565b610d129060208101906134d4565b9050610d2182600001516110b9565b816020015160ff16600003610d62576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600260209081526040909120835180518593610d92928492910190612bd1565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560408201516002820190610ddf90826137e7565b50610df991506003905067ffffffffffffffff8316611205565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051610e2b929190613901565b60405180910390a15050600101610c97565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb3576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eca610ec586880188613a3f565b611211565b8151919350915015610ee257610ee28360008461143e565b805115610ef557610ef58360018361143e565b5050505050505050565b60006102fc825490565b60606000610f1683611c70565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161077a565b565b3373ffffffffffffffffffffffffffffffffffffffff82160361101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161077a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515610f16565b6000610f168383611ccc565b60005b81518110156112015760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe848481518110611118576111186134a5565b60200260200101516040518263ffffffff1660e01b815260040161113e91815260200190565b600060405180830381865afa15801561115b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526111a19190810190613c44565b60800151036111f9578181815181106111bc576111bc6134a5565b60200260200101516040517f8907a4fa00000000000000000000000000000000000000000000000000000000815260040161077a91815260200190565b6001016110bc565b5050565b6000610f168383611dc6565b606080600460ff1683511115611253576040517f8854586400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028082526060820190925290816020015b6112c16040805160e081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081525090565b81526020019060019003908161126957505060408051600280825260608201909252919350602082015b6113436040805160e081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081525090565b8152602001906001900390816112eb57905050905060008060005b855181101561143157600086828151811061137b5761137b6134a5565b602002602001015160000151600181111561139857611398612e56565b036113e5578581815181106113af576113af6134a5565b60200260200101518584815181106113c9576113c96134a5565b6020026020010181905250826113de90613d1c565b9250611429565b8581815181106113f7576113f76134a5565b6020026020010151848381518110611411576114116134a5565b60200260200101819052508161142690613d1c565b91505b60010161135e565b5090835281529092909150565b63ffffffff831660009081526005602052604081208184600181111561146657611466612e56565b600181111561147757611477612e56565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561182b57600084815260209020604080516101408101909152600684029091018054829060608201908390829060ff1660018111156114ea576114ea612e56565b60018111156114fb576114fb612e56565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191611553906133b7565b80601f016020809104026020016040519081016040528092919081815260200182805461157f906133b7565b80156115cc5780601f106115a1576101008083540402835291602001916115cc565b820191906000526020600020905b8154815290600101906020018083116115af57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561175a578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054611637906133b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611663906133b7565b80156116b05780601f10611685576101008083540402835291602001916116b0565b820191906000526020600020905b81548152906001019060200180831161169357829003601f168201915b505050505081526020016002820180546116c9906133b7565b80601f01602080910402602001604051908101604052809291908181526020018280546116f5906133b7565b80156117425780601f1061171757610100808354040283529160200191611742565b820191906000526020600020905b81548152906001019060200180831161172557829003601f168201915b505050505081525050815260200190600101906115fa565b505050508152602001600382018054611772906133b7565b80601f016020809104026020016040519081016040528092919081815260200182805461179e906133b7565b80156117eb5780601f106117c0576101008083540402835291602001916117eb565b820191906000526020600020905b8154815290600101906020018083116117ce57829003601f168201915b505050919092525050508152600482015467ffffffffffffffff1660208083019190915260059092015460409091015290825260019290920191016114a5565b505050509050600061183d8251611e15565b9050600061184b8451611e15565b90506118578282611e67565b60006118668785878686611f23565b905061187284826122f7565b63ffffffff871660009081526005602052604081209087600181111561189a5761189a612e56565b60018111156118ab576118ab612e56565b815260200190815260200160002060006118c59190612c1c565b60005b8151811015611c135763ffffffff88166000908152600560205260408120818960018111156118f9576118f9612e56565b600181111561190a5761190a612e56565b8152602001908152602001600020600181600181540180825580915050039060005260206000209060060201905082828151811061194a5761194a6134a5565b6020026020010151604001518160050181905550828281518110611970576119706134a5565b6020026020010151602001518160040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081600001905060008484815181106119c2576119c26134a5565b602090810291909101015151805183549192509083907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018381811115611a0d57611a0d612e56565b021790555060208101518254604083015160608401517fffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff90921661010067ffffffffffffffff948516027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000060ff90921691909102177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a0100000000000000000000929091169190910217825560808101516001830190611adc90826137e7565b5060c08101516003830190611af190826137e7565b505b60a08101515160028301541115611b725781600201805480611b1757611b17613d54565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815590611b5b6001830182612b97565b611b69600283016000612b97565b50509055611af3565b60005b8160a0015151811015611c045760028301548110611bfc57826002018260a001518281518110611ba757611ba76134a5565b6020908102919091018101518254600181810185556000948552938390208251600390920201908155918101519092820190611be390826137e7565b5060408201516002820190611bf890826137e7565b5050505b600101611b75565b505050508060010190506118c8565b50856001811115611c2657611c26612e56565b60ff168763ffffffff167f0fe4c45ffc7f05233ddfee7d79ac01d075176a0aa116068c486a2f7490088a0b83604051611c5f9190612f45565b60405180910390a350505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611cc057602002820191906000526020600020905b815481526020019060010190808311611cac575b50505050509050919050565b60008181526001830160205260408120548015611db5576000611cf0600183613492565b8554909150600090611d0490600190613492565b9050808214611d69576000866000018281548110611d2457611d246134a5565b9060005260206000200154905080876000018481548110611d4757611d476134a5565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611d7a57611d7a613d54565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506102fc565b60009150506102fc565b5092915050565b6000818152600183016020526040812054611e0d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556102fc565b5060006102fc565b60006002821115611e55576040517f3e4785260000000000000000000000000000000000000000000000000000000081526004810183905260240161077a565b8160028111156102fc576102fc612e56565b6000826002811115611e7b57611e7b612e56565b826002811115611e8d57611e8d612e56565b611e979190613d83565b90508060011480611ee35750807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff148015611ee357506002836002811115611ee157611ee1612e56565b145b15611eed57505050565b82826040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161077a929190613db3565b60606000845167ffffffffffffffff811115611f4157611f41613450565b604051908082528060200260200182016040528015611f6a578160200160208202803683370190505b5090506000846002811115611f8157611f81612e56565b148015611f9f57506001836002811115611f9d57611f9d612e56565b145b15611fe057600181600081518110611fb957611fb96134a5565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050612148565b6001846002811115611ff457611ff4612e56565b1480156120125750600283600281111561201057612010612e56565b145b156120a9578560008151811061202a5761202a6134a5565b60200260200101516020015181600081518110612049576120496134a5565b602002602001019067ffffffffffffffff16908167ffffffffffffffff16815250508560008151811061207e5761207e6134a5565b60200260200101516020015160016120969190613dce565b81600181518110611fb957611fb96134a5565b60028460028111156120bd576120bd612e56565b1480156120db575060018360028111156120d9576120d9612e56565b145b1561211257856001815181106120f3576120f36134a5565b60200260200101516020015181600081518110611fb957611fb96134a5565b83836040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161077a929190613db3565b6000855167ffffffffffffffff81111561216457612164613450565b60405190808252806020026020018201604052801561220257816020015b6040805161014081018252600060608083018281526080840183905260a0840183905260c0840183905260e084018290526101008401829052610120840191909152825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816121825790505b50905060005b82518110156122eb57612233878281518110612226576122266134a5565b6020026020010151612676565b6040518060600160405280888381518110612250576122506134a5565b6020026020010151815260200184838151811061226f5761226f6134a5565b602002602001015167ffffffffffffffff1681526020016122c38b86858151811061229c5761229c6134a5565b60200260200101518b86815181106122b6576122b66134a5565b6020026020010151612a70565b8152508282815181106122d8576122d86134a5565b6020908102919091010152600101612208565b50979650505050505050565b81518151811580156123095750806001145b156123ab5782600081518110612321576123216134a5565b60200260200101516020015167ffffffffffffffff166001146123a55782600081518110612351576123516134a5565b60209081029190910181015101516040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001602482015260440161077a565b50505050565b8160011480156123bb5750806002145b1561257157836000815181106123d3576123d36134a5565b602002602001015160400151836000815181106123f2576123f26134a5565b6020026020010151604001511461247e5782600081518110612416576124166134a5565b60200260200101516040015184600081518110612435576124356134a5565b6020026020010151604001516040517fc7ccdd7f00000000000000000000000000000000000000000000000000000000815260040161077a929190918252602082015260400190565b83600081518110612491576124916134a5565b60200260200101516020015160016124a99190613dce565b67ffffffffffffffff16836001815181106124c6576124c66134a5565b60200260200101516020015167ffffffffffffffff16146123a557826001815181106124f4576124f46134a5565b60200260200101516020015184600081518110612513576125136134a5565b602002602001015160200151600161252b9190613dce565b6040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff92831660048201529116602482015260440161077a565b8160021480156125815750806001145b156126445783600181518110612599576125996134a5565b602002602001015160400151836000815181106125b8576125b86134a5565b602002602001015160400151146123a557826000815181106125dc576125dc6134a5565b602002602001015160400151846001815181106125fb576125fb6134a5565b6020026020010151604001516040517f9e97567000000000000000000000000000000000000000000000000000000000815260040161077a929190918252602082015260400190565b6040517f1f1b2bb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff166000036126be576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815160018111156126d3576126d3612e56565b141580156126f457506001815160018111156126f1576126f1612e56565b14155b1561272b576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080810151511580612768575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b1561279f576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516127ba9060039067ffffffffffffffff16611095565b6128025760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161077a565b60408082015160208084015167ffffffffffffffff1660009081526002909152919091206001015460ff918216911681811115612875576040517f2db22040000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161077a565b60a0830151516101008111156128b7576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c2836003613439565b81116128fa576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808267ffffffffffffffff81111561291657612916613450565b60405190808252806020026020018201604052801561293f578160200160208202803683370190505b50905060005b838110156129ff5760008760a001518281518110612965576129656134a5565b6020026020010151905080604001515160001461298a578361298681613d1c565b9450505b602081015151158061299b57508051155b156129d457806040517f9fa4031400000000000000000000000000000000000000000000000000000000815260040161077a9190613def565b80600001518383815181106129eb576129eb6134a5565b602090810291909101015250600101612945565b506000612a0d856003613439565b612a1890600161347f565b905080831015612a5e576040517f548dd21f000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077a565b612a67826110b9565b50505050505050565b60008082602001518584600001518560800151878760a00151886040015189606001518a60c00151604051602001612ab099989796959493929190613e02565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0a000000000000000000000000000000000000000000000000000000000000179150509392505050565b6040518060400160405280600067ffffffffffffffff168152602001612b74604051806060016040528060608152602001600060ff168152602001606081525090565b905290565b5080546000825590600052602060002090810190610aa29190612c3d565b508054612ba3906133b7565b6000825580601f10612bb3575050565b601f016020900490600052602060002090810190610aa29190612c3d565b828054828255906000526020600020908101928215612c0c579160200282015b82811115612c0c578251825591602001919060010190612bf1565b50612c18929150612c3d565b5090565b5080546000825560060290600052602060002090810190610aa29190612c52565b5b80821115612c185760008155600101612c3e565b80821115612c185780547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560008181612c916001830182612b97565b612c9f600283016000612ce9565b612cad600383016000612b97565b5050506004810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905560006005820155600601612c52565b5080546000825560030290600052602060002090810190610aa291905b80821115612c18576000808255612d206001830182612b97565b612d2e600283016000612b97565b50600301612d06565b600060208284031215612d4957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f1657600080fd5b6000815180845260005b81811015612d9f57602081850181015186830182015201612d83565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610f166020830184612d79565b63ffffffff81168114610aa257600080fd5b8035612e0d81612df0565b919050565b803560028110612e0d57600080fd5b60008060408385031215612e3457600080fd5b8235612e3f81612df0565b9150612e4d60208401612e12565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110612e9557612e95612e56565b9052565b805182526000602082015160606020850152612eb86060850182612d79565b905060408301518482036040860152612ed18282612d79565b95945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015610a84577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952612f33838351612e99565b98840198925090830190600101612ef9565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156130a9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160608151818652612fb38287018251612e85565b89810151608067ffffffffffffffff8216818901528a830151915060a060ff8316818a015284840151945060c09250612ff7838a018667ffffffffffffffff169052565b81840151945060e0915081828a01526130146101408a0186612d79565b9450808401519150507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa080898603016101008a01526130538583612eda565b92909301518883039093016101208901525091506130718282612d79565b9150508882015161308d8a87018267ffffffffffffffff169052565b5090870151938701939093529386019390860190600101612f6e565b509098975050505050505050565b6000602082840312156130c957600080fd5b8135610f1681612df0565b600080604083850312156130e757600080fd5b50508035926020909101359150565b805160608084528151908401819052600091602091908201906080860190845b8181101561313257835183529284019291840191600101613116565b505060ff602086015116602087015260408501519250858103604087015261315a8184612d79565b9695505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156130a9578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff1684528701518784018790526131e1878501826130f6565b958801959350509086019060010161318d565b60006020828403121561320657600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610f1657600080fd5b60008083601f84011261323c57600080fd5b50813567ffffffffffffffff81111561325457600080fd5b6020830191508360208260051b850101111561326f57600080fd5b9250929050565b6000806000806040858703121561328c57600080fd5b843567ffffffffffffffff808211156132a457600080fd5b6132b08883890161322a565b909650945060208701359150808211156132c957600080fd5b506132d68782880161322a565b95989497509550505050565b803567ffffffffffffffff81168114612e0d57600080fd5b6000806000806000806080878903121561331357600080fd5b863567ffffffffffffffff8082111561332b57600080fd5b6133378a838b0161322a565b9098509650602089013591508082111561335057600080fd5b818901915089601f83011261336457600080fd5b81358181111561337357600080fd5b8a602082850101111561338557600080fd5b60208301965080955050505061339d604088016132e2565b91506133ab60608801612e02565b90509295509295509295565b600181811c908216806133cb57607f821691505b602082108103613404577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176102fc576102fc61340a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b808201808211156102fc576102fc61340a565b818103818111156102fc576102fc61340a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156134e657600080fd5b610f16826132e2565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261352357600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261352357600080fd5b6040516060810167ffffffffffffffff8111828210171561358457613584613450565b60405290565b60405160e0810167ffffffffffffffff8111828210171561358457613584613450565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135f4576135f4613450565b604052919050565b600067ffffffffffffffff82111561361657613616613450565b5060051b60200190565b803560ff81168114612e0d57600080fd5b600082601f83011261364257600080fd5b813567ffffffffffffffff81111561365c5761365c613450565b61368d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016135ad565b8181528460208386010111156136a257600080fd5b816020850160208301376000918101602001919091529392505050565b6000606082360312156136d157600080fd5b6136d9613561565b823567ffffffffffffffff808211156136f157600080fd5b9084019036601f83011261370457600080fd5b81356020613719613714836135fc565b6135ad565b82815260059290921b8401810191818101903684111561373857600080fd5b948201945b838610156137565785358252948201949082019061373d565b865250613764878201613620565b9085015250604085013591508082111561377d57600080fd5b5061378a36828601613631565b60408301525092915050565b601f8211156137e2576000816000526020600020601f850160051c810160208610156137bf5750805b601f850160051c820191505b818110156137de578281556001016137cb565b5050505b505050565b815167ffffffffffffffff81111561380157613801613450565b6138158161380f84546133b7565b84613796565b602080601f83116001811461386857600084156138325750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556137de565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156138b557888601518255948401946001909101908401613896565b50858210156138f157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff8316815260406020820152600061392460408301846130f6565b949350505050565b600082601f83011261393d57600080fd5b8135602061394d613714836135fc565b82815260059290921b8401810191818101908684111561396c57600080fd5b8286015b84811015613a3457803567ffffffffffffffff808211156139915760008081fd5b81890191506060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d030112156139ca5760008081fd5b6139d2613561565b878401358152604080850135848111156139ec5760008081fd5b6139fa8e8b83890101613631565b838b015250918401359183831115613a125760008081fd5b613a208d8a85880101613631565b908201528652505050918301918301613970565b509695505050505050565b60006020808385031215613a5257600080fd5b823567ffffffffffffffff80821115613a6a57600080fd5b818501915085601f830112613a7e57600080fd5b8135613a8c613714826135fc565b81815260059190911b83018401908481019088831115613aab57600080fd5b8585015b83811015613bcd57803585811115613ac657600080fd5b860160e0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215613afb5760008081fd5b613b0361358a565b613b0e898301612e12565b81526040613b1d8184016132e2565b8a8301526060613b2e818501613620565b8284015260809150613b418285016132e2565b9083015260a08381013589811115613b595760008081fd5b613b678f8d83880101613631565b838501525060c091508184013589811115613b825760008081fd5b613b908f8d8388010161392c565b82850152505060e083013588811115613ba95760008081fd5b613bb78e8c83870101613631565b9183019190915250845250918601918601613aaf565b5098975050505050505050565b8051612e0d81612df0565b600082601f830112613bf657600080fd5b81516020613c06613714836135fc565b8083825260208201915060208460051b870101935086841115613c2857600080fd5b602086015b84811015613a345780518352918301918301613c2d565b600060208284031215613c5657600080fd5b815167ffffffffffffffff80821115613c6e57600080fd5b9083019060e08286031215613c8257600080fd5b613c8a61358a565b613c9383613bda565b8152613ca160208401613bda565b6020820152613cb260408401613bda565b6040820152606083015160608201526080830151608082015260a083015182811115613cdd57600080fd5b613ce987828601613be5565b60a08301525060c083015182811115613d0157600080fd5b613d0d87828601613be5565b60c08301525095945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4d57613d4d61340a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8181036000831280158383131683831282161715611dbf57611dbf61340a565b60038110612e9557612e95612e56565b60408101613dc18285613da3565b610f166020830184613da3565b67ffffffffffffffff818116838216019080821115611dbf57611dbf61340a565b602081526000610f166020830184612e99565b600061012067ffffffffffffffff808d168452602063ffffffff8d1681860152613e2f604086018d612e85565b826060860152613e418386018c612d79565b918a16608086015284820360a0860152885180835291925080830191600581901b84018201828b0160005b83811015613eb8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0878403018652613ea6838351612e99565b95850195925090840190600101613e6c565b505060ff8a1660c088015267ffffffffffffffff891660e0880152868103610100880152613ee68189612d79565b955050505050509a995050505050505050505056fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidConfigLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"currentState\",\"type\":\"uint8\"},{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"proposedState\",\"type\":\"uint8\"}],\"name\":\"InvalidConfigStateTransition\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Node\",\"name\":\"node\",\"type\":\"tuple\"}],\"name\":\"InvalidNode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentConfigTransition\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RMNHomeAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOCR3Configs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"}],\"name\":\"WrongConfigCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigestBlueGreen\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"components\":[{\"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\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"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\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilityRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumChainConfigurations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getOCRConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"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\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60a06040523480156200001157600080fd5b5060405162004367380380620043678339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b608051614165620002026000396000818161010301528181610eee015261115e01526141656000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638318ed5d11610081578063f2fde38b1161005b578063f2fde38b14610230578063f442c89a14610243578063fba64a7c1461025657600080fd5b80638318ed5d146101d15780638da5cb5b146101f2578063b74b23561461021057600080fd5b80634bd0473f116100b25780634bd0473f1461019157806379ba5097146101b15780637ac0d41e146101bb57600080fd5b806301ffc9a7146100d9578063020330e614610101578063181f5a7714610148575b600080fd5b6100ec6100e7366004612f10565b610269565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b6101846040518060400160405280601481526020017f43434950436f6e66696720312e362e302d64657600000000000000000000000081525081565b6040516100f89190612fb6565b6101a461019f366004612ffa565b610302565b6040516100f8919061311e565b6101b961078f565b005b6101c3610891565b6040519081526020016100f8565b6101846101df3660046132bb565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff16610123565b61022361021e3660046132d8565b6108a2565b6040516100f89190613368565b6101b961023e3660046133f8565b610b23565b6101b961025136600461347a565b610b37565b6101b96102643660046134fe565b610ed6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea7210000000000000000000000000000000000000000000000000000000014806102fc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b63ffffffff8216600090815260056020526040812060609183600181111561032c5761032c61302f565b600181111561033d5761033d61302f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561078357600084815260209020604080516101608101909152600784029091018054829060608201908390829060ff1660018111156103b0576103b061302f565b60018111156103c1576103c161302f565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610419906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610445906135bb565b80156104925780601f1061046757610100808354040283529160200191610492565b820191906000526020600020905b81548152906001019060200180831161047557829003601f168201915b505050505081526020016002820180546104ab906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546104d7906135bb565b80156105245780601f106104f957610100808354040283529160200191610524565b820191906000526020600020905b81548152906001019060200180831161050757829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b828210156106b257838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461058f906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546105bb906135bb565b80156106085780601f106105dd57610100808354040283529160200191610608565b820191906000526020600020905b8154815290600101906020018083116105eb57829003601f168201915b50505050508152602001600282018054610621906135bb565b80601f016020809104026020016040519081016040528092919081815260200182805461064d906135bb565b801561069a5780601f1061066f5761010080835404028352916020019161069a565b820191906000526020600020905b81548152906001019060200180831161067d57829003601f168201915b50505050508152505081526020019060010190610552565b5050505081526020016004820180546106ca906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546106f6906135bb565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b505050919092525050508152600582015467ffffffffffffffff16602080830191909152600690920154604090910152908252600192909201910161036b565b50505050905092915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600061089d6003610f91565b905090565b606060006108b06003610f91565b905060006108be848661363d565b90508315806108cd5750818110155b1561090d576040805160008082526020820190925290610903565b6108f0612cfc565b8152602001906001900390816108e85790505b50925050506102fc565b60006109198583613683565b9050828111156109265750815b60006109328383613696565b67ffffffffffffffff81111561094a5761094a613654565b60405190808252806020026020018201604052801561098357816020015b610970612cfc565b8152602001906001900390816109685790505b50905060006109926003610f9b565b9050835b83811015610b165760008282815181106109b2576109b26136a9565b60209081029190910181015160408051808201825267ffffffffffffffff831680825260009081526002855282902082518154608081880283018101909552606082018181529597509295860194909391928492849190840182828015610a3857602002820191906000526020600020905b815481526020019060010190808311610a24575b5050509183525050600182015460ff166020820152600282018054604090920191610a62906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8e906135bb565b8015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b50505091909252505050905284610af28885613696565b81518110610b0257610b026136a9565b602090810291909101015250600101610996565b5090979650505050505050565b610b2b610faf565b610b3481611032565b50565b610b3f610faf565b60005b83811015610d2557610b86858583818110610b5f57610b5f6136a9565b9050602002016020810190610b7491906136d8565b60039067ffffffffffffffff16611127565b610bf057848482818110610b9c57610b9c6136a9565b9050602002016020810190610bb191906136d8565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161080c565b60026000868684818110610c0657610c066136a9565b9050602002016020810190610c1b91906136d8565b67ffffffffffffffff1681526020810191909152604001600090812090610c428282612d44565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610c7a600283016000612d62565b5050610cb8858583818110610c9157610c916136a9565b9050602002016020810190610ca691906136d8565b60039067ffffffffffffffff1661113f565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110610cec57610cec6136a9565b9050602002016020810190610d0191906136d8565b60405167ffffffffffffffff909116815260200160405180910390a1600101610b42565b5060005b81811015610ecf576000838383818110610d4557610d456136a9565b9050602002810190610d5791906136f3565b610d65906020810190613731565b610d6e906138e7565b90506000848484818110610d8457610d846136a9565b9050602002810190610d9691906136f3565b610da49060208101906136d8565b9050610db3826000015161114b565b816020015160ff16600003610df4576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600260209081526040909120835180518593610e24928492910190612d9c565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560408201516002820190610e719082613a0f565b50610e8b91506003905067ffffffffffffffff8316611297565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051610ebd929190613b29565b60405180910390a15050600101610d29565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f45576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f5c610f5786880188613c67565b6112a3565b8151919350915015610f7457610f74836000846114e0565b805115610f8757610f87836001836114e0565b5050505050505050565b60006102fc825490565b60606000610fa883611db9565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161080c565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036110b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161080c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515610fa8565b6000610fa88383611e15565b60005b81518110156112935760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe8484815181106111aa576111aa6136a9565b60200260200101516040518263ffffffff1660e01b81526004016111d091815260200190565b600060405180830381865afa1580156111ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112339190810190613e8b565b608001510361128b5781818151811061124e5761124e6136a9565b60200260200101516040517f8907a4fa00000000000000000000000000000000000000000000000000000000815260040161080c91815260200190565b60010161114e565b5050565b6000610fa88383611f0f565b606080600460ff16835111156112e5576040517f8854586400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028082526060820190925290816020015b61135b6040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816112fb57505060408051600280825260608201909252919350602082015b6113e56040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161138557905050905060008060005b85518110156114d357600086828151811061141d5761141d6136a9565b602002602001015160000151600181111561143a5761143a61302f565b0361148757858181518110611451576114516136a9565b602002602001015185848151811061146b5761146b6136a9565b60200260200101819052508261148090613f63565b92506114cb565b858181518110611499576114996136a9565b60200260200101518483815181106114b3576114b36136a9565b6020026020010181905250816114c890613f63565b91505b600101611400565b5090835281529092909150565b63ffffffff83166000908152600560205260408120818460018111156115085761150861302f565b60018111156115195761151961302f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561195f57600084815260209020604080516101608101909152600784029091018054829060608201908390829060ff16600181111561158c5761158c61302f565b600181111561159d5761159d61302f565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916115f5906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611621906135bb565b801561166e5780601f106116435761010080835404028352916020019161166e565b820191906000526020600020905b81548152906001019060200180831161165157829003601f168201915b50505050508152602001600282018054611687906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546116b3906135bb565b80156117005780601f106116d557610100808354040283529160200191611700565b820191906000526020600020905b8154815290600101906020018083116116e357829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561188e57838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461176b906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611797906135bb565b80156117e45780601f106117b9576101008083540402835291602001916117e4565b820191906000526020600020905b8154815290600101906020018083116117c757829003601f168201915b505050505081526020016002820180546117fd906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611829906135bb565b80156118765780601f1061184b57610100808354040283529160200191611876565b820191906000526020600020905b81548152906001019060200180831161185957829003601f168201915b5050505050815250508152602001906001019061172e565b5050505081526020016004820180546118a6906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546118d2906135bb565b801561191f5780601f106118f45761010080835404028352916020019161191f565b820191906000526020600020905b81548152906001019060200180831161190257829003601f168201915b505050919092525050508152600582015467ffffffffffffffff166020808301919091526006909201546040909101529082526001929092019101611547565b50505050905060006119718251611f5e565b9050600061197f8451611f5e565b905061198b8282611fb0565b600061199a878587868661206c565b90506119a68482612448565b63ffffffff87166000908152600560205260408120908760018111156119ce576119ce61302f565b60018111156119df576119df61302f565b815260200190815260200160002060006119f99190612de7565b60005b8151811015611d5c5763ffffffff8816600090815260056020526040812081896001811115611a2d57611a2d61302f565b6001811115611a3e57611a3e61302f565b81526020019081526020016000206001816001815401808255809150500390600052602060002090600702019050828281518110611a7e57611a7e6136a9565b6020026020010151604001518160060181905550828281518110611aa457611aa46136a9565b6020026020010151602001518160050160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008160000190506000848481518110611af657611af66136a9565b602090810291909101015151805183549192509083907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018381811115611b4157611b4161302f565b021790555060208101518254604083015160608401517fffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff90921661010067ffffffffffffffff948516027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000060ff90921691909102177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a0100000000000000000000929091169190910217825560808101516001830190611c109082613a0f565b5060a08101516002830190611c259082613a0f565b5060e08101516004830190611c3a9082613a0f565b505b60c08101515160038301541115611cbb5781600301805480611c6057611c60613f9b565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815590611ca46001830182612d62565b611cb2600283016000612d62565b50509055611c3c565b60005b8160c0015151811015611d4d5760038301548110611d4557826003018260c001518281518110611cf057611cf06136a9565b6020908102919091018101518254600181810185556000948552938390208251600390920201908155918101519092820190611d2c9082613a0f565b5060408201516002820190611d419082613a0f565b5050505b600101611cbe565b505050508060010190506119fc565b50856001811115611d6f57611d6f61302f565b60ff168763ffffffff167ff4095525e757e2fec7f3d3ffb3482db215dbbc7e7c4f63a11e04529ea827171f83604051611da8919061311e565b60405180910390a350505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611e0957602002820191906000526020600020905b815481526020019060010190808311611df5575b50505050509050919050565b60008181526001830160205260408120548015611efe576000611e39600183613696565b8554909150600090611e4d90600190613696565b9050808214611eb2576000866000018281548110611e6d57611e6d6136a9565b9060005260206000200154905080876000018481548110611e9057611e906136a9565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611ec357611ec3613f9b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506102fc565b60009150506102fc565b5092915050565b6000818152600183016020526040812054611f56575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556102fc565b5060006102fc565b60006002821115611f9e576040517f3e4785260000000000000000000000000000000000000000000000000000000081526004810183905260240161080c565b8160028111156102fc576102fc61302f565b6000826002811115611fc457611fc461302f565b826002811115611fd657611fd661302f565b611fe09190613fca565b9050806001148061202c5750807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14801561202c5750600283600281111561202a5761202a61302f565b145b1561203657505050565b82826040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161080c929190613ffa565b60606000845167ffffffffffffffff81111561208a5761208a613654565b6040519080825280602002602001820160405280156120b3578160200160208202803683370190505b50905060008460028111156120ca576120ca61302f565b1480156120e8575060018360028111156120e6576120e661302f565b145b1561212957600181600081518110612102576121026136a9565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050612291565b600184600281111561213d5761213d61302f565b14801561215b575060028360028111156121595761215961302f565b145b156121f25785600081518110612173576121736136a9565b60200260200101516020015181600081518110612192576121926136a9565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050856000815181106121c7576121c76136a9565b60200260200101516020015160016121df9190614015565b81600181518110612102576121026136a9565b60028460028111156122065761220661302f565b148015612224575060018360028111156122225761222261302f565b145b1561225b578560018151811061223c5761223c6136a9565b60200260200101516020015181600081518110612102576121026136a9565b83836040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161080c929190613ffa565b6000855167ffffffffffffffff8111156122ad576122ad613654565b60405190808252806020026020018201604052801561235357816020015b6040805161016081018252600060608083018281526080840183905260a0840183905260c0840183905260e0840182905261010084018290526101208401829052610140840191909152825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816122cb5790505b50905060005b825181101561243c57612384878281518110612377576123776136a9565b60200260200101516127c7565b60405180606001604052808883815181106123a1576123a16136a9565b602002602001015181526020018483815181106123c0576123c06136a9565b602002602001015167ffffffffffffffff1681526020016124148b8685815181106123ed576123ed6136a9565b60200260200101518b8681518110612407576124076136a9565b6020026020010151612c35565b815250828281518110612429576124296136a9565b6020908102919091010152600101612359565b50979650505050505050565b815181518115801561245a5750806001145b156124fc5782600081518110612472576124726136a9565b60200260200101516020015167ffffffffffffffff166001146124f657826000815181106124a2576124a26136a9565b60209081029190910181015101516040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001602482015260440161080c565b50505050565b81600114801561250c5750806002145b156126c25783600081518110612524576125246136a9565b60200260200101516040015183600081518110612543576125436136a9565b602002602001015160400151146125cf5782600081518110612567576125676136a9565b60200260200101516040015184600081518110612586576125866136a9565b6020026020010151604001516040517fc7ccdd7f00000000000000000000000000000000000000000000000000000000815260040161080c929190918252602082015260400190565b836000815181106125e2576125e26136a9565b60200260200101516020015160016125fa9190614015565b67ffffffffffffffff1683600181518110612617576126176136a9565b60200260200101516020015167ffffffffffffffff16146124f65782600181518110612645576126456136a9565b60200260200101516020015184600081518110612664576126646136a9565b602002602001015160200151600161267c9190614015565b6040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff92831660048201529116602482015260440161080c565b8160021480156126d25750806001145b1561279557836001815181106126ea576126ea6136a9565b60200260200101516040015183600081518110612709576127096136a9565b602002602001015160400151146124f6578260008151811061272d5761272d6136a9565b6020026020010151604001518460018151811061274c5761274c6136a9565b6020026020010151604001516040517f9e97567000000000000000000000000000000000000000000000000000000000815260040161080c929190918252602082015260400190565b6040517f1f1b2bb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff1660000361280f576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815160018111156128245761282461302f565b1415801561284557506001815160018111156128425761284261302f565b14155b1561287c576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60808101515115806128b9575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b156128f0576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a081015151158061292d5750604080516000602082015201604051602081830303815290604052805190602001208160a0015180519060200120145b15612964576040517fdee9857400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015161297f9060039067ffffffffffffffff16611127565b6129c75760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161080c565b60408082015160208084015167ffffffffffffffff1660009081526002909152919091206001015460ff918216911681811115612a3a576040517f2db22040000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161080c565b60c083015151610100811115612a7c576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a8783600361363d565b8111612abf576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808267ffffffffffffffff811115612adb57612adb613654565b604051908082528060200260200182016040528015612b04578160200160208202803683370190505b50905060005b83811015612bc45760008760c001518281518110612b2a57612b2a6136a9565b60200260200101519050806040015151600014612b4f5783612b4b81613f63565b9450505b6020810151511580612b6057508051155b15612b9957806040517f9fa4031400000000000000000000000000000000000000000000000000000000815260040161080c9190614036565b8060000151838381518110612bb057612bb06136a9565b602090810291909101015250600101612b0a565b506000612bd285600361363d565b612bdd906001613683565b905080831015612c23576040517f548dd21f000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b612c2c8261114b565b50505050505050565b600080826020015185846000015185608001518660a00151888860c0015189604001518a606001518b60e00151604051602001612c7b9a99989796959493929190614049565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0a000000000000000000000000000000000000000000000000000000000000179150509392505050565b6040518060400160405280600067ffffffffffffffff168152602001612d3f604051806060016040528060608152602001600060ff168152602001606081525090565b905290565b5080546000825590600052602060002090810190610b349190612e08565b508054612d6e906135bb565b6000825580601f10612d7e575050565b601f016020900490600052602060002090810190610b349190612e08565b828054828255906000526020600020908101928215612dd7579160200282015b82811115612dd7578251825591602001919060010190612dbc565b50612de3929150612e08565b5090565b5080546000825560070290600052602060002090810190610b349190612e1d565b5b80821115612de35760008155600101612e09565b80821115612de35780547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560008181612e5c6001830182612d62565b612e6a600283016000612d62565b612e78600383016000612ec2565b612e86600483016000612d62565b5050506005810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905560006006820155600701612e1d565b5080546000825560030290600052602060002090810190610b3491905b80821115612de3576000808255612ef96001830182612d62565b612f07600283016000612d62565b50600301612edf565b600060208284031215612f2257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610fa857600080fd5b6000815180845260005b81811015612f7857602081850181015186830182015201612f5c565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610fa86020830184612f52565b63ffffffff81168114610b3457600080fd5b8035612fe681612fc9565b919050565b803560028110612fe657600080fd5b6000806040838503121561300d57600080fd5b823561301881612fc9565b915061302660208401612feb565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061306e5761306e61302f565b9052565b8051825260006020820151606060208501526130916060850182612f52565b9050604083015184820360408601526130aa8282612f52565b95945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015610b16577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301895261310c838351613072565b988401989250908301906001016130d2565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156132ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc089840301855281516060815181865261318c828701825161305e565b8981015160806131a78189018367ffffffffffffffff169052565b8a830151915060a06131bd818a018460ff169052565b938301519360c092506131db8984018667ffffffffffffffff169052565b818401519450610100915060e082818b01526131fb6101608b0187612f52565b95508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0808b880301848c01526132378784612f52565b948601518b860382016101208d015294965061325387866130b3565b9650818601519550808b8803016101408c015250505050506132758282612f52565b915050888201516132918a87018267ffffffffffffffff169052565b5090870151938701939093529386019390860190600101613147565b509098975050505050505050565b6000602082840312156132cd57600080fd5b8135610fa881612fc9565b600080604083850312156132eb57600080fd5b50508035926020909101359150565b805160608084528151908401819052600091602091908201906080860190845b818110156133365783518352928401929184019160010161331a565b505060ff602086015116602087015260408501519250858103604087015261335e8184612f52565b9695505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156132ad578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff1684528701518784018790526133e5878501826132fa565b9588019593505090860190600101613391565b60006020828403121561340a57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610fa857600080fd5b60008083601f84011261344057600080fd5b50813567ffffffffffffffff81111561345857600080fd5b6020830191508360208260051b850101111561347357600080fd5b9250929050565b6000806000806040858703121561349057600080fd5b843567ffffffffffffffff808211156134a857600080fd5b6134b48883890161342e565b909650945060208701359150808211156134cd57600080fd5b506134da8782880161342e565b95989497509550505050565b803567ffffffffffffffff81168114612fe657600080fd5b6000806000806000806080878903121561351757600080fd5b863567ffffffffffffffff8082111561352f57600080fd5b61353b8a838b0161342e565b9098509650602089013591508082111561355457600080fd5b818901915089601f83011261356857600080fd5b81358181111561357757600080fd5b8a602082850101111561358957600080fd5b6020830196508095505050506135a1604088016134e6565b91506135af60608801612fdb565b90509295509295509295565b600181811c908216806135cf57607f821691505b602082108103613608577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176102fc576102fc61360e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b808201808211156102fc576102fc61360e565b818103818111156102fc576102fc61360e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156136ea57600080fd5b610fa8826134e6565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261372757600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261372757600080fd5b6040516060810167ffffffffffffffff8111828210171561378857613788613654565b60405290565b604051610100810167ffffffffffffffff8111828210171561378857613788613654565b60405160e0810167ffffffffffffffff8111828210171561378857613788613654565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561381c5761381c613654565b604052919050565b600067ffffffffffffffff82111561383e5761383e613654565b5060051b60200190565b803560ff81168114612fe657600080fd5b600082601f83011261386a57600080fd5b813567ffffffffffffffff81111561388457613884613654565b6138b560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016137d5565b8181528460208386010111156138ca57600080fd5b816020850160208301376000918101602001919091529392505050565b6000606082360312156138f957600080fd5b613901613765565b823567ffffffffffffffff8082111561391957600080fd5b9084019036601f83011261392c57600080fd5b8135602061394161393c83613824565b6137d5565b82815260059290921b8401810191818101903684111561396057600080fd5b948201945b8386101561397e57853582529482019490820190613965565b86525061398c878201613848565b908501525060408501359150808211156139a557600080fd5b506139b236828601613859565b60408301525092915050565b601f821115613a0a576000816000526020600020601f850160051c810160208610156139e75750805b601f850160051c820191505b81811015613a06578281556001016139f3565b5050505b505050565b815167ffffffffffffffff811115613a2957613a29613654565b613a3d81613a3784546135bb565b846139be565b602080601f831160018114613a905760008415613a5a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a06565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613add57888601518255948401946001909101908401613abe565b5085821015613b1957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83168152604060208201526000613b4c60408301846132fa565b949350505050565b600082601f830112613b6557600080fd5b81356020613b7561393c83613824565b82815260059290921b84018101918181019086841115613b9457600080fd5b8286015b84811015613c5c57803567ffffffffffffffff80821115613bb95760008081fd5b81890191506060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215613bf25760008081fd5b613bfa613765565b87840135815260408085013584811115613c145760008081fd5b613c228e8b83890101613859565b838b015250918401359183831115613c3a5760008081fd5b613c488d8a85880101613859565b908201528652505050918301918301613b98565b509695505050505050565b60006020808385031215613c7a57600080fd5b823567ffffffffffffffff80821115613c9257600080fd5b818501915085601f830112613ca657600080fd5b8135613cb461393c82613824565b81815260059190911b83018401908481019088831115613cd357600080fd5b8585015b83811015613e1457803585811115613cee57600080fd5b8601610100818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001811315613d2457600080fd5b613d2c61378e565b613d378a8401612feb565b8152613d45604084016134e6565b8a820152613d5560608401613848565b6040820152613d66608084016134e6565b606082015260a083013588811115613d7d57600080fd5b613d8b8e8c83870101613859565b60808301525060c083013588811115613da45760008081fd5b613db28e8c83870101613859565b60a08301525060e08084013589811115613dcc5760008081fd5b613dda8f8d83880101613b54565b60c084015250918301359188831115613df35760008081fd5b613e018e8c85870101613859565b9082015285525050918601918601613cd7565b5098975050505050505050565b8051612fe681612fc9565b600082601f830112613e3d57600080fd5b81516020613e4d61393c83613824565b8083825260208201915060208460051b870101935086841115613e6f57600080fd5b602086015b84811015613c5c5780518352918301918301613e74565b600060208284031215613e9d57600080fd5b815167ffffffffffffffff80821115613eb557600080fd5b9083019060e08286031215613ec957600080fd5b613ed16137b2565b613eda83613e21565b8152613ee860208401613e21565b6020820152613ef960408401613e21565b6040820152606083015160608201526080830151608082015260a083015182811115613f2457600080fd5b613f3087828601613e2c565b60a08301525060c083015182811115613f4857600080fd5b613f5487828601613e2c565b60c08301525095945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f9457613f9461360e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8181036000831280158383131683831282161715611f0857611f0861360e565b6003811061306e5761306e61302f565b604081016140088285613fea565b610fa86020830184613fea565b67ffffffffffffffff818116838216019080821115611f0857611f0861360e565b602081526000610fa86020830184613072565b600061014067ffffffffffffffff808e168452602063ffffffff8e1681860152614076604086018e61305e565b8260608601526140888386018d612f52565b9250848303608086015261409c838c612f52565b918a1660a086015284820360c0860152885180835291925080830191600581901b84018201828b0160005b83811015614113577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0878403018652614101838351613072565b958501959250908401906001016140c7565b505060ff8a1660e088015267ffffffffffffffff89166101008801528681036101208801526141428189612f52565b955050505050509b9a505050505050505050505056fea164736f6c6343000818000a",
}
var CCIPConfigABI = CCIPConfigMetaData.ABI
@@ -1221,7 +1222,7 @@ func (CCIPConfigChainConfigSet) Topic() common.Hash {
}
func (CCIPConfigConfigSet) Topic() common.Hash {
- return common.HexToHash("0x0fe4c45ffc7f05233ddfee7d79ac01d075176a0aa116068c486a2f7490088a0b")
+ return common.HexToHash("0xf4095525e757e2fec7f3d3ffb3482db215dbbc7e7c4f63a11e04529ea827171f")
}
func (CCIPConfigOwnershipTransferRequested) Topic() common.Hash {
diff --git a/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go b/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go
index 5056db1005..7dfa6869e7 100644
--- a/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go
+++ b/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go
@@ -34,6 +34,7 @@ type CCIPConfigTypesOCR3Config struct {
FRoleDON uint8
OffchainConfigVersion uint64
OfframpAddress []byte
+ RmnHomeAddress []byte
Nodes []CCIPConfigTypesOCR3Node
OffchainConfig []byte
}
@@ -45,7 +46,7 @@ type CCIPConfigTypesOCR3Node struct {
}
var IOCR3ConfigEncoderMetaData = &bind.MetaData{
- ABI: "[{\"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\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config[]\",\"name\":\"config\",\"type\":\"tuple[]\"}],\"name\":\"exposeOCR3Config\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ ABI: "[{\"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\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config[]\",\"name\":\"config\",\"type\":\"tuple[]\"}],\"name\":\"exposeOCR3Config\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
}
var IOCR3ConfigEncoderABI = IOCR3ConfigEncoderMetaData.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 fca33c5443..215ac3988f 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -4,7 +4,7 @@ burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMint
burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 717c079d5d13300cf3c3ee871c6e5bf9af904411f204fb081a9f3b263cca1391
burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6333d0314d0bd29e75ea5e05fe62a4516ade0c6db91c30b6f93645035db52ed8
burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 08ed1235dda921ce8841b26aa18d0c0f36db4884779dd7670857159801b6d597
-ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin f67d4a98804a9534a6554da3a57779632d55ad76db5ecc16ade74774769cdd69
+ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin a63406386676963a292fa6ef41bf6302fbf0421599a3fc83c786fa5d3adb063a
ccip_encoding_utils: ../../../contracts/solc/v0.8.24/CCIPEncodingUtils/CCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/CCIPEncodingUtils/CCIPEncodingUtils.bin ebabd5311ad4374df0f2f5cd5640bb58d938d92f5a82962ac4df7b6e5af2c197
ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 32916b41e0070cb6853d558bbff06ab367324fa52cac59893065e8f616ff14f0
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin 274d87db70b643e00ab0a7e7845bb4b791f3b613bfc87708d33fc5a8369e2a41
@@ -23,7 +23,7 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo
multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin 0b541232e49727e947dc164eadf35963c66e67576f21baa0ecaa06a8833148ed
multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 04b6b261dd71925670bf4d904aaf7bf08543452009feefb88e07d4c49d12e969
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
-ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin d507c3ac70a7d1033b75151c1e5b854b41aaee164dfaa3e5477de400db1aa1f7
+ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin eaec75ca5276a95f934f4da6ea7351520541813628ed1450ef5e6cf7005b2724
offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 941b18b4e2aef977195fefba514e17c9475667e6f8513b18cabfb07ff90136ce
onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 4f29f05261bdaf9b99e675c1169c0d5cba841b6dd7ca3a8997cc0d3cae7ba850
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b
From 3205f7af8832b5b7784508a2f8afe8202f16a05d Mon Sep 17 00:00:00 2001
From: Rafael Felix Correa
Date: Wed, 25 Sep 2024 10:46:08 +0200
Subject: [PATCH 07/32] CRIB-359: ignoring problematic git tag breaking CRIB
CCIP builds (#1463)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Motivation
Fix the following error when building CCIP for CRIB:
```
build:app • parsing tag
build:app ⨯ release failed after 0s error=failed to parse tag 'contracts-ccip/v1.5.0-beta.0' as semver: Invalid Semantic Version
```
## Solution
Even though the best would be to ignore it based on the prefix
`contracts-ccip`, that requires goreleaser-pro
which is not currently available in the nix shell. We should add it in
the long run, but this issue needs an immediate fix for now.
---
.goreleaser.devspace.yaml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.goreleaser.devspace.yaml b/.goreleaser.devspace.yaml
index a943d7235f..2f1e9754b4 100644
--- a/.goreleaser.devspace.yaml
+++ b/.goreleaser.devspace.yaml
@@ -83,6 +83,12 @@ changelog:
exclude:
- "^docs:"
- "^test:"
+
+# See https://goreleaser.com/customization/git/
+git:
+ ignore_tags:
+ - contracts-ccip/v1.5.0-beta.0
+
# modelines, feel free to remove those if you don't want/use them:
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
From ce4cc58c76260e4233f571bf503ca24c8f653886 Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Wed, 25 Sep 2024 12:43:06 +0200
Subject: [PATCH 08/32] bump chain-selectors (#1467)
---
core/scripts/go.mod | 2 +-
core/scripts/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
integration-tests/go.mod | 2 +-
integration-tests/go.sum | 4 ++--
integration-tests/load/go.mod | 2 +-
integration-tests/load/go.sum | 4 ++--
8 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index b8cddfbb5a..3d263a92be 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -22,7 +22,7 @@ require (
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.17.0
github.com/shopspring/decimal v1.4.0
- github.com/smartcontractkit/chain-selectors v1.0.23
+ github.com/smartcontractkit/chain-selectors v1.0.24
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index db4c3cd316..f180e2a21d 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -1070,8 +1070,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnjjIQAEBnutCtksPzVDY=
-github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.24 h1:day+2l0vBErgVIs2Y9ifSz+T7hIg4wAoiWlMCjCdhto=
+github.com/smartcontractkit/chain-selectors v1.0.24/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/go.mod b/go.mod
index 0c6c29d0e6..2cf454ccae 100644
--- a/go.mod
+++ b/go.mod
@@ -73,7 +73,7 @@ require (
github.com/scylladb/go-reflectx v1.0.1
github.com/shirou/gopsutil/v3 v3.24.3
github.com/shopspring/decimal v1.4.0
- github.com/smartcontractkit/chain-selectors v1.0.23
+ github.com/smartcontractkit/chain-selectors v1.0.24
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45
diff --git a/go.sum b/go.sum
index d65d3fa705..1ee3d32944 100644
--- a/go.sum
+++ b/go.sum
@@ -1026,8 +1026,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnjjIQAEBnutCtksPzVDY=
-github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.24 h1:day+2l0vBErgVIs2Y9ifSz+T7hIg4wAoiWlMCjCdhto=
+github.com/smartcontractkit/chain-selectors v1.0.24/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index 635332c58e..f11f609258 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -32,7 +32,7 @@ require (
github.com/segmentio/ksuid v1.0.4
github.com/shopspring/decimal v1.4.0
github.com/slack-go/slack v0.12.2
- github.com/smartcontractkit/chain-selectors v1.0.23
+ github.com/smartcontractkit/chain-selectors v1.0.24
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.0
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index 727c8bf04a..91d2f9cdf1 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -1413,8 +1413,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnjjIQAEBnutCtksPzVDY=
-github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.24 h1:day+2l0vBErgVIs2Y9ifSz+T7hIg4wAoiWlMCjCdhto=
+github.com/smartcontractkit/chain-selectors v1.0.24/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod
index 2956080624..c46ec64093 100644
--- a/integration-tests/load/go.mod
+++ b/integration-tests/load/go.mod
@@ -393,7 +393,7 @@ require (
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
- github.com/smartcontractkit/chain-selectors v1.0.23 // indirect
+ github.com/smartcontractkit/chain-selectors v1.0.24 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827 // indirect
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6e // indirect
diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum
index 8162c16965..09384ccb12 100644
--- a/integration-tests/load/go.sum
+++ b/integration-tests/load/go.sum
@@ -1385,8 +1385,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnjjIQAEBnutCtksPzVDY=
-github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.24 h1:day+2l0vBErgVIs2Y9ifSz+T7hIg4wAoiWlMCjCdhto=
+github.com/smartcontractkit/chain-selectors v1.0.24/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
From 84691bdff3c757c4f3a3ce7ca295b5b6cd121f15 Mon Sep 17 00:00:00 2001
From: Jaden Foldesi
Date: Wed, 25 Sep 2024 09:39:51 -0400
Subject: [PATCH 09/32] Use Astar Chain Type (#1465)
## Motivation
Set ChainType='astar' to use custom finality on mainnet
## Solution
---------
Co-authored-by: simsonraj
---
core/chains/evm/config/toml/defaults/Astar_Mainnet.toml | 1 +
docs/CONFIG.md | 1 +
2 files changed, 2 insertions(+)
diff --git a/core/chains/evm/config/toml/defaults/Astar_Mainnet.toml b/core/chains/evm/config/toml/defaults/Astar_Mainnet.toml
index 87808001eb..d1697d137a 100644
--- a/core/chains/evm/config/toml/defaults/Astar_Mainnet.toml
+++ b/core/chains/evm/config/toml/defaults/Astar_Mainnet.toml
@@ -1,4 +1,5 @@
ChainID = '592'
+ChainType = 'astar'
FinalityTagEnabled = true
FinalityDepth = 100
LogPollInterval = '6s'
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 1bf7837953..10e2519049 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -4229,6 +4229,7 @@ GasLimit = 5400000
AutoCreateKey = true
BlockBackfillDepth = 10
BlockBackfillSkip = false
+ChainType = 'astar'
FinalityDepth = 100
FinalityTagEnabled = true
LogBackfillBatchSize = 1000
From 390ee2334126e313c0e214c2cd9a7a379b5bfe13 Mon Sep 17 00:00:00 2001
From: Ryan Hall
Date: Wed, 25 Sep 2024 11:34:52 -0400
Subject: [PATCH 10/32] Update pragma to most restrictive dependency or feature
(#1466)
## Motivation
We have several contracts using `^0.8.0` but also custom errors, or a
child contract with custom errors. We also have several contracts at
`^0.8.0` but a dependency locked at `0.8.24`.
## Solution
Update all pragmas to the pragma of the most restrictive dep or the
minimum to enable custom errors (`0.8.4`)
---
contracts/gas-snapshots/ccip.gas-snapshot | 2 +-
contracts/src/v0.8/ccip/applications/CCIPClientExample.sol | 2 +-
contracts/src/v0.8/ccip/applications/CCIPReceiver.sol | 2 +-
contracts/src/v0.8/ccip/applications/DefensiveExample.sol | 4 ++--
contracts/src/v0.8/ccip/applications/PingPongDemo.sol | 2 +-
contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol | 2 +-
.../v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol | 2 +-
.../src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol | 2 +-
contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol | 2 +-
contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol | 2 +-
contracts/src/v0.8/ccip/interfaces/IRMNV2.sol | 2 +-
contracts/src/v0.8/ccip/interfaces/IRouterClient.sol | 2 +-
contracts/src/v0.8/ccip/libraries/Internal.sol | 2 +-
contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol | 2 +-
contracts/src/v0.8/ccip/libraries/RateLimiter.sol | 2 +-
contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol | 2 +-
contracts/src/v0.8/ccip/ocr/OCR2Base.sol | 2 +-
contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol | 2 +-
contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol | 2 +-
.../ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol | 2 +-
contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol | 2 +-
contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol | 2 +-
contracts/src/v0.8/ccip/test/legacy/BurnMintTokenPool1_2.sol | 4 ++--
contracts/src/v0.8/ccip/test/mocks/MockRouter.sol | 2 +-
24 files changed, 26 insertions(+), 26 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 00f9512d00..5d00beeae3 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -123,7 +123,7 @@ CommitStore_verify:test_NotBlessed_Success() (gas: 61473)
CommitStore_verify:test_Paused_Revert() (gas: 18568)
CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848)
DefensiveExampleTest:test_HappyPath_Success() (gas: 200200)
-DefensiveExampleTest:test_Recovery() (gas: 424479)
+DefensiveExampleTest:test_Recovery() (gas: 424476)
E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985)
EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322)
EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438)
diff --git a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol b/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol
index 77816ceadb..82de08ea64 100644
--- a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol
+++ b/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {IRouterClient} from "../interfaces/IRouterClient.sol";
diff --git a/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol
index 1d4937c77a..208c4e47ce 100644
--- a/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol
+++ b/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol";
diff --git a/contracts/src/v0.8/ccip/applications/DefensiveExample.sol b/contracts/src/v0.8/ccip/applications/DefensiveExample.sol
index 89435ccbf1..f0501b5d90 100644
--- a/contracts/src/v0.8/ccip/applications/DefensiveExample.sol
+++ b/contracts/src/v0.8/ccip/applications/DefensiveExample.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {IRouterClient} from "../interfaces/IRouterClient.sol";
@@ -8,7 +8,7 @@ import {CCIPClientExample} from "./CCIPClientExample.sol";
import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol";
-import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/structs/EnumerableMap.sol";
+import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol";
contract DefensiveExample is CCIPClientExample {
using EnumerableMap for EnumerableMap.Bytes32ToUintMap;
diff --git a/contracts/src/v0.8/ccip/applications/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/PingPongDemo.sol
index b902c47618..567ad3c27d 100644
--- a/contracts/src/v0.8/ccip/applications/PingPongDemo.sol
+++ b/contracts/src/v0.8/ccip/applications/PingPongDemo.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IRouterClient} from "../interfaces/IRouterClient.sol";
diff --git a/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol b/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol
index f9e4fd0aa6..09c81ad5de 100644
--- a/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol
+++ b/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity 0.8.24;
import {Router} from "../Router.sol";
import {Client} from "../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol b/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol
index 6d0b0f72a5..d09dbeb65a 100644
--- a/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol
+++ b/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {CCIPConfigTypes} from "../libraries/CCIPConfigTypes.sol";
diff --git a/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol b/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
index 59ddb39b5a..e5d77b02e5 100644
--- a/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
+++ b/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {Internal} from "../../libraries/Internal.sol";
diff --git a/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol b/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol
index 4fa9cbfec4..84d430410b 100644
--- a/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol
+++ b/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {Client} from "../libraries/Client.sol";
import {Internal} from "../libraries/Internal.sol";
diff --git a/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol b/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol
index ed69b7b0cd..583a2e890b 100644
--- a/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol
+++ b/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {Internal} from "../libraries/Internal.sol";
diff --git a/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol b/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol
index ba6f652e36..0a66af76ef 100644
--- a/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol
+++ b/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {Internal} from "../libraries/Internal.sol";
diff --git a/contracts/src/v0.8/ccip/interfaces/IRouterClient.sol b/contracts/src/v0.8/ccip/interfaces/IRouterClient.sol
index 9805a41bbd..27913b597d 100644
--- a/contracts/src/v0.8/ccip/interfaces/IRouterClient.sol
+++ b/contracts/src/v0.8/ccip/interfaces/IRouterClient.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {Client} from "../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/libraries/Internal.sol b/contracts/src/v0.8/ccip/libraries/Internal.sol
index 13ffc56b91..90b36adb7b 100644
--- a/contracts/src/v0.8/ccip/libraries/Internal.sol
+++ b/contracts/src/v0.8/ccip/libraries/Internal.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {MerkleMultiProof} from "../libraries/MerkleMultiProof.sol";
import {Client} from "./Client.sol";
diff --git a/contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol b/contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol
index fed8a1165b..95f52bdc52 100644
--- a/contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol
+++ b/contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
library MerkleMultiProof {
/// @notice Leaf domain separator, should be used as the first 32 bytes of a leaf's preimage.
diff --git a/contracts/src/v0.8/ccip/libraries/RateLimiter.sol b/contracts/src/v0.8/ccip/libraries/RateLimiter.sol
index 40ac3ca213..84914749e0 100644
--- a/contracts/src/v0.8/ccip/libraries/RateLimiter.sol
+++ b/contracts/src/v0.8/ccip/libraries/RateLimiter.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
/// @notice Implements Token Bucket rate limiting.
/// @dev uint128 is safe for rate limiter state.
diff --git a/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol b/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol
index f3e4d5a9ed..2e698cd230 100644
--- a/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol
+++ b/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
diff --git a/contracts/src/v0.8/ccip/ocr/OCR2Base.sol b/contracts/src/v0.8/ccip/ocr/OCR2Base.sol
index 52a6df2f3a..74c8e47917 100644
--- a/contracts/src/v0.8/ccip/ocr/OCR2Base.sol
+++ b/contracts/src/v0.8/ccip/ocr/OCR2Base.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
import {OCR2Abstract} from "./OCR2Abstract.sol";
diff --git a/contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol b/contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol
index a79df8d589..8bada2c378 100644
--- a/contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol
+++ b/contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
import {OCR2Abstract} from "./OCR2Abstract.sol";
diff --git a/contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol b/contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol
index bc5adb0b2d..43326681e5 100644
--- a/contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol
+++ b/contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
+pragma solidity 0.8.24;
import {IPoolPriorTo1_5} from "../interfaces/IPoolPriorTo1_5.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol b/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol
index 73e764ae03..7290e91509 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: MIT
-pragma solidity ^0.8.0;
+pragma solidity 0.8.24;
import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol b/contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol
index deffb617ca..ea8ba98d44 100644
--- a/contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {Client} from "../../libraries/Client.sol";
import {Internal} from "../../libraries/Internal.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol b/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol
index 73962fb91f..2e50124ab4 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: MIT
-pragma solidity ^0.8.0;
+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/legacy/BurnMintTokenPool1_2.sol b/contracts/src/v0.8/ccip/test/legacy/BurnMintTokenPool1_2.sol
index 444e488b3c..44de2787c6 100644
--- a/contracts/src/v0.8/ccip/test/legacy/BurnMintTokenPool1_2.sol
+++ b/contracts/src/v0.8/ccip/test/legacy/BurnMintTokenPool1_2.sol
@@ -1,5 +1,5 @@
-// SPDX-License-Identifier: UNLICENSED
-pragma solidity ^0.8.0;
+// SPDX-License-Identifier: BUSL
+pragma solidity ^0.8.20;
import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol";
import {IPoolPriorTo1_5} from "../../interfaces/IPoolPriorTo1_5.sol";
diff --git a/contracts/src/v0.8/ccip/test/mocks/MockRouter.sol b/contracts/src/v0.8/ccip/test/mocks/MockRouter.sol
index 9181fb37c2..88a1740886 100644
--- a/contracts/src/v0.8/ccip/test/mocks/MockRouter.sol
+++ b/contracts/src/v0.8/ccip/test/mocks/MockRouter.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.0;
+pragma solidity ^0.8.4;
import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol";
import {IRouter} from "../../interfaces/IRouter.sol";
From 374482e40c533c4b8279bcb750db08ea66fc814a Mon Sep 17 00:00:00 2001
From: Balamurali Gopalswami <167726375+b-gopalswami@users.noreply.github.com>
Date: Thu, 26 Sep 2024 13:45:12 -0400
Subject: [PATCH 11/32] CCIP-3461: Optimize mainnet soak test (#1458)
### Motivation
Optimize the resource and fund consumption of the mainnet soak test.
Currently, the mainnet soak test runs every six hours in Kubernetes,
executing one CCIP transaction per hour for a duration of five hours
across 28 bidirectional lanes. This setup is designed to provide
consistent observability data on the CCIP mainnet, allowing us to
differentiate between service outages and quiet periods. However, these
tests are inefficient, consuming Kubernetes resources and significant
mainnet funds.
https://smartcontract-it.atlassian.net/browse/CCIP-3461
### Ideas:
Discussion
[thread](https://chainlink-core.slack.com/archives/C02PBKHCP28/p1726678958525029)
is initiated with o11y team and decided that it's not required to create
txs for every hour instead create one tx if there are no activity for
last 24h.
Convert to smoke test as we are planning to fire only one request
instead of Soak test.
Converting to smoke will elevate the K8 resource consumption as the test
will run using github runner.
### Solution
- [x] 1. Modify the pipeline to run it as smoke test
- [x] 2. Add traffic check to smoke test
- [x] 3. Add new set of additional 21 lanes and resulted in total of 49
lanes. (i.e 98 unique lanes)
- [x] 5. Add RPCs, Wallet key for new lanes to test secrets
- [ ] 6. Load funds for new lanes
- [x] 7. Schedule pipeline to run for every 6hrs
### Key outcomes:
Present transaction count: 1tx * (28 * 2)lanes * 24hrs = 1344
After this change: 1tx * (49 * 2)lanes = 98 which is close to 92%
reduction with additional 42 lanes coverage.
As per the last
[analysis](https://docs.google.com/document/d/1MqXoIyGtGE9o2usgpWdIHQUMblKTyeAvoa06MEsExpc/edit?pli=1#heading=h.8kwk6enqa4w)
on the cost, we spend around 84k per quarter.
I expect the fund reduction close to 90% which will give saving close to
300k annually.
---------
Co-authored-by: Brandon West <3317895+Bwest981@users.noreply.github.com>
---
.github/workflows/ccip-live-network-tests.yml | 130 +++++++++---
.../ccip-tests/actions/ccip_helpers.go | 25 ++-
.../ccip-tests/load/ccip_loadgen.go | 8 +-
.../ccip-tests/load/ccip_multicall_loadgen.go | 2 +-
integration-tests/ccip-tests/load/helper.go | 2 +-
.../ccip-tests/smoke/ccip_test.go | 133 ++++++++++++-
.../ccip-tests/testconfig/README.md | 12 +-
.../ccip-tests/testconfig/ccip.go | 92 ++++-----
.../testconfig/override/mainnet.toml | 187 +++++++++++-------
9 files changed, 425 insertions(+), 166 deletions(-)
diff --git a/.github/workflows/ccip-live-network-tests.yml b/.github/workflows/ccip-live-network-tests.yml
index 7d908d9718..089fcf739b 100644
--- a/.github/workflows/ccip-live-network-tests.yml
+++ b/.github/workflows/ccip-live-network-tests.yml
@@ -15,8 +15,8 @@ on:
required: false
type: choice
options:
- - 'load'
- 'smoke'
+ - 'load'
test_secrets_override_key:
description: 'Key to run tests with custom test secrets'
required: false
@@ -30,8 +30,6 @@ concurrency:
env:
CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
CHAINLINK_VERSION: ${{ github.sha }}
- CHAINLINK_TEST_VERSION: ${{ github.sha }}
- ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests:${{ github.sha }}
INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com
AWS_ECR_REPO_PUBLIC_REGISTRY: public.ecr.aws
E2E_TEST_CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
@@ -41,19 +39,21 @@ env:
E2E_TEST_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
# Default private key test secret loaded from Github Secret as only security team has access to it.
# this key secrets.QA_SHARED_803C_KEY has a story behind it. To know more, see CCIP-2875 and SECHD-16575 tickets.
- E2E_TEST_ETHEREUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_ARBITRUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
- E2E_TEST_BASE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
- E2E_TEST_WEMIX_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_AVALANCHE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
- E2E_TEST_ZKSYNC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
- E2E_TEST_MODE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BASE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BLAST_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_CELO_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_ETHEREUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_GNOSIS_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_KROMA_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_METIS_ANDROMEDA_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_MODE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_OPTIMISM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
- E2E_TEST_KROMA_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
- E2E_TEST_GNOSIS_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_POLYGON_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
- E2E_TEST_BSC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_WEMIX_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_ZKSYNC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+
jobs:
build-chainlink:
@@ -99,6 +99,7 @@ jobs:
build-test-image:
environment: integration
+ if: ${{ github.event_name == 'workflow_dispatch' && inputs.test_type == 'load' }}
permissions:
id-token: write
contents: read
@@ -133,8 +134,8 @@ jobs:
matrix:
config: [mainnet.toml]
needs: [ build-chainlink, build-test-image ]
- # if the event is a scheduled event or the test type is load and no previous job failed
- if: ${{ (github.event_name == 'schedule' || inputs.test_type == 'load') && !contains(needs.*.result, 'failure') }}
+ # if the event is a workflow_dispatch event and the test type is load and no previous job failed
+ if: ${{ github.event_name == 'workflow_dispatch' && inputs.test_type == 'load' && !contains(needs.*.result, 'failure') }}
permissions:
issues: read
checks: write
@@ -147,6 +148,8 @@ jobs:
SLACK_CHANNEL: ${{ secrets.QA_SLACK_CHANNEL }}
TEST_LOG_LEVEL: info
REF_NAME: ${{ github.head_ref || github.ref_name }}
+ CHAINLINK_TEST_VERSION: ${{ github.sha }}
+ ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests:${{ github.sha }}
ENV_JOB_IMAGE_BASE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests
steps:
@@ -207,11 +210,11 @@ jobs:
RR_CPU: 4
DETACH_RUNNER: true
TEST_TRIGGERED_BY: ccip-load-test-ci
- BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
- TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
+ BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.setup_create_base64_config_ccip.outputs.base64_config }},${{ steps.set_override_config.outputs.base_64_override }}
+ TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.setup_create_base64_config_ccip.outputs.base64_config }},${{ steps.set_override_config.outputs.base_64_override }}
E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
with:
- test_command_to_run: cd ./integration-tests/ccip-tests && go test -v -timeout 70m -count=1 -json -run ^TestLoadCCIPStableRPS$ ./load 2>&1 | tee /tmp/gotest.log | gotestfmt
+ test_command_to_run: cd ./integration-tests/ccip-tests && go test -v -timeout 70m -count=1 -json -run ^TestLoadCCIPStableRPS$ ./load 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci -singlepackage -hidepassingtests=false
test_download_vendor_packages_command: cd ./integration-tests && go mod download
# Other default test secrets loaded from dotenv Github Secret.
test_secrets_defaults_base64: ${{ secrets.CCIP_DEFAULT_TEST_SECRETS }}
@@ -229,12 +232,12 @@ jobs:
should_cleanup: false
ccip-smoke-test:
- name: CCIP smoke Test
+ name: CCIP smoke Test ${{ matrix.lanes.name }}
environment: integration
runs-on: ubuntu-latest
- needs: [ build-chainlink, build-test-image ]
- # if the event is a scheduled event or the test type is load and no previous job failed
- if: ${{ github.event_name == 'workflow_dispatch' && inputs.test_type == 'smoke' && !contains(needs.*.result, 'failure') }}
+ needs: [ build-chainlink ]
+ # if the event is a scheduled event or the test type is smoke and no previous job failed
+ if: ${{ (github.event_name == 'schedule' || inputs.test_type == 'smoke') && !contains(needs.*.result, 'failure') }}
permissions:
issues: read
checks: write
@@ -247,10 +250,69 @@ jobs:
SLACK_CHANNEL: ${{ secrets.QA_SLACK_CHANNEL }}
TEST_LOG_LEVEL: info
REF_NAME: ${{ github.head_ref || github.ref_name }}
- ENV_JOB_IMAGE_BASE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests
-
+ strategy:
+ fail-fast: false
+ matrix:
+ lanes:
+ - name: 'ARBITRUM_MAINNET'
+ pairs: 'ARBITRUM_MAINNET,BSC_MAINNET;ARBITRUM_MAINNET,OPTIMISM_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'AVALANCHE_MAINNET'
+ pairs: 'AVALANCHE_MAINNET,ARBITRUM_MAINNET;AVALANCHE_MAINNET,BASE_MAINNET;AVALANCHE_MAINNET,BSC_MAINNET;AVALANCHE_MAINNET,OPTIMISM_MAINNET;AVALANCHE_MAINNET,POLYGON_MAINNET;AVALANCHE_MAINNET,WEMIX_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'BASE_MAINNET'
+ pairs: 'BASE_MAINNET,ARBITRUM_MAINNET;BASE_MAINNET,BSC_MAINNET;BASE_MAINNET,OPTIMISM_MAINNET;BASE_MAINNET,POLYGON_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'BLAST_MAINNET'
+ pairs: 'BLAST_MAINNET,ARBITRUM_MAINNET;BLAST_MAINNET,BASE_MAINNET;BLAST_MAINNET,BSC_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'BSC_MAINNET'
+ pairs: 'BSC_MAINNET,OPTIMISM_MAINNET;BSC_MAINNET,POLYGON_MAINNET;BSC_MAINNET,WEMIX_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'ETHEREUM_MAINNET 1'
+ pairs: 'ETHEREUM_MAINNET,ARBITRUM_MAINNET;ETHEREUM_MAINNET,AVALANCHE_MAINNET;ETHEREUM_MAINNET,BASE_MAINNET;ETHEREUM_MAINNET,BLAST_MAINNET;ETHEREUM_MAINNET,BSC_MAINNET;ETHEREUM_MAINNET,CELO_MAINNET;ETHEREUM_MAINNET,GNOSIS_MAINNET;ETHEREUM_MAINNET,OPTIMISM_MAINNET;ETHEREUM_MAINNET,POLYGON_MAINNET;ETHEREUM_MAINNET,WEMIX_MAINNET'
+ enabled: true
+ phaseTimeout: 40m
+ - name: 'ETHEREUM_MAINNET 2'
+ pairs: 'ETHEREUM_MAINNET,METIS_ANDROMEDA;ETHEREUM_MAINNET,ZKSYNC_MAINNET'
+ enabled: true
+ phaseTimeout: 90m
+ - name: 'GNOSIS_MAINNET'
+ pairs: 'GNOSIS_MAINNET,ARBITRUM_MAINNET;GNOSIS_MAINNET,AVALANCHE_MAINNET;GNOSIS_MAINNET,BASE_MAINNET;GNOSIS_MAINNET,BSC_MAINNET;GNOSIS_MAINNET,OPTIMISM_MAINNET;GNOSIS_MAINNET,POLYGON_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'METIS_ANDROMEDA'
+ pairs: 'METIS_ANDROMEDA,ARBITRUM_MAINNET'
+ enabled: true
+ phaseTimeout: 60m
+ - name: 'MODE_MAINNET'
+ pairs: 'MODE_MAINNET,OPTIMISM_MAINNET;MODE_MAINNET,ARBITRUM_MAINNET;MODE_MAINNET,BASE_MAINNET;MODE_MAINNET,BSC_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'OPTIMISM_MAINNET'
+ pairs: 'OPTIMISM_MAINNET,POLYGON_MAINNET;OPTIMISM_MAINNET,WEMIX_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'POLYGON_MAINNET'
+ pairs: 'POLYGON_MAINNET,ARBITRUM_MAINNET;POLYGON_MAINNET,WEMIX_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'WEMIX_MAINNET'
+ pairs: 'WEMIX_MAINNET,ARBITRUM_MAINNET;WEMIX_MAINNET,KROMA_MAINNET'
+ enabled: true
+ phaseTimeout: 20m
+ - name: 'ZKSYNC_MAINNET'
+ pairs: 'ZKSYNC_MAINNET,ARBITRUM_MAINNET'
+ enabled: true
+ phaseTimeout: 90m
steps:
- name: Collect Metrics
+ if: ${{ matrix.lanes.enabled == true }}
id: collect-gha-metrics
uses: smartcontractkit/push-gha-metrics-action@dea9b546553cb4ca936607c2267a09c004e4ab3f # v3.0.0
with:
@@ -261,10 +323,12 @@ jobs:
this-job-name: CCIP Smoke Test
continue-on-error: true
- name: Checkout the repo
+ if: ${{ matrix.lanes.enabled == true }}
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
with:
ref: ${{ env.REF_NAME }}
- name: Prepare Base64 TOML override
+ if: ${{ matrix.lanes.enabled == true }}
id: set_override_config
shell: bash
run: |
@@ -276,14 +340,20 @@ jobs:
echo ::add-mask::$BASE64_CCIP_CONFIG_OVERRIDE
echo "base_64_override=$BASE64_CCIP_CONFIG_OVERRIDE" >> $GITHUB_OUTPUT
fi
+ if [[ "${{ github.event_name }}" == "schedule" ]]; then
+ BASE64_CCIP_CONFIG_OVERRIDE=$(base64 -w 0 -i ./integration-tests/ccip-tests/testconfig/override/mainnet.toml)
+ echo ::add-mask::$BASE64_CCIP_CONFIG_OVERRIDE
+ echo "base_64_override=$BASE64_CCIP_CONFIG_OVERRIDE" >> $GITHUB_OUTPUT
+ echo "SLACK_USER=${{ secrets.QA_SLACK_USER }}" >> $GITHUB_ENV
+ fi
- name: step summary
+ if: ${{ matrix.lanes.enabled == true }}
shell: bash
run: |
echo "### chainlink image used for this test run :link:" >>$GITHUB_STEP_SUMMARY
echo "\`${{ env.CHAINLINK_VERSION }}\`" >> $GITHUB_STEP_SUMMARY
- echo "### chainlink-tests image tag for this test run :ship:" >>$GITHUB_STEP_SUMMARY
- echo "\`${{ env.CHAINLINK_TEST_VERSION }}\`" >> $GITHUB_STEP_SUMMARY
- name: Prepare Base64 TOML override for CCIP secrets
+ if: ${{ matrix.lanes.enabled == true }}
uses: ./.github/actions/setup-create-base64-config-ccip
id: setup_create_base64_config_ccip
with:
@@ -293,19 +363,22 @@ jobs:
logstreamLogTargets: ${{ vars.LOGSTREAM_LOG_TARGETS }}
- name: Run Tests
uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@94cb11f4bd545607a2f221c6685052b3abee723d # v2.3.32
+ if: ${{ matrix.lanes.enabled == true }}
env:
TEST_SUITE: smoke
TEST_ARGS: -test.timeout 900h
- DETACH_RUNNER: true
+ DETACH_RUNNER: false
DATABASE_URL: postgresql://postgres:node@localhost:5432/chainlink_test?sslmode=disable
RR_MEM: 8Gi
RR_CPU: 4
TEST_TRIGGERED_BY: ccip-smoke-test-ci
- BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
- TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
+ BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.setup_create_base64_config_ccip.outputs.base64_config }},${{ steps.set_override_config.outputs.base_64_override }}
+ TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.setup_create_base64_config_ccip.outputs.base64_config }},${{ steps.set_override_config.outputs.base_64_override }}
E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs"
+ OVERRIDE_NETWORK_PAIRS: ${{ matrix.lanes.pairs }}
+ OVERRIDE_PHASE_TIMEOUT: ${{ matrix.lanes.phaseTimeout }}
with:
- test_command_to_run: cd ./integration-tests/ccip-tests && go test -v -timeout 70m -count=1 -p 30 -json -run ^TestSmokeCCIPForBidirectionalLane$ ./smoke 2>&1 | tee /tmp/gotest.log | gotestfmt
+ test_command_to_run: cd ./integration-tests/ccip-tests && go test -v -timeout 3h -count=1 -p 30 -json -run ^TestSmokeCCIPForGivenNetworkPairs$ ./smoke 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci -singlepackage -hidepassingtests=false
test_download_vendor_packages_command: cd ./integration-tests && go mod download
# Other default test secrets loaded from dotenv Github Secret.
test_secrets_defaults_base64: ${{ secrets.CCIP_DEFAULT_TEST_SECRETS }}
@@ -314,7 +387,6 @@ jobs:
go_mod_path: ./integration-tests/go.mod
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }}
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
- QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
triggered_by: ${{ env.TEST_TRIGGERED_BY }}
artifacts_location: ./integration-tests/smoke/logs/payload_ccip.json
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go
index 2bbc77f1c2..eb34db40de 100644
--- a/integration-tests/ccip-tests/actions/ccip_helpers.go
+++ b/integration-tests/ccip-tests/actions/ccip_helpers.go
@@ -1648,7 +1648,10 @@ func (sourceCCIP *SourceCCIPModule) IsRequestTriggeredWithinTimeframe(timeframe
// IsPastRequestTriggeredWithinTimeframe determines the average block time and calculates the block numbers
// within the specified timeframe. It then uses FilterCCIPSendRequested to identify the past events.
-func (sourceCCIP *SourceCCIPModule) IsPastRequestTriggeredWithinTimeframe(ctx context.Context, timeframe *commonconfig.Duration) (*time.Time, error) {
+func (sourceCCIP *SourceCCIPModule) IsPastRequestTriggeredWithinTimeframe(
+ ctx context.Context,
+ timeframe *commonconfig.Duration,
+) (*types.Log, error) {
if timeframe == nil {
return nil, nil
}
@@ -1675,17 +1678,21 @@ func (sourceCCIP *SourceCCIPModule) IsPastRequestTriggeredWithinTimeframe(ctx co
return nil, fmt.Errorf("error while filtering CCIP send requested starting block number: %d. Error: %w", filterFromBlock, err)
}
defer func() {
- _ = iterator.Close()
+ iterErr := iterator.Close()
+ if iterErr != nil {
+ sourceCCIP.Common.Logger.Error().Err(iterErr).Msg("Error closing iterator")
+ }
}()
- if iterator.Next() {
- hdr, err := sourceCCIP.Common.ChainClient.HeaderByNumber(context.Background(), big.NewInt(int64(iterator.Event.Raw.BlockNumber)))
- if err != nil {
- return nil, fmt.Errorf("error getting header for block: %d, Error: %w", iterator.Event.Raw.BlockNumber, err)
+ lastBlockNumber := uint64(0)
+ var latestEvent *types.Log
+ for iterator.Next() {
+ blockNum := iterator.Event.Raw.BlockNumber
+ if blockNum > lastBlockNumber {
+ lastBlockNumber = blockNum
+ latestEvent = &iterator.Event.Raw
}
- return pointer.ToTime(hdr.Timestamp), nil
}
-
- return nil, nil
+ return latestEvent, nil
}
func (sourceCCIP *SourceCCIPModule) AssertEventCCIPSendRequested(
diff --git a/integration-tests/ccip-tests/load/ccip_loadgen.go b/integration-tests/ccip-tests/load/ccip_loadgen.go
index d3af128309..89804dbf8a 100644
--- a/integration-tests/ccip-tests/load/ccip_loadgen.go
+++ b/integration-tests/ccip-tests/load/ccip_loadgen.go
@@ -226,13 +226,19 @@ func (c *CCIPE2ELoad) Call(_ *wasp.Generator) *wasp.Response {
res := &wasp.Response{}
sourceCCIP := c.Lane.Source
var recentRequestFoundAt *time.Time
+ var latestEvent *types.Log
var err error
// Use IsPastRequestTriggeredWithinTimeframe to check for any historical CCIP send request events
// within the specified timeframe for the first message. Subsequently, use the watcher method to monitor
// and detect any new events as they occur.
if c.CurrentMsgSerialNo.Load() == int64(1) {
- recentRequestFoundAt, err = sourceCCIP.IsPastRequestTriggeredWithinTimeframe(testcontext.Get(c.t), c.SkipRequestIfAnotherRequestTriggeredWithin)
+ latestEvent, err = sourceCCIP.IsPastRequestTriggeredWithinTimeframe(testcontext.Get(c.t), c.SkipRequestIfAnotherRequestTriggeredWithin)
require.NoError(c.t, err, "error while filtering past requests")
+ if latestEvent != nil {
+ hdr, err := sourceCCIP.Common.ChainClient.HeaderByNumber(context.Background(), big.NewInt(int64(latestEvent.BlockNumber)))
+ require.NoError(c.t, err, "error while getting header by block number")
+ recentRequestFoundAt = pointer.ToTime(hdr.Timestamp)
+ }
} else {
recentRequestFoundAt = sourceCCIP.IsRequestTriggeredWithinTimeframe(c.SkipRequestIfAnotherRequestTriggeredWithin)
}
diff --git a/integration-tests/ccip-tests/load/ccip_multicall_loadgen.go b/integration-tests/ccip-tests/load/ccip_multicall_loadgen.go
index 04fcffaa4b..39e5388244 100644
--- a/integration-tests/ccip-tests/load/ccip_multicall_loadgen.go
+++ b/integration-tests/ccip-tests/load/ccip_multicall_loadgen.go
@@ -91,7 +91,7 @@ func NewMultiCallLoadGenerator(testCfg *testsetups.CCIPTestConfig, lanes []*acti
testCfg.Test, lane, testCfg.TestGroupInput.PhaseTimeout.Duration(),
100000,
testCfg.TestGroupInput.LoadProfile.MsgProfile, 0,
- testCfg.TestGroupInput.LoadProfile.SkipRequestIfAnotherRequestTriggeredWithin,
+ testCfg.TestGroupInput.SkipRequestIfAnotherRequestTriggeredWithin,
)
ccipLoad.BeforeAllCall()
m.E2ELoads[fmt.Sprintf("%s-%s", lane.SourceNetworkName, lane.DestNetworkName)] = ccipLoad
diff --git a/integration-tests/ccip-tests/load/helper.go b/integration-tests/ccip-tests/load/helper.go
index 3465b58204..2c150bbc5a 100644
--- a/integration-tests/ccip-tests/load/helper.go
+++ b/integration-tests/ccip-tests/load/helper.go
@@ -276,7 +276,7 @@ func (l *LoadArgs) TriggerLoadByLane() {
ccipLoad := NewCCIPLoad(
l.TestCfg.Test, lane, l.TestCfg.TestGroupInput.PhaseTimeout.Duration(),
100000, l.TestCfg.TestGroupInput.LoadProfile.MsgProfile, sendMaxData,
- l.TestCfg.TestGroupInput.LoadProfile.SkipRequestIfAnotherRequestTriggeredWithin,
+ l.TestCfg.TestGroupInput.SkipRequestIfAnotherRequestTriggeredWithin,
)
ccipLoad.BeforeAllCall()
// if it's not multicall set the tokens to nil to free up some space,
diff --git a/integration-tests/ccip-tests/smoke/ccip_test.go b/integration-tests/ccip-tests/smoke/ccip_test.go
index 83bed78507..bf2533f02a 100644
--- a/integration-tests/ccip-tests/smoke/ccip_test.go
+++ b/integration-tests/ccip-tests/smoke/ccip_test.go
@@ -3,26 +3,30 @@ package smoke
import (
"fmt"
"math/big"
+ "strings"
"testing"
"time"
"github.com/AlekSi/pointer"
+ "github.com/ethereum/go-ethereum/core/types"
"github.com/rs/zerolog"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-common/pkg/config"
"github.com/smartcontractkit/chainlink-testing-framework/lib/logging"
+ "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/osutil"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr"
+ "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/actions"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
- "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/actions"
"github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/contracts"
"github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testconfig"
"github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testreporters"
"github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testsetups"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool"
)
type testDefinition struct {
@@ -906,6 +910,123 @@ func TestSmokeCCIPReorgAboveFinalityAtSource(t *testing.T) {
})
}
+// TestSmokeCCIPForGivenNetworkPairs is designed specifically for scheduled mainnet testing. This test checks for recent
+// transaction and skip the lanes accordingly. This test also has capability to take override input on network pairs and phase timeout.
+func TestSmokeCCIPForGivenNetworkPairs(t *testing.T) {
+ t.Parallel()
+ log := logging.GetTestLogger(t)
+ TestCfg := testsetups.NewCCIPTestConfig(t, log, testconfig.Smoke)
+ // override network pairs
+ var temp []testsetups.NetworkPair
+ overrideNetworkPairs, err := osutil.GetEnv("OVERRIDE_NETWORK_PAIRS")
+ require.NoError(t, err, "Error getting OVERRIDE_NETWORK_PAIRS environment variable")
+ if overrideNetworkPairs != "" {
+ networkPairs := strings.Split(overrideNetworkPairs, ";")
+ for _, networkPair := range networkPairs {
+ // check for any malformed inputs
+ if !strings.Contains(networkPair, ",") || len(strings.Split(networkPair, ",")) != 2 {
+ log.Error().Msgf("malformed OVERRIDE_NETWORK_PAIRS environment variable for network pair: %s ", networkPair)
+ return
+ }
+ networkPair = strings.ToUpper(strings.ReplaceAll(networkPair, "_", " "))
+ for _, network := range TestCfg.NetworkPairs {
+ if strings.Contains(networkPair, strings.ToUpper(network.NetworkA.Name)) && strings.Contains(networkPair, strings.ToUpper(network.NetworkB.Name)) {
+ temp = append(temp, network)
+ break
+ }
+ }
+ }
+ log.Info().Int("Pairs", len(temp)).Msg("Number of lanes overridden in the test")
+ log.Info().Interface("Lanes", networkPairs).Msg("Lanes under test")
+ TestCfg.NetworkPairs = temp
+ }
+
+ // phase timeout override
+ phaseTimeout, err := osutil.GetEnv("OVERRIDE_PHASE_TIMEOUT")
+ require.NoError(t, err, "Error getting OVERRIDE_PHASE_TIMEOUT environment variable")
+ if phaseTimeout != "" {
+ configDuration, err := config.ParseDuration(phaseTimeout)
+ require.NoError(t, err, "Error parsing phase timeout value")
+ TestCfg.TestGroupInput.PhaseTimeout = &configDuration
+ log.Info().Float64("Timeout in minutes", configDuration.Duration().Minutes()).Msg("Phase timeout is overridden")
+ }
+
+ gasLimit := big.NewInt(*TestCfg.TestGroupInput.MsgDetails.DestGasLimit)
+ setUpOutput := testsetups.CCIPDefaultTestSetUp(t, &log, "smoke-ccip", nil, TestCfg)
+ if len(setUpOutput.Lanes) == 0 {
+ log.Error().Msg("No lanes found")
+ return
+ }
+
+ t.Cleanup(func() {
+ // If we are running a test that is a token transfer, we need to verify the balance.
+ // skip the balance check for existing deployment, there can be multiple external requests in progress for existing deployments
+ // other than token transfer initiated by the test, which can affect the balance check
+ // therefore we check the balance only for the ccip environment created by the test
+ if TestCfg.TestGroupInput.MsgDetails.IsTokenTransfer() &&
+ !pointer.GetBool(TestCfg.TestGroupInput.USDCMockDeployment) &&
+ !pointer.GetBool(TestCfg.TestGroupInput.ExistingDeployment) {
+ setUpOutput.Balance.Verify(t)
+ }
+ require.NoError(t, setUpOutput.TearDown(), "error in tear down step")
+ })
+
+ var tests []testDefinition
+ lookBackDuration := TestCfg.TestGroupInput.SkipRequestIfAnotherRequestTriggeredWithin
+ var recentTxFound *types.Log
+
+ addLanesToTest := func(lane *actions.CCIPLane) {
+ // Create test definitions for given lane if no previous request has been triggered within the specified timeframe.
+ // By default, the timeframe is set to nil. To define a timeframe, assign a duration to the variable
+ // SkipRequestIfAnotherRequestTriggeredWithin.
+ if lookBackDuration != nil {
+ recentTxFound, err = lane.Source.IsPastRequestTriggeredWithinTimeframe(lane.Context, lookBackDuration)
+ require.NoError(t, err, "error while finding recent request for lane network %s to network %s",
+ lane.SourceNetworkName, lane.DestNetworkName)
+ }
+ if recentTxFound == nil {
+ tests = append(tests, testDefinition{
+ testName: fmt.Sprintf("CCIP message transfer from network %s to network %s",
+ lane.SourceNetworkName, lane.DestNetworkName),
+ lane: lane,
+ })
+ } else {
+ log.Info().
+ Str("TX", recentTxFound.TxHash.Hex()).
+ Uint64("Block Number", recentTxFound.BlockNumber).
+ Str("Source", lane.SourceNetworkName).
+ Str("Dest", lane.DestNetworkName).
+ Msgf("Lane Skipped. Recent request found within %v minutes.", lookBackDuration.Duration().Minutes())
+ }
+ }
+ for _, lane := range setUpOutput.Lanes {
+ addLanesToTest(lane.ForwardLane)
+ if lane.ReverseLane != nil {
+ recentTxFound = nil
+ addLanesToTest(lane.ReverseLane)
+ }
+ }
+
+ // Execute tests.
+ log.Info().Int("Total Lanes", len(tests)).Msg("Starting CCIP test")
+ for _, test := range tests {
+ tc := test
+ t.Run(tc.testName, func(t *testing.T) {
+ t.Parallel()
+ tc.lane.Test = t
+ log.Info().
+ Str("Source", tc.lane.SourceNetworkName).
+ Str("Destination", tc.lane.DestNetworkName).
+ Msgf("Starting lane %s -> %s", tc.lane.SourceNetworkName, tc.lane.DestNetworkName)
+
+ tc.lane.RecordStateBeforeTransfer()
+ err = tc.lane.SendRequests(1, gasLimit)
+ require.NoError(t, err, "error sending requests")
+ tc.lane.ValidateRequests()
+ })
+ }
+}
+
// performAboveFinalityReorgAndValidate is to perform the above finality reorg test
func performAboveFinalityReorgAndValidate(t *testing.T, network string) {
t.Helper()
diff --git a/integration-tests/ccip-tests/testconfig/README.md b/integration-tests/ccip-tests/testconfig/README.md
index 474ac2a3af..cf1431baa9 100644
--- a/integration-tests/ccip-tests/testconfig/README.md
+++ b/integration-tests/ccip-tests/testconfig/README.md
@@ -657,6 +657,13 @@ Specifies the OCR parameters for the execute job. This is only valid if the test
Specifies the value for the `InflightExpiry` in commit job's offchain config. This is only valid if the test is not run on [existing deployments](#ccipgroupstestgroupexistingdeployment).
+### CCIP.Groups.[testgroup].SkipRequestIfAnotherRequestTriggeredWithin
+
+If there is CCIP Send requested event present within this duration, the test will skip sending another
+request during load run or avoid sending request in smoke test in that lane. For Example,
+if `SkipRequestIfAnotherRequestTriggeredWithin` is set to `40m`, and a request is triggered at 0th second, the test will skip sending another request for another 40m.
+This particular field is used to avoid sending transaction when there is traffic already in that lane.
+
### CCIP.Groups.[testgroup].OffRampConfig
Specifies the offramp configuration for the execution job. This is only valid if the test is not run on [existing deployments](#ccipgroupstestgroupexistingdeployment).
@@ -736,11 +743,6 @@ Specifies the duration network delay used for `NetworkChaos` experiment. This is
If there are multiple chaos experiments, this specifies the duration to wait between each chaos experiment. This is only valid if the test is run on k8s and not on [existing deployments](#ccipgroupstestgroupexistingdeployment).
-#### CCIP.Groups.[testgroup].LoadProfile.SkipRequestIfAnotherRequestTriggeredWithin
-
-If a request is triggered within this duration, the test will skip sending another request during load run. For Example, if `SkipRequestIfAnotherRequestTriggeredWithin` is set to `40m`, and a request is triggered at 0th second, the test will skip sending another request for another 40m.
-This particular field is used to avoid sending multiple requests in a short duration during load run.
-
#### CCIP.Groups.[testgroup].LoadProfile.OptimizeSpace
This is used internally to optimize memory usage during load run. If set to true, after the initial lane set up is over the test will discard the lane config to save memory.
diff --git a/integration-tests/ccip-tests/testconfig/ccip.go b/integration-tests/ccip-tests/testconfig/ccip.go
index 1f4dfaac51..7925ffa71f 100644
--- a/integration-tests/ccip-tests/testconfig/ccip.go
+++ b/integration-tests/ccip-tests/testconfig/ccip.go
@@ -211,19 +211,18 @@ type LoadFrequency struct {
}
type LoadProfile struct {
- MsgProfile *MsgProfile `toml:",omitempty"`
- FrequencyByDestination map[string]*LoadFrequency `toml:",omitempty"`
- RequestPerUnitTime []int64 `toml:",omitempty"`
- TimeUnit *config.Duration `toml:",omitempty"`
- StepDuration []*config.Duration `toml:",omitempty"`
- TestDuration *config.Duration `toml:",omitempty"`
- NetworkChaosDelay *config.Duration `toml:",omitempty"`
- WaitBetweenChaosDuringLoad *config.Duration `toml:",omitempty"`
- SkipRequestIfAnotherRequestTriggeredWithin *config.Duration `toml:",omitempty"`
- OptimizeSpace *bool `toml:",omitempty"`
- FailOnFirstErrorInLoad *bool `toml:",omitempty"`
- SendMaxDataInEveryMsgCount *int64 `toml:",omitempty"`
- TestRunName string `toml:",omitempty"`
+ MsgProfile *MsgProfile `toml:",omitempty"`
+ FrequencyByDestination map[string]*LoadFrequency `toml:",omitempty"`
+ RequestPerUnitTime []int64 `toml:",omitempty"`
+ TimeUnit *config.Duration `toml:",omitempty"`
+ StepDuration []*config.Duration `toml:",omitempty"`
+ TestDuration *config.Duration `toml:",omitempty"`
+ NetworkChaosDelay *config.Duration `toml:",omitempty"`
+ WaitBetweenChaosDuringLoad *config.Duration `toml:",omitempty"`
+ OptimizeSpace *bool `toml:",omitempty"`
+ FailOnFirstErrorInLoad *bool `toml:",omitempty"`
+ SendMaxDataInEveryMsgCount *int64 `toml:",omitempty"`
+ TestRunName string `toml:",omitempty"`
}
func (l *LoadProfile) Validate() error {
@@ -242,9 +241,7 @@ func (l *LoadProfile) Validate() error {
if l.TestDuration == nil || l.TestDuration.Duration().Minutes() == 0 {
return fmt.Errorf("test duration should be set")
}
- if l.SkipRequestIfAnotherRequestTriggeredWithin != nil && l.TimeUnit.Duration() < l.SkipRequestIfAnotherRequestTriggeredWithin.Duration() {
- return fmt.Errorf("SkipRequestIfAnotherRequestTriggeredWithin should be set below the TimeUnit duration")
- }
+
return nil
}
@@ -265,35 +262,36 @@ func (gp *ReorgProfile) Validate() error {
// CCIPTestGroupConfig defines configuration input to change how a particular CCIP test group should run
type CCIPTestGroupConfig struct {
- Type string `toml:",omitempty"`
- KeepEnvAlive *bool `toml:",omitempty"`
- BiDirectionalLane *bool `toml:",omitempty"`
- CommitAndExecuteOnSameDON *bool `toml:",omitempty"`
- AllowOutOfOrder *bool `toml:",omitempty"` // To set out of order execution globally
- NoOfCommitNodes int `toml:",omitempty"`
- MsgDetails *MsgDetails `toml:",omitempty"`
- TokenConfig *TokenConfig `toml:",omitempty"`
- MulticallInOneTx *bool `toml:",omitempty"`
- NoOfSendsInMulticall int `toml:",omitempty"`
- PhaseTimeout *config.Duration `toml:",omitempty"`
- LocalCluster *bool `toml:",omitempty"`
- ExistingDeployment *bool `toml:",omitempty"`
- ReuseContracts *bool `toml:",omitempty"`
- NodeFunding float64 `toml:",omitempty"`
- NetworkPairs []string `toml:",omitempty"`
- DenselyConnectedNetworkChainIds []string `toml:",omitempty"`
- NoOfNetworks int `toml:",omitempty"`
- NoOfRoutersPerPair int `toml:",omitempty"`
- MaxNoOfLanes int `toml:",omitempty"`
- ChaosDuration *config.Duration `toml:",omitempty"`
- USDCMockDeployment *bool `toml:",omitempty"`
- CommitOCRParams *contracts.OffChainAggregatorV2Config `toml:",omitempty"`
- ExecOCRParams *contracts.OffChainAggregatorV2Config `toml:",omitempty"`
- OffRampConfig *OffRampConfig `toml:",omitempty"`
- CommitInflightExpiry *config.Duration `toml:",omitempty"`
- StoreLaneConfig *bool `toml:",omitempty"`
- LoadProfile *LoadProfile `toml:",omitempty"`
- ReorgProfile *ReorgProfile `toml:",omitempty"`
+ Type string `toml:",omitempty"`
+ KeepEnvAlive *bool `toml:",omitempty"`
+ BiDirectionalLane *bool `toml:",omitempty"`
+ CommitAndExecuteOnSameDON *bool `toml:",omitempty"`
+ AllowOutOfOrder *bool `toml:",omitempty"` // To set out of order execution globally
+ NoOfCommitNodes int `toml:",omitempty"`
+ MsgDetails *MsgDetails `toml:",omitempty"`
+ TokenConfig *TokenConfig `toml:",omitempty"`
+ MulticallInOneTx *bool `toml:",omitempty"`
+ NoOfSendsInMulticall int `toml:",omitempty"`
+ PhaseTimeout *config.Duration `toml:",omitempty"`
+ LocalCluster *bool `toml:",omitempty"`
+ ExistingDeployment *bool `toml:",omitempty"`
+ ReuseContracts *bool `toml:",omitempty"`
+ NodeFunding float64 `toml:",omitempty"`
+ NetworkPairs []string `toml:",omitempty"`
+ DenselyConnectedNetworkChainIds []string `toml:",omitempty"`
+ NoOfNetworks int `toml:",omitempty"`
+ NoOfRoutersPerPair int `toml:",omitempty"`
+ MaxNoOfLanes int `toml:",omitempty"`
+ ChaosDuration *config.Duration `toml:",omitempty"`
+ USDCMockDeployment *bool `toml:",omitempty"`
+ CommitOCRParams *contracts.OffChainAggregatorV2Config `toml:",omitempty"`
+ ExecOCRParams *contracts.OffChainAggregatorV2Config `toml:",omitempty"`
+ OffRampConfig *OffRampConfig `toml:",omitempty"`
+ CommitInflightExpiry *config.Duration `toml:",omitempty"`
+ StoreLaneConfig *bool `toml:",omitempty"`
+ LoadProfile *LoadProfile `toml:",omitempty"`
+ ReorgProfile *ReorgProfile `toml:",omitempty"`
+ SkipRequestIfAnotherRequestTriggeredWithin *config.Duration `toml:",omitempty"`
}
func (c *CCIPTestGroupConfig) Validate() error {
@@ -341,6 +339,10 @@ func (c *CCIPTestGroupConfig) Validate() error {
return fmt.Errorf("number of sends in multisend should be greater than 0 if multisend is true")
}
}
+ if c.SkipRequestIfAnotherRequestTriggeredWithin != nil && c.LoadProfile != nil &&
+ c.LoadProfile.TimeUnit.Duration() < c.SkipRequestIfAnotherRequestTriggeredWithin.Duration() {
+ return fmt.Errorf("SkipRequestIfAnotherRequestTriggeredWithin should be set below the load TimeUnit duration")
+ }
return nil
}
diff --git a/integration-tests/ccip-tests/testconfig/override/mainnet.toml b/integration-tests/ccip-tests/testconfig/override/mainnet.toml
index f723411eaf..6fa0c3e0dd 100644
--- a/integration-tests/ccip-tests/testconfig/override/mainnet.toml
+++ b/integration-tests/ccip-tests/testconfig/override/mainnet.toml
@@ -1081,52 +1081,80 @@ TTL = '8h'
[CCIP.Env.Network]
selected_networks = [
- 'ARBITRUM_MAINNET',
- 'AVALANCHE_MAINNET',
- 'BSC_MAINNET',
- 'BASE_MAINNET',
- 'ETHEREUM_MAINNET',
- 'KROMA_MAINNET',
- 'OPTIMISM_MAINNET',
- 'POLYGON_MAINNET',
- 'WEMIX_MAINNET',
- ]
+ 'ARBITRUM_MAINNET',
+ 'AVALANCHE_MAINNET',
+ 'BASE_MAINNET',
+ 'BLAST_MAINNET',
+ 'BSC_MAINNET',
+ 'CELO_MAINNET',
+ 'ETHEREUM_MAINNET',
+ 'GNOSIS_MAINNET',
+ 'KROMA_MAINNET',
+ 'METIS_ANDROMEDA',
+ 'MODE_MAINNET',
+ 'OPTIMISM_MAINNET',
+ 'POLYGON_MAINNET',
+ 'WEMIX_MAINNET',
+ 'ZKSYNC_MAINNET',
+]
[CCIP.Groups.load]
NetworkPairs = [
- 'ETHEREUM_MAINNET,OPTIMISM_MAINNET',
- 'ETHEREUM_MAINNET,AVALANCHE_MAINNET',
- 'ETHEREUM_MAINNET,POLYGON_MAINNET',
- 'ETHEREUM_MAINNET,BSC_MAINNET',
- 'ETHEREUM_MAINNET,ARBITRUM_MAINNET',
- 'ETHEREUM_MAINNET,BASE_MAINNET',
- 'ETHEREUM_MAINNET,WEMIX_MAINNET',
- 'AVALANCHE_MAINNET,POLYGON_MAINNET',
- 'BASE_MAINNET,OPTIMISM_MAINNET',
- 'BASE_MAINNET,ARBITRUM_MAINNET',
- 'AVALANCHE_MAINNET,BSC_MAINNET',
- 'BSC_MAINNET,POLYGON_MAINNET',
- 'OPTIMISM_MAINNET,POLYGON_MAINNET',
- 'BASE_MAINNET,BSC_MAINNET',
- 'POLYGON_MAINNET,ARBITRUM_MAINNET', # added as batch 1
- 'ARBITRUM_MAINNET,BSC_MAINNET', # added as batch 1
- 'ARBITRUM_MAINNET,OPTIMISM_MAINNET', # added as batch 1
- 'AVALANCHE_MAINNET,OPTIMISM_MAINNET', # added as batch 2
- 'AVALANCHE_MAINNET,ARBITRUM_MAINNET', # added as batch 2
- 'BASE_MAINNET,POLYGON_MAINNET', # added as batch 2
- 'BSC_MAINNET,OPTIMISM_MAINNET', # added as batch 2
- 'AVALANCHE_MAINNET,BASE_MAINNET', # added as batch 2
- 'WEMIX_MAINNET,KROMA_MAINNET',
- 'BSC_MAINNET,WEMIX_MAINNET', # added as batch 2
- 'AVALANCHE_MAINNET,WEMIX_MAINNET', # added as batch 2
- 'POLYGON_MAINNET,WEMIX_MAINNET', # added as batch 2
- 'WEMIX_MAINNET,ARBITRUM_MAINNET', # added as batch 2
- 'OPTIMISM_MAINNET,WEMIX_MAINNET' # added as batch 2
+ 'ARBITRUM_MAINNET,BSC_MAINNET',
+ 'ARBITRUM_MAINNET,OPTIMISM_MAINNET',
+ 'AVALANCHE_MAINNET,ARBITRUM_MAINNET',
+ 'AVALANCHE_MAINNET,BASE_MAINNET',
+ 'AVALANCHE_MAINNET,BSC_MAINNET',
+ 'AVALANCHE_MAINNET,OPTIMISM_MAINNET',
+ 'AVALANCHE_MAINNET,POLYGON_MAINNET',
+ 'AVALANCHE_MAINNET,WEMIX_MAINNET',
+ 'BASE_MAINNET,ARBITRUM_MAINNET',
+ 'BASE_MAINNET,BSC_MAINNET',
+ 'BASE_MAINNET,OPTIMISM_MAINNET',
+ 'BASE_MAINNET,POLYGON_MAINNET',
+ 'BLAST_MAINNET,ARBITRUM_MAINNET',
+ 'BLAST_MAINNET,BASE_MAINNET',
+ 'BLAST_MAINNET,BSC_MAINNET',
+ 'BSC_MAINNET,OPTIMISM_MAINNET',
+ 'BSC_MAINNET,POLYGON_MAINNET',
+ 'BSC_MAINNET,WEMIX_MAINNET',
+ 'ETHEREUM_MAINNET,ARBITRUM_MAINNET',
+ 'ETHEREUM_MAINNET,AVALANCHE_MAINNET',
+ 'ETHEREUM_MAINNET,BASE_MAINNET',
+ 'ETHEREUM_MAINNET,BLAST_MAINNET',
+ 'ETHEREUM_MAINNET,BSC_MAINNET',
+ 'ETHEREUM_MAINNET,CELO_MAINNET',
+ 'ETHEREUM_MAINNET,GNOSIS_MAINNET',
+ 'ETHEREUM_MAINNET,METIS_ANDROMEDA',
+ 'ETHEREUM_MAINNET,MODE_MAINNET',
+ 'ETHEREUM_MAINNET,OPTIMISM_MAINNET',
+ 'ETHEREUM_MAINNET,POLYGON_MAINNET',
+ 'ETHEREUM_MAINNET,WEMIX_MAINNET',
+ 'ETHEREUM_MAINNET,ZKSYNC_MAINNET',
+ 'GNOSIS_MAINNET,ARBITRUM_MAINNET',
+ 'GNOSIS_MAINNET,AVALANCHE_MAINNET',
+ 'GNOSIS_MAINNET,BASE_MAINNET',
+ 'GNOSIS_MAINNET,BSC_MAINNET',
+ 'GNOSIS_MAINNET,OPTIMISM_MAINNET',
+ 'GNOSIS_MAINNET,POLYGON_MAINNET',
+ 'METIS_ANDROMEDA,ARBITRUM_MAINNET',
+ 'MODE_MAINNET,ARBITRUM_MAINNET',
+ 'MODE_MAINNET,BASE_MAINNET',
+ 'MODE_MAINNET,BSC_MAINNET',
+ 'MODE_MAINNET,OPTIMISM_MAINNET',
+ 'OPTIMISM_MAINNET,POLYGON_MAINNET',
+ 'OPTIMISM_MAINNET,WEMIX_MAINNET',
+ 'POLYGON_MAINNET,ARBITRUM_MAINNET',
+ 'POLYGON_MAINNET,WEMIX_MAINNET',
+ 'WEMIX_MAINNET,ARBITRUM_MAINNET',
+ 'WEMIX_MAINNET,KROMA_MAINNET',
+ 'ZKSYNC_MAINNET,ARBITRUM_MAINNET'
]
BiDirectionalLane = true
-PhaseTimeout = '30m'
+PhaseTimeout = '20m'
ExistingDeployment = true
+SkipRequestIfAnotherRequestTriggeredWithin = '40m'
[CCIP.Groups.load.TokenConfig]
NoOfTokensPerChain = 1
@@ -1137,7 +1165,7 @@ TimeUnit = '1h'
TestDuration = '5h'
TestRunName = 'Soak_test_mainnet'
FailOnFirstErrorInLoad = true
-SkipRequestIfAnotherRequestTriggeredWithin = '40m'
+
[[CCIP.Groups.load.LoadProfile.MsgProfile.MsgDetails]]
MsgType = 'Data'
@@ -1149,34 +1177,55 @@ AmountPerToken = 1
[CCIP.Groups.smoke]
# these are all the valid network pairs
NetworkPairs = [
- 'ETHEREUM_MAINNET,OPTIMISM_MAINNET',
- 'ETHEREUM_MAINNET,AVALANCHE_MAINNET',
- 'ETHEREUM_MAINNET,POLYGON_MAINNET',
- 'ETHEREUM_MAINNET,BSC_MAINNET',
- 'ETHEREUM_MAINNET,ARBITRUM_MAINNET',
- 'ETHEREUM_MAINNET,BASE_MAINNET',
- 'ETHEREUM_MAINNET,WEMIX_MAINNET',
- 'AVALANCHE_MAINNET,POLYGON_MAINNET',
- 'BASE_MAINNET,OPTIMISM_MAINNET',
- 'BASE_MAINNET,ARBITRUM_MAINNET',
- 'AVALANCHE_MAINNET,BSC_MAINNET',
- 'BSC_MAINNET,POLYGON_MAINNET',
- 'OPTIMISM_MAINNET,POLYGON_MAINNET',
- 'BASE_MAINNET,BSC_MAINNET',
- 'POLYGON_MAINNET,ARBITRUM_MAINNET', # added as batch 1
- 'ARBITRUM_MAINNET,BSC_MAINNET', # added as batch 1
- 'ARBITRUM_MAINNET,OPTIMISM_MAINNET', # added as batch 1
- 'AVALANCHE_MAINNET,OPTIMISM_MAINNET', # added as batch 2
- 'AVALANCHE_MAINNET,ARBITRUM_MAINNET', # added as batch 2
- 'BASE_MAINNET,POLYGON_MAINNET', # added as batch 2
- 'BSC_MAINNET,OPTIMISM_MAINNET', # added as batch 2
- 'AVALANCHE_MAINNET,BASE_MAINNET', # added as batch 2
- 'WEMIX_MAINNET,KROMA_MAINNET',
- 'BSC_MAINNET,WEMIX_MAINNET', # added as batch 2
- 'AVALANCHE_MAINNET,WEMIX_MAINNET', # added as batch 2
- 'POLYGON_MAINNET,WEMIX_MAINNET', # added as batch 2
- 'WEMIX_MAINNET,ARBITRUM_MAINNET', # added as batch 2
- 'OPTIMISM_MAINNET,WEMIX_MAINNET' # added as batch 2
+ 'ARBITRUM_MAINNET,BSC_MAINNET',
+ 'ARBITRUM_MAINNET,OPTIMISM_MAINNET',
+ 'AVALANCHE_MAINNET,ARBITRUM_MAINNET',
+ 'AVALANCHE_MAINNET,BASE_MAINNET',
+ 'AVALANCHE_MAINNET,BSC_MAINNET',
+ 'AVALANCHE_MAINNET,OPTIMISM_MAINNET',
+ 'AVALANCHE_MAINNET,POLYGON_MAINNET',
+ 'AVALANCHE_MAINNET,WEMIX_MAINNET',
+ 'BASE_MAINNET,ARBITRUM_MAINNET',
+ 'BASE_MAINNET,BSC_MAINNET',
+ 'BASE_MAINNET,OPTIMISM_MAINNET',
+ 'BASE_MAINNET,POLYGON_MAINNET',
+ 'BLAST_MAINNET,ARBITRUM_MAINNET',
+ 'BLAST_MAINNET,BASE_MAINNET',
+ 'BLAST_MAINNET,BSC_MAINNET',
+ 'BSC_MAINNET,OPTIMISM_MAINNET',
+ 'BSC_MAINNET,POLYGON_MAINNET',
+ 'BSC_MAINNET,WEMIX_MAINNET',
+ 'ETHEREUM_MAINNET,ARBITRUM_MAINNET',
+ 'ETHEREUM_MAINNET,AVALANCHE_MAINNET',
+ 'ETHEREUM_MAINNET,BASE_MAINNET',
+ 'ETHEREUM_MAINNET,BLAST_MAINNET',
+ 'ETHEREUM_MAINNET,BSC_MAINNET',
+ 'ETHEREUM_MAINNET,CELO_MAINNET',
+ 'ETHEREUM_MAINNET,GNOSIS_MAINNET',
+ 'ETHEREUM_MAINNET,METIS_ANDROMEDA',
+ 'ETHEREUM_MAINNET,MODE_MAINNET',
+ 'ETHEREUM_MAINNET,OPTIMISM_MAINNET',
+ 'ETHEREUM_MAINNET,POLYGON_MAINNET',
+ 'ETHEREUM_MAINNET,WEMIX_MAINNET',
+ 'ETHEREUM_MAINNET,ZKSYNC_MAINNET',
+ 'GNOSIS_MAINNET,ARBITRUM_MAINNET',
+ 'GNOSIS_MAINNET,AVALANCHE_MAINNET',
+ 'GNOSIS_MAINNET,BASE_MAINNET',
+ 'GNOSIS_MAINNET,BSC_MAINNET',
+ 'GNOSIS_MAINNET,OPTIMISM_MAINNET',
+ 'GNOSIS_MAINNET,POLYGON_MAINNET',
+ 'METIS_ANDROMEDA,ARBITRUM_MAINNET',
+ 'MODE_MAINNET,ARBITRUM_MAINNET',
+ 'MODE_MAINNET,BASE_MAINNET',
+ 'MODE_MAINNET,BSC_MAINNET',
+ 'MODE_MAINNET,OPTIMISM_MAINNET',
+ 'OPTIMISM_MAINNET,POLYGON_MAINNET',
+ 'OPTIMISM_MAINNET,WEMIX_MAINNET',
+ 'POLYGON_MAINNET,ARBITRUM_MAINNET',
+ 'POLYGON_MAINNET,WEMIX_MAINNET',
+ 'WEMIX_MAINNET,ARBITRUM_MAINNET',
+ 'WEMIX_MAINNET,KROMA_MAINNET',
+ 'ZKSYNC_MAINNET,ARBITRUM_MAINNET'
]
BiDirectionalLane = true
@@ -1184,7 +1233,7 @@ PhaseTimeout = '20m'
LocalCluster = false
ExistingDeployment = true
ReuseContracts = true
-
+SkipRequestIfAnotherRequestTriggeredWithin = '24h'
[CCIP.Groups.smoke.TokenConfig]
NoOfTokensPerChain = 1
From b71329d41b803ca16dc9a1f9d5247c87fd6fbc32 Mon Sep 17 00:00:00 2001
From: Patrick
Date: Fri, 27 Sep 2024 09:52:37 -0400
Subject: [PATCH 12/32] Removing chain dependencies from NewCommitServices
construct (#1361)
## Motivation
LOOP-ify
## Solution
---------
Co-authored-by: Bartek Tofel
Co-authored-by: lukaszcl <120112546+lukaszcl@users.noreply.github.com>
---
GNUmakefile | 4 +
core/chainlink.debug.Dockerfile | 97 +++++++++++
core/services/ocr2/delegate.go | 92 +++++++++--
.../plugins/ccip/ccipcommit/initializers.go | 47 +-----
.../ocr2/plugins/ccip/exportinternal.go | 21 ++-
.../plugins/ccip/internal/pricegetter/evm.go | 152 ++++++++++++------
.../ccip/internal/pricegetter/evm_test.go | 118 +++++++++++++-
.../ocr2/plugins/ccip/internal/rpclib/evm.go | 4 +
integration-tests/ccip-tests/Makefile | 7 +
9 files changed, 422 insertions(+), 120 deletions(-)
create mode 100644 core/chainlink.debug.Dockerfile
diff --git a/GNUmakefile b/GNUmakefile
index 55d2de618e..5804d2c9d4 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -48,6 +48,10 @@ install-chainlink: operator-ui ## Install the chainlink binary.
install-chainlink-cover: operator-ui ## Install the chainlink binary with cover flag.
go install -cover $(GOFLAGS) .
+.PHONY: install-chainlink-delve
+install-chainlink-delve: operator-ui ## Install the chainlink binary.
+ go install $(GOFLAGS) -gcflags "all=-N -l" .
+
.PHONY: chainlink
chainlink: ## Build the chainlink binary.
go build $(GOFLAGS) .
diff --git a/core/chainlink.debug.Dockerfile b/core/chainlink.debug.Dockerfile
new file mode 100644
index 0000000000..2e9229cd4c
--- /dev/null
+++ b/core/chainlink.debug.Dockerfile
@@ -0,0 +1,97 @@
+# Build image: Chainlink binary
+FROM golang:1.22-bullseye as buildgo
+RUN go version
+WORKDIR /chainlink
+
+COPY GNUmakefile package.json ./
+COPY tools/bin/ldflags ./tools/bin/
+
+ADD go.mod go.sum ./
+RUN go mod download
+
+# Env vars needed for chainlink build
+ARG COMMIT_SHA
+
+# Build chainlink bin with cover flag https://go.dev/doc/build-cover#FAQ
+ARG GO_COVER_FLAG=false
+
+COPY . .
+
+RUN apt-get update && apt-get install -y jq
+
+# Build the golang binary
+RUN if [ "$GO_COVER_FLAG" = "true" ]; then \
+ make install-chainlink-cover; \
+ else \
+ make install-chainlink-delve; \
+ fi
+
+# Link LOOP Plugin source dirs with simple names
+RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-feeds | xargs -I % ln -s % /chainlink-feeds
+RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-solana | xargs -I % ln -s % /chainlink-solana
+
+# Build image: Plugins
+FROM golang:1.22-bullseye as buildplugins
+RUN go version
+
+WORKDIR /chainlink-feeds
+COPY --from=buildgo /chainlink-feeds .
+RUN go install ./cmd/chainlink-feeds
+
+WORKDIR /chainlink-solana
+COPY --from=buildgo /chainlink-solana .
+RUN go install ./pkg/solana/cmd/chainlink-solana
+
+# Final image: ubuntu with chainlink binary
+FROM golang:1.22-bullseye
+
+ARG CHAINLINK_USER=root
+ENV DEBIAN_FRONTEND noninteractive
+RUN apt-get update && apt-get install -y ca-certificates gnupg lsb-release curl
+
+# Install Postgres for CLI tools, needed specifically for DB backups
+RUN curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
+ && echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" |tee /etc/apt/sources.list.d/pgdg.list \
+ && apt-get update && apt-get install -y postgresql-client-16 \
+ && apt-get clean all \
+ && rm -rf /var/lib/apt/lists/*
+
+COPY --from=buildgo /go/bin/chainlink /usr/local/bin/
+
+# Install (but don't enable) LOOP Plugins
+COPY --from=buildplugins /go/bin/chainlink-feeds /usr/local/bin/
+COPY --from=buildplugins /go/bin/chainlink-solana /usr/local/bin/
+
+# Dependency of CosmWasm/wasmd
+COPY --from=buildgo /go/pkg/mod/github.com/\!cosm\!wasm/wasmvm@v*/internal/api/libwasmvm.*.so /usr/lib/
+RUN chmod 755 /usr/lib/libwasmvm.*.so
+
+RUN if [ ${CHAINLINK_USER} != root ]; then \
+ useradd --uid 14933 --create-home ${CHAINLINK_USER}; \
+ fi
+USER ${CHAINLINK_USER}
+WORKDIR /home/${CHAINLINK_USER}
+RUN mkdir -p go
+# explicit set the cache dir. needed so both root and non-root user has an explicit location
+ENV XDG_CACHE_HOME /home/${CHAINLINK_USER}/.cache
+RUN mkdir -p ${XDG_CACHE_HOME}
+
+# Set up env and dir for go coverage profiling https://go.dev/doc/build-cover#FAQ
+ARG GO_COVER_DIR="/var/tmp/go-coverage"
+ENV GOCOVERDIR=${GO_COVER_DIR}
+RUN mkdir -p $GO_COVER_DIR
+
+# Install dlv
+ENV GOPATH=/home/${CHAINLINK_USER}/go
+ENV PATH=$PATH:$GOPATH/bin
+RUN go install github.com/go-delve/delve/cmd/dlv@latest
+
+EXPOSE 6688
+ENTRYPOINT ["chainlink"]
+
+HEALTHCHECK CMD curl -f http://localhost:6688/health || exit 1
+
+# Delve port
+EXPOSE 40000
+
+CMD ["dlv", "exec", "/usr/local/bin/chainlink", "--accept-multiclient", "--headless", "--listen=0.0.0.0:40000", "--api-version=2", "--", "local", "node"]
diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go
index 7c99083a97..699c552030 100644
--- a/core/services/ocr2/delegate.go
+++ b/core/services/ocr2/delegate.go
@@ -7,23 +7,20 @@ import (
"fmt"
"log"
"strconv"
+ "strings"
"time"
- "gopkg.in/guregu/null.v4"
-
- cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
- "github.com/smartcontractkit/chainlink-common/pkg/types/core"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
-
"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus"
+ "google.golang.org/grpc"
+ "gopkg.in/guregu/null.v4"
+
chainselectors "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/libocr/commontypes"
libocr2 "github.com/smartcontractkit/libocr/offchainreporting2plus"
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
- "google.golang.org/grpc"
ocr2keepers20 "github.com/smartcontractkit/chainlink-automation/pkg/v2"
ocr2keepers20config "github.com/smartcontractkit/chainlink-automation/pkg/v2/config"
@@ -38,10 +35,11 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/loop/reportingplugins/ocr3"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
"github.com/smartcontractkit/chainlink-common/pkg/types"
+ cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/core"
llotypes "github.com/smartcontractkit/chainlink-common/pkg/types/llo"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
datastreamsllo "github.com/smartcontractkit/chainlink-data-streams/llo"
-
"github.com/smartcontractkit/chainlink/v2/core/bridges"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
coreconfig "github.com/smartcontractkit/chainlink/v2/core/config"
@@ -52,8 +50,11 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
"github.com/smartcontractkit/chainlink/v2/core/services/llo"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/ccipcommit"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/ccipexec"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
+ ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/functions"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/generic"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/liquiditymanager"
@@ -63,7 +64,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/median"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/mercury"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper"
-
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21"
ocr2keeper21core "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/validate"
@@ -79,8 +79,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/synchronization"
"github.com/smartcontractkit/chainlink/v2/core/services/telemetry"
"github.com/smartcontractkit/chainlink/v2/plugins"
-
- ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
)
type ErrJobSpecNoRelayer struct {
@@ -1618,7 +1616,77 @@ func (d *Delegate) newServicesCCIPCommit(ctx context.Context, lggr logger.Sugare
MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"job_name": jb.Name.ValueOrZero()}, prometheus.DefaultRegisterer),
}
- return ccipcommit.NewCommitServices(ctx, d.ds, srcProvider, dstProvider, d.legacyChains, jb, lggr, d.pipelineRunner, oracleArgsNoPlugin, d.isNewlyCreatedJob, int64(srcChainID), dstChainID, logError)
+ var priceGetter ccip.AllTokensPriceGetter
+ withPipeline := strings.Trim(pluginJobSpecConfig.TokenPricesUSDPipeline, "\n\t ") != ""
+ if withPipeline {
+ priceGetter, err = ccip.NewPipelineGetter(pluginJobSpecConfig.TokenPricesUSDPipeline, d.pipelineRunner, jb.ID, jb.ExternalJobID, jb.Name.ValueOrZero(), lggr)
+ if err != nil {
+ return nil, fmt.Errorf("creating pipeline price getter: %w", err)
+ }
+ } else {
+ // Use dynamic price getter.
+ if pluginJobSpecConfig.PriceGetterConfig == nil {
+ return nil, fmt.Errorf("priceGetterConfig is nil")
+ }
+
+ // Configure contract readers for all chains specified in the aggregator configurations.
+ // Some lanes (e.g. Wemix/Kroma) requires other clients than source and destination, since they use feeds from other chains.
+ aggregatorChainsToContracts := make(map[uint64][]common.Address)
+ for _, aggCfg := range pluginJobSpecConfig.PriceGetterConfig.AggregatorPrices {
+ if _, ok := aggregatorChainsToContracts[aggCfg.ChainID]; !ok {
+ aggregatorChainsToContracts[aggCfg.ChainID] = make([]common.Address, 0)
+ }
+
+ aggregatorChainsToContracts[aggCfg.ChainID] = append(aggregatorChainsToContracts[aggCfg.ChainID], aggCfg.AggregatorContractAddress)
+ }
+
+ contractReaders := map[uint64]types.ContractReader{}
+
+ for chainID, aggregatorContracts := range aggregatorChainsToContracts {
+ relayID := types.RelayID{Network: spec.Relay, ChainID: strconv.FormatUint(chainID, 10)}
+ relay, rerr := d.RelayGetter.Get(relayID)
+ if rerr != nil {
+ return nil, fmt.Errorf("get relay by id=%v: %w", relayID, err)
+ }
+
+ contractsConfig := make(map[string]evmrelaytypes.ChainContractReader, len(aggregatorContracts))
+ for i := range aggregatorContracts {
+ contractsConfig[fmt.Sprintf("%v_%v", ccip.OFFCHAIN_AGGREGATOR, i)] = evmrelaytypes.ChainContractReader{
+ ContractABI: ccip.OffChainAggregatorABI,
+ Configs: map[string]*evmrelaytypes.ChainReaderDefinition{
+ "decimals": { // CR consumers choose an alias
+ ChainSpecificName: "decimals",
+ },
+ "latestRoundData": {
+ ChainSpecificName: "latestRoundData",
+ },
+ },
+ }
+ }
+ contractReaderConfig := evmrelaytypes.ChainReaderConfig{
+ Contracts: contractsConfig,
+ }
+
+ contractReaderConfigJsonBytes, jerr := json.Marshal(contractReaderConfig)
+ if jerr != nil {
+ return nil, fmt.Errorf("marshal contract reader config: %w", jerr)
+ }
+
+ contractReader, cerr := relay.NewContractReader(ctx, contractReaderConfigJsonBytes)
+ if cerr != nil {
+ return nil, fmt.Errorf("new ccip commit contract reader %w", cerr)
+ }
+
+ contractReaders[chainID] = contractReader
+ }
+
+ priceGetter, err = ccip.NewDynamicPriceGetter(*pluginJobSpecConfig.PriceGetterConfig, contractReaders)
+ if err != nil {
+ return nil, fmt.Errorf("creating dynamic price getter: %w", err)
+ }
+ }
+
+ return ccipcommit.NewCommitServices(ctx, d.ds, srcProvider, dstProvider, priceGetter, jb, lggr, d.pipelineRunner, oracleArgsNoPlugin, d.isNewlyCreatedJob, int64(srcChainID), dstChainID, logError)
}
func newCCIPCommitPluginBytes(isSourceProvider bool, sourceStartBlock uint64, destStartBlock uint64) config.CommitPluginConfig {
diff --git a/core/services/ocr2/plugins/ccip/ccipcommit/initializers.go b/core/services/ocr2/plugins/ccip/ccipcommit/initializers.go
index c5dc8ffb45..b7543df155 100644
--- a/core/services/ocr2/plugins/ccip/ccipcommit/initializers.go
+++ b/core/services/ocr2/plugins/ccip/ccipcommit/initializers.go
@@ -3,14 +3,9 @@ package ccipcommit
import (
"context"
"encoding/json"
- "fmt"
"math/big"
- "strings"
"time"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/pricegetter"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib"
-
"github.com/Masterminds/semver/v3"
"github.com/ethereum/go-ethereum/common"
libocr2 "github.com/smartcontractkit/libocr/offchainreporting2plus"
@@ -27,7 +22,6 @@ import (
db "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdb"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
- "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip"
@@ -48,7 +42,7 @@ var defaultNewReportingPluginRetryConfig = ccipdata.RetryConfig{
MaxRetries: (6 * 4) + 10,
}
-func NewCommitServices(ctx context.Context, ds sqlutil.DataSource, srcProvider commontypes.CCIPCommitProvider, dstProvider commontypes.CCIPCommitProvider, chainSet legacyevm.LegacyChainContainer, jb job.Job, lggr logger.Logger, pr pipeline.Runner, argsNoPlugin libocr2.OCR2OracleArgs, new bool, sourceChainID int64, destChainID int64, logError func(string)) ([]job.ServiceCtx, error) {
+func NewCommitServices(ctx context.Context, ds sqlutil.DataSource, srcProvider commontypes.CCIPCommitProvider, dstProvider commontypes.CCIPCommitProvider, priceGetter ccip.AllTokensPriceGetter, jb job.Job, lggr logger.Logger, pr pipeline.Runner, argsNoPlugin libocr2.OCR2OracleArgs, new bool, sourceChainID int64, destChainID int64, logError func(string)) ([]job.ServiceCtx, error) {
spec := jb.OCR2OracleSpec
var pluginConfig ccipconfig.CommitPluginJobSpecConfig
@@ -75,45 +69,6 @@ func NewCommitServices(ctx context.Context, ds sqlutil.DataSource, srcProvider c
commitStoreReader = ccip.NewProviderProxyCommitStoreReader(srcCommitStore, dstCommitStore)
commitLggr := lggr.Named("CCIPCommit").With("sourceChain", sourceChainID, "destChain", destChainID)
- var priceGetter pricegetter.AllTokensPriceGetter
- withPipeline := strings.Trim(pluginConfig.TokenPricesUSDPipeline, "\n\t ") != ""
- if withPipeline {
- priceGetter, err = pricegetter.NewPipelineGetter(pluginConfig.TokenPricesUSDPipeline, pr, jb.ID, jb.ExternalJobID, jb.Name.ValueOrZero(), lggr)
- if err != nil {
- return nil, fmt.Errorf("creating pipeline price getter: %w", err)
- }
- } else {
- // Use dynamic price getter.
- if pluginConfig.PriceGetterConfig == nil {
- return nil, fmt.Errorf("priceGetterConfig is nil")
- }
-
- // Build price getter clients for all chains specified in the aggregator configurations.
- // Some lanes (e.g. Wemix/Kroma) requires other clients than source and destination, since they use feeds from other chains.
- priceGetterClients := map[uint64]pricegetter.DynamicPriceGetterClient{}
- for _, aggCfg := range pluginConfig.PriceGetterConfig.AggregatorPrices {
- chainID := aggCfg.ChainID
- // Retrieve the chain.
- chain, _, err2 := ccipconfig.GetChainByChainID(chainSet, chainID)
- if err2 != nil {
- return nil, fmt.Errorf("retrieving chain for chainID %d: %w", chainID, err2)
- }
- caller := rpclib.NewDynamicLimitedBatchCaller(
- lggr,
- chain.Client(),
- rpclib.DefaultRpcBatchSizeLimit,
- rpclib.DefaultRpcBatchBackOffMultiplier,
- rpclib.DefaultMaxParallelRpcCalls,
- )
- priceGetterClients[chainID] = pricegetter.NewDynamicPriceGetterClient(caller)
- }
-
- priceGetter, err = pricegetter.NewDynamicPriceGetter(*pluginConfig.PriceGetterConfig, priceGetterClients)
- if err != nil {
- return nil, fmt.Errorf("creating dynamic price getter: %w", err)
- }
- }
-
offRampReader, err := dstProvider.NewOffRampReader(ctx, pluginConfig.OffRamp)
if err != nil {
return nil, err
diff --git a/core/services/ocr2/plugins/ccip/exportinternal.go b/core/services/ocr2/plugins/ccip/exportinternal.go
index 2f924085fb..be39346984 100644
--- a/core/services/ocr2/plugins/ccip/exportinternal.go
+++ b/core/services/ocr2/plugins/ccip/exportinternal.go
@@ -5,12 +5,16 @@ import (
"math/big"
"time"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+
"github.com/ethereum/go-ethereum/common"
+ "github.com/google/uuid"
"github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
"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/logpoller"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/gethwrappers2/generated/offchainaggregator"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc"
@@ -21,8 +25,13 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/pricegetter"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib"
+ "github.com/smartcontractkit/chainlink/v2/core/services/pipeline"
)
+const OFFCHAIN_AGGREGATOR = "OffchainAggregator"
+const DECIMALS_METHOD_NAME = "decimals"
+const LATEST_ROUND_DATA_METHOD_NAME = "latestRoundData"
+
func GenericAddrToEvm(addr ccip.Address) (common.Address, error) {
return ccipcalc.GenericAddrToEvm(addr)
}
@@ -71,12 +80,18 @@ type DynamicPriceGetterClient = pricegetter.DynamicPriceGetterClient
type DynamicPriceGetter = pricegetter.DynamicPriceGetter
+type AllTokensPriceGetter = pricegetter.AllTokensPriceGetter
+
+func NewPipelineGetter(source string, runner pipeline.Runner, jobID int32, externalJobID uuid.UUID, name string, lggr logger.Logger) (*pricegetter.PipelineGetter, error) {
+ return pricegetter.NewPipelineGetter(source, runner, jobID, externalJobID, name, lggr)
+}
+
func NewDynamicPriceGetterClient(batchCaller rpclib.EvmBatchCaller) DynamicPriceGetterClient {
return pricegetter.NewDynamicPriceGetterClient(batchCaller)
}
-func NewDynamicPriceGetter(cfg config.DynamicPriceGetterConfig, evmClients map[uint64]DynamicPriceGetterClient) (*DynamicPriceGetter, error) {
- return pricegetter.NewDynamicPriceGetter(cfg, evmClients)
+func NewDynamicPriceGetter(cfg config.DynamicPriceGetterConfig, contractReaders map[uint64]types.ContractReader) (*DynamicPriceGetter, error) {
+ return pricegetter.NewDynamicPriceGetter(cfg, contractReaders)
}
func NewDynamicLimitedBatchCaller(
@@ -133,3 +148,5 @@ func NewCommitOffchainConfig(
) ccip.CommitOffchainConfig {
return ccipdata.NewCommitOffchainConfig(gasPriceDeviationPPB, gasPriceHeartBeat, tokenPriceDeviationPPB, tokenPriceHeartBeat, inflightCacheExpiry, priceReportingDisabled)
}
+
+const OffChainAggregatorABI = offchainaggregator.OffchainAggregatorABI
diff --git a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
index ac4002f53f..48ad9f3298 100644
--- a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
+++ b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
@@ -7,20 +7,22 @@ import (
"math/big"
"strings"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib"
-
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
+ "go.uber.org/multierr"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
-
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
"github.com/smartcontractkit/chainlink/v2/core/internal/gethwrappers2/generated/offchainaggregator"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib"
)
-const decimalsMethodName = "decimals"
-const latestRoundDataMethodName = "latestRoundData"
+const OFFCHAIN_AGGREGATOR = "OffchainAggregator"
+const DECIMALS_METHOD_NAME = "decimals"
+const LATEST_ROUND_DATA_METHOD_NAME = "latestRoundData"
func init() {
// Ensure existence of latestRoundData method on the Aggregator contract.
@@ -28,8 +30,8 @@ func init() {
if err != nil {
panic(err)
}
- ensureMethodOnContract(aggregatorABI, decimalsMethodName)
- ensureMethodOnContract(aggregatorABI, latestRoundDataMethodName)
+ ensureMethodOnContract(aggregatorABI, DECIMALS_METHOD_NAME)
+ ensureMethodOnContract(aggregatorABI, LATEST_ROUND_DATA_METHOD_NAME)
}
func ensureMethodOnContract(abi abi.ABI, methodName string) {
@@ -49,9 +51,9 @@ func NewDynamicPriceGetterClient(batchCaller rpclib.EvmBatchCaller) DynamicPrice
}
type DynamicPriceGetter struct {
- cfg config.DynamicPriceGetterConfig
- evmClients map[uint64]DynamicPriceGetterClient
- aggregatorAbi abi.ABI
+ cfg config.DynamicPriceGetterConfig
+ contractReaders map[uint64]types.ContractReader
+ aggregatorAbi abi.ABI
}
func NewDynamicPriceGetterConfig(configJson string) (config.DynamicPriceGetterConfig, error) {
@@ -69,7 +71,7 @@ func NewDynamicPriceGetterConfig(configJson string) (config.DynamicPriceGetterCo
// NewDynamicPriceGetter build a DynamicPriceGetter from a configuration and a map of chain ID to batch callers.
// A batch caller should be provided for all retrieved prices.
-func NewDynamicPriceGetter(cfg config.DynamicPriceGetterConfig, evmClients map[uint64]DynamicPriceGetterClient) (*DynamicPriceGetter, error) {
+func NewDynamicPriceGetter(cfg config.DynamicPriceGetterConfig, contractReaders map[uint64]types.ContractReader) (*DynamicPriceGetter, error) {
if err := cfg.Validate(); err != nil {
return nil, fmt.Errorf("validating dynamic price getter config: %w", err)
}
@@ -77,13 +79,13 @@ func NewDynamicPriceGetter(cfg config.DynamicPriceGetterConfig, evmClients map[u
if err != nil {
return nil, fmt.Errorf("parsing offchainaggregator abi: %w", err)
}
- priceGetter := DynamicPriceGetter{cfg, evmClients, aggregatorAbi}
+ priceGetter := DynamicPriceGetter{cfg, contractReaders, aggregatorAbi}
return &priceGetter, nil
}
// FilterConfiguredTokens implements the PriceGetter interface.
// It filters a list of token addresses for only those that have a price resolution rule configured on the PriceGetterConfig
-func (d *DynamicPriceGetter) FilterConfiguredTokens(ctx context.Context, tokens []cciptypes.Address) (configured []cciptypes.Address, unconfigured []cciptypes.Address, err error) {
+func (d *DynamicPriceGetter) FilterConfiguredTokens(_ context.Context, tokens []cciptypes.Address) (configured []cciptypes.Address, unconfigured []cciptypes.Address, err error) {
configured = []cciptypes.Address{}
unconfigured = []cciptypes.Address{}
for _, tk := range tokens {
@@ -103,7 +105,7 @@ func (d *DynamicPriceGetter) FilterConfiguredTokens(ctx context.Context, tokens
return configured, unconfigured, nil
}
-// It returns the prices of all tokens defined in the price getter.
+// GetJobSpecTokenPricesUSD returns the prices of all tokens defined in the price getter.
func (d *DynamicPriceGetter) GetJobSpecTokenPricesUSD(ctx context.Context) (map[cciptypes.Address]*big.Int, error) {
return d.TokenPricesUSD(ctx, d.getAllTokensDefined())
}
@@ -144,60 +146,104 @@ func (d *DynamicPriceGetter) performBatchCalls(ctx context.Context, batchCallsPe
}
// performBatchCall performs a batch call on a given chain to retrieve token prices.
-func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint64, batchCalls *batchCallsForChain, prices map[cciptypes.Address]*big.Int) error {
- // Retrieve the EVM caller for the chain.
- client, exists := d.evmClients[chainID]
- if !exists {
- return fmt.Errorf("evm caller for chain %d not found", chainID)
- }
- evmCaller := client.BatchCaller
-
+func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint64, batchCalls *batchCallsForChain, prices map[cciptypes.Address]*big.Int) (err error) {
nbDecimalCalls := len(batchCalls.decimalCalls)
nbLatestRoundDataCalls := len(batchCalls.decimalCalls)
+ nbCalls := len(batchCalls.decimalCalls)
- // Perform batched call (all decimals calls followed by latest round data calls).
- calls := make([]rpclib.EvmCall, 0, nbDecimalCalls+nbLatestRoundDataCalls)
- calls = append(calls, batchCalls.decimalCalls...)
- calls = append(calls, batchCalls.latestRoundDataCalls...)
+ // Retrieve contract reader for the chain
+ contractReader := d.contractReaders[chainID]
- results, err := evmCaller.BatchCall(ctx, 0, calls)
+ // Bind contract reader to the contract addresses necessary for the batch calls
+ bindings := make([]types.BoundContract, 0)
+ for i, call := range batchCalls.decimalCalls {
+ bindings = append(bindings, types.BoundContract{
+ Address: string(ccipcalc.EvmAddrToGeneric(call.ContractAddress())),
+ Name: fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i),
+ })
+ }
+
+ err = contractReader.Bind(ctx, bindings)
if err != nil {
- return fmt.Errorf("batch call on chain %d failed: %w", chainID, err)
+ return fmt.Errorf("binding contracts failed: %w", err)
}
- // Extract results.
- decimals := make([]uint8, 0, nbDecimalCalls)
- latestRounds := make([]*big.Int, 0, nbLatestRoundDataCalls)
+ // Construct request, adding a decimals and latestRound req per contract name
+ var decimalsReq uint8
+ batchGetLatestValuesRequest := make(map[string]types.ContractBatch)
+ for i, call := range batchCalls.decimalCalls {
+ contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)
+ batchGetLatestValuesRequest[contractName] = append(batchGetLatestValuesRequest[contractName], types.BatchRead{
+ ReadName: call.MethodName(),
+ ReturnVal: &decimalsReq,
+ })
+ }
- for i, res := range results[0:nbDecimalCalls] {
- v, err1 := rpclib.ParseOutput[uint8](res, 0)
- if err1 != nil {
- callSignature := batchCalls.decimalCalls[i].String()
- return fmt.Errorf("parse contract output while calling %v on chain %d: %w", callSignature, chainID, err1)
- }
- decimals = append(decimals, v)
+ for i, call := range batchCalls.latestRoundDataCalls {
+ contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)
+ batchGetLatestValuesRequest[contractName] = append(batchGetLatestValuesRequest[contractName], types.BatchRead{
+ ReadName: call.MethodName(),
+ ReturnVal: &aggregator_v3_interface.LatestRoundData{},
+ })
+ }
+
+ // Perform call
+ result, err2 := contractReader.BatchGetLatestValues(ctx, batchGetLatestValuesRequest)
+ if err2 != nil {
+ return fmt.Errorf("BatchGetLatestValues failed %w", err2)
}
- for i, res := range results[nbDecimalCalls : nbDecimalCalls+nbLatestRoundDataCalls] {
- // latestRoundData function has multiple outputs (roundId,answer,startedAt,updatedAt,answeredInRound).
- // we want the second one (answer, at idx=1).
- v, err1 := rpclib.ParseOutput[*big.Int](res, 1)
- if err1 != nil {
- callSignature := batchCalls.latestRoundDataCalls[i].String()
- return fmt.Errorf("parse contract output while calling %v on chain %d: %w", callSignature, chainID, err1)
+ // Extract results
+ // give result the contract name (key ordering not guaranteed to match that of the request)
+ // and then you get slice of responses
+ decimalsCR := make([]uint8, 0, nbDecimalCalls)
+ latestRoundCR := make([]aggregator_v3_interface.LatestRoundData, 0, nbDecimalCalls)
+ var respErr error
+ for j := range nbCalls {
+ contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, j)
+ offchainAggregatorRespSlice := result[contractName]
+
+ for i, read := range offchainAggregatorRespSlice {
+ val, readErr := read.GetResult()
+ if readErr != nil {
+ respErr = multierr.Append(respErr, fmt.Errorf("error with method call %v: %w", batchCalls.decimalCalls[i].MethodName(), readErr))
+ continue
+ }
+ if read.ReadName == DECIMALS_METHOD_NAME {
+ decimal, ok := val.(*uint8)
+ if !ok {
+ return fmt.Errorf("expected type uint8 for method call %v on contract %v: %w", batchCalls.decimalCalls[i].MethodName(), batchCalls.decimalCalls[i].ContractAddress(), readErr)
+ }
+
+ decimalsCR = append(decimalsCR, *decimal)
+ } else if read.ReadName == LATEST_ROUND_DATA_METHOD_NAME {
+ latestRoundDataRes, ok := val.(*aggregator_v3_interface.LatestRoundData)
+ if !ok {
+ return fmt.Errorf("expected type latestRoundDataConfig for method call %v on contract %v: %w", batchCalls.latestRoundDataCalls[i/2].MethodName(), batchCalls.latestRoundDataCalls[i/2].ContractAddress(), readErr)
+ }
+
+ latestRoundCR = append(latestRoundCR, *latestRoundDataRes)
+ }
}
- latestRounds = append(latestRounds, v)
+ }
+ if respErr != nil {
+ return respErr
+ }
+
+ latestRoundAnswerCR := make([]*big.Int, 0, nbLatestRoundDataCalls)
+ for i := range nbLatestRoundDataCalls {
+ latestRoundAnswerCR = append(latestRoundAnswerCR, latestRoundCR[i].Answer)
}
// Normalize and store prices.
for i := range batchCalls.tokenOrder {
// Normalize to 1e18.
- if decimals[i] < 18 {
- latestRounds[i].Mul(latestRounds[i], big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18-int64(decimals[i])), nil))
- } else if decimals[i] > 18 {
- latestRounds[i].Div(latestRounds[i], big.NewInt(0).Exp(big.NewInt(10), big.NewInt(int64(decimals[i])-18), nil))
+ if decimalsCR[i] < 18 {
+ latestRoundAnswerCR[i].Mul(latestRoundAnswerCR[i], big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18-int64(decimalsCR[i])), nil))
+ } else if decimalsCR[i] > 18 {
+ latestRoundAnswerCR[i].Div(latestRoundAnswerCR[i], big.NewInt(0).Exp(big.NewInt(10), big.NewInt(int64(decimalsCR[i])-18), nil))
}
- prices[ccipcalc.EvmAddrToGeneric(batchCalls.tokenOrder[i])] = latestRounds[i]
+ prices[ccipcalc.EvmAddrToGeneric(batchCalls.tokenOrder[i])] = latestRoundAnswerCR[i]
}
return nil
}
@@ -225,12 +271,12 @@ func (d *DynamicPriceGetter) preparePricesAndBatchCallsPerChain(tokens []cciptyp
chainCalls := batchCallsPerChain[aggCfg.ChainID]
chainCalls.decimalCalls = append(chainCalls.decimalCalls, rpclib.NewEvmCall(
d.aggregatorAbi,
- decimalsMethodName,
+ DECIMALS_METHOD_NAME,
aggCfg.AggregatorContractAddress,
))
chainCalls.latestRoundDataCalls = append(chainCalls.latestRoundDataCalls, rpclib.NewEvmCall(
d.aggregatorAbi,
- latestRoundDataMethodName,
+ LATEST_ROUND_DATA_METHOD_NAME,
aggCfg.AggregatorContractAddress,
))
chainCalls.tokenOrder = append(chainCalls.tokenOrder, tk)
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 78de269968..755bcb84eb 100644
--- a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm_test.go
@@ -1,9 +1,14 @@
package pricegetter
import (
+ "fmt"
"math/big"
"testing"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/targets/mocks"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
@@ -23,6 +28,7 @@ import (
type testParameters struct {
cfg config.DynamicPriceGetterConfig
evmClients map[uint64]DynamicPriceGetterClient
+ contractReaders map[uint64]types.ContractReader
tokens []common.Address
expectedTokenPrices map[common.Address]big.Int
expectedTokenPricesForAll map[common.Address]big.Int
@@ -92,13 +98,13 @@ func TestDynamicPriceGetterWithEmptyInput(t *testing.T) {
},
{
name: "get_all_tokens_static_only",
- param: testGetAllTokensStaticOnly(),
+ param: testGetAllTokensStaticOnly(t),
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
- pg, err := NewDynamicPriceGetter(test.param.cfg, test.param.evmClients)
+ pg, err := NewDynamicPriceGetter(test.param.cfg, test.param.contractReaders)
if test.param.invalidConfigErrorExpected {
require.Error(t, err)
return
@@ -200,6 +206,12 @@ func testParamAggregatorOnly(t *testing.T) testParameters {
uint64(103): mockClient(t, []uint8{18}, []aggregator_v3_interface.LatestRoundData{round3}),
uint64(104): mockClient(t, []uint8{20}, []aggregator_v3_interface.LatestRoundData{round4}),
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
+ uint64(103): mockCR(t, []uint8{18}, []aggregator_v3_interface.LatestRoundData{round3}),
+ uint64(104): mockCR(t, []uint8{20}, []aggregator_v3_interface.LatestRoundData{round4}),
+ }
expectedTokenPrices := map[common.Address]big.Int{
TK1: *multExp(round1.Answer, 10), // expected in 1e18 format.
TK2: *multExp(round2.Answer, 10), // expected in 1e18 format.
@@ -209,6 +221,7 @@ func testParamAggregatorOnly(t *testing.T) testParameters {
return testParameters{
cfg: cfg,
evmClients: evmClients,
+ contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3, TK4},
expectedTokenPrices: expectedTokenPrices,
invalidConfigErrorExpected: false,
@@ -261,6 +274,10 @@ func testParamAggregatorOnlyMulti(t *testing.T) testParameters {
uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockClient(t, []uint8{8, 8}, []aggregator_v3_interface.LatestRoundData{round2, round3}),
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockCR(t, []uint8{8, 8}, []aggregator_v3_interface.LatestRoundData{round2, round3}),
+ }
expectedTokenPrices := map[common.Address]big.Int{
TK1: *multExp(round1.Answer, 10),
TK2: *multExp(round2.Answer, 10),
@@ -269,6 +286,7 @@ func testParamAggregatorOnlyMulti(t *testing.T) testParameters {
return testParameters{
cfg: cfg,
evmClients: evmClients,
+ contractReaders: contractReaders,
invalidConfigErrorExpected: false,
tokens: []common.Address{TK1, TK2, TK3},
expectedTokenPrices: expectedTokenPrices,
@@ -295,6 +313,7 @@ func testParamStaticOnly() testParameters {
}
// Real LINK/USD example from OP.
evmClients := map[uint64]DynamicPriceGetterClient{}
+ contractReaders := map[uint64]types.ContractReader{}
expectedTokenPrices := map[common.Address]big.Int{
TK1: *cfg.StaticPrices[TK1].Price,
TK2: *cfg.StaticPrices[TK2].Price,
@@ -303,6 +322,7 @@ func testParamStaticOnly() testParameters {
return testParameters{
cfg: cfg,
evmClients: evmClients,
+ contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
expectedTokenPrices: expectedTokenPrices,
}
@@ -347,6 +367,10 @@ func testParamNoAggregatorForToken(t *testing.T) testParameters {
uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
+ }
expectedTokenPrices := map[common.Address]big.Int{
TK1: *round1.Answer,
TK2: *round2.Answer,
@@ -356,6 +380,7 @@ func testParamNoAggregatorForToken(t *testing.T) testParameters {
return testParameters{
cfg: cfg,
evmClients: evmClients,
+ contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3, TK4},
expectedTokenPrices: expectedTokenPrices,
priceResolutionErrorExpected: true,
@@ -401,6 +426,10 @@ func testParamAggregatorAndStaticValid(t *testing.T) testParameters {
uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
+ }
expectedTokenPrices := map[common.Address]big.Int{
TK1: *multExp(round1.Answer, 10),
TK2: *multExp(round2.Answer, 10),
@@ -409,6 +438,7 @@ func testParamAggregatorAndStaticValid(t *testing.T) testParameters {
return testParameters{
cfg: cfg,
evmClients: evmClients,
+ contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
expectedTokenPrices: expectedTokenPrices,
}
@@ -465,9 +495,15 @@ func testParamAggregatorAndStaticTokenCollision(t *testing.T) testParameters {
uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
uint64(103): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
+ uint64(103): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
+ }
return testParameters{
cfg: cfg,
evmClients: evmClients,
+ contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
invalidConfigErrorExpected: true,
}
@@ -506,11 +542,16 @@ func testParamBatchCallReturnsErr(t *testing.T) testParameters {
BatchCaller: mockErrCaller(t),
},
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockErrCR(t),
+ }
return testParameters{
- cfg: cfg,
- evmClients: evmClients,
- tokens: []common.Address{TK1, TK2, TK3},
- evmCallErr: true,
+ cfg: cfg,
+ evmClients: evmClients,
+ contractReaders: contractReaders,
+ tokens: []common.Address{TK1, TK2, TK3},
+ evmCallErr: true,
}
}
@@ -566,6 +607,11 @@ func testLessInputsThanDefinedPrices(t *testing.T) testParameters {
uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
uint64(103): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
+ uint64(103): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
+ }
expectedTokenPrices := map[common.Address]big.Int{
TK1: *multExp(round1.Answer, 10),
TK2: *multExp(round2.Answer, 10),
@@ -574,6 +620,7 @@ func testLessInputsThanDefinedPrices(t *testing.T) testParameters {
return testParameters{
cfg: cfg,
evmClients: evmClients,
+ contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
expectedTokenPrices: expectedTokenPrices,
}
@@ -631,6 +678,11 @@ func testGetAllTokensAggregatorAndStatic(t *testing.T) testParameters {
uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
uint64(103): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
+ uint64(103): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
+ }
expectedTokenPricesForAll := map[common.Address]big.Int{
TK1: *multExp(round1.Answer, 10),
TK2: *multExp(round2.Answer, 10),
@@ -641,6 +693,7 @@ func testGetAllTokensAggregatorAndStatic(t *testing.T) testParameters {
cfg: cfg,
evmClients: evmClients,
expectedTokenPricesForAll: expectedTokenPricesForAll,
+ contractReaders: contractReaders,
}
}
@@ -691,6 +744,12 @@ func testGetAllTokensAggregatorOnly(t *testing.T) testParameters {
uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
uint64(103): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
}
+ contractReaders := map[uint64]types.ContractReader{
+ uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
+ uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
+ uint64(103): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
+ }
+
expectedTokenPricesForAll := map[common.Address]big.Int{
TK1: *multExp(round1.Answer, 10),
TK2: *multExp(round2.Answer, 10),
@@ -700,10 +759,11 @@ func testGetAllTokensAggregatorOnly(t *testing.T) testParameters {
cfg: cfg,
evmClients: evmClients,
expectedTokenPricesForAll: expectedTokenPricesForAll,
+ contractReaders: contractReaders,
}
}
-func testGetAllTokensStaticOnly() testParameters {
+func testGetAllTokensStaticOnly(t *testing.T) testParameters {
cfg := config.DynamicPriceGetterConfig{
AggregatorPrices: map[common.Address]config.AggregatorPriceConfig{},
StaticPrices: map[common.Address]config.StaticPriceConfig{
@@ -723,6 +783,7 @@ func testGetAllTokensStaticOnly() testParameters {
}
evmClients := map[uint64]DynamicPriceGetterClient{}
+ contractReaders := map[uint64]types.ContractReader{}
expectedTokenPricesForAll := map[common.Address]big.Int{
TK1: *cfg.StaticPrices[TK1].Price,
TK2: *cfg.StaticPrices[TK2].Price,
@@ -731,6 +792,7 @@ func testGetAllTokensStaticOnly() testParameters {
return testParameters{
cfg: cfg,
evmClients: evmClients,
+ contractReaders: contractReaders,
expectedTokenPricesForAll: expectedTokenPricesForAll,
}
}
@@ -760,12 +822,54 @@ func mockCaller(t *testing.T, decimals []uint8, rounds []aggregator_v3_interface
return caller
}
+func mockCR(t *testing.T, decimals []uint8, rounds []aggregator_v3_interface.LatestRoundData) *mocks.ChainReader {
+ caller := mocks.NewChainReader(t)
+
+ // Mock batch calls per chain: all decimals calls then all latestRoundData calls.
+ // bGLVR = batchGetLatestValueResult
+ //nolint:all
+ var bGLVR types.BatchGetLatestValuesResult
+ bGLVR = make(map[string]types.ContractBatchResults, 1)
+
+ for i := range len(decimals) {
+ bGLVR[fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)] = make([]types.BatchReadResult, 0, 2)
+ }
+ for i, d := range decimals {
+ contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)
+ readRes := types.BatchReadResult{
+ ReadName: DECIMALS_METHOD_NAME,
+ }
+ readRes.SetResult(&d, nil)
+ bGLVR[contractName] = append(bGLVR[contractName], readRes)
+ }
+
+ for i, r := range rounds {
+ contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)
+ readRes := types.BatchReadResult{
+ ReadName: LATEST_ROUND_DATA_METHOD_NAME,
+ }
+ readRes.SetResult(&r, nil)
+ bGLVR[contractName] = append(bGLVR[contractName], readRes)
+ }
+
+ caller.On("Bind", mock.Anything, mock.Anything).Return(nil).Maybe()
+ caller.On("BatchGetLatestValues", mock.Anything, mock.Anything).Return(bGLVR, nil).Maybe()
+ return caller
+}
+
func mockErrCaller(t *testing.T) *rpclibmocks.EvmBatchCaller {
caller := rpclibmocks.NewEvmBatchCaller(t)
caller.On("BatchCall", mock.Anything, uint64(0), mock.Anything).Return(nil, assert.AnError).Maybe()
return caller
}
+func mockErrCR(t *testing.T) *mocks.ChainReader {
+ caller := mocks.NewChainReader(t)
+ caller.On("Bind", mock.Anything, mock.Anything).Return(nil).Maybe()
+ caller.On("BatchGetLatestValues", mock.Anything, mock.Anything).Return(nil, assert.AnError).Maybe()
+ return caller
+}
+
// multExp returns the result of multiplying x by 10^e.
func multExp(x *big.Int, e int64) *big.Int {
return big.NewInt(0).Mul(x, big.NewInt(0).Exp(big.NewInt(10), big.NewInt(e), nil))
diff --git a/core/services/ocr2/plugins/ccip/internal/rpclib/evm.go b/core/services/ocr2/plugins/ccip/internal/rpclib/evm.go
index 71357029dd..876d9fa782 100644
--- a/core/services/ocr2/plugins/ccip/internal/rpclib/evm.go
+++ b/core/services/ocr2/plugins/ccip/internal/rpclib/evm.go
@@ -280,6 +280,10 @@ func (c EvmCall) String() string {
return fmt.Sprintf("%s: %s(%+v)", c.contractAddress.String(), c.methodName, c.args)
}
+func (c EvmCall) ContractAddress() common.Address {
+ return c.contractAddress
+}
+
func EVMCallsToString(calls []EvmCall) string {
callString := ""
for _, call := range calls {
diff --git a/integration-tests/ccip-tests/Makefile b/integration-tests/ccip-tests/Makefile
index 8fdd635fd6..40b4cc8338 100644
--- a/integration-tests/ccip-tests/Makefile
+++ b/integration-tests/ccip-tests/Makefile
@@ -67,3 +67,10 @@ test_smoke_ccip_default: set_config
.PHONY: build_ccip_image
build_ccip_image:
docker build -f ../../core/chainlink.Dockerfile --build-arg COMMIT_SHA=$(git rev-parse HEAD) --build-arg CHAINLINK_USER=chainlink -t $(image):$(tag) ../../
+
+# image: the name for the chainlink image being built, example: image=chainlink
+# tag: the tag for the chainlink image being built, example: tag=latest
+# example usage: make build_ccip_image image=chainlink-ccip tag=latest
+.PHONY: build_ccip_debug_image
+build_ccip_debug_image:
+ docker build -f ../../core/chainlink.debug.Dockerfile --build-arg COMMIT_SHA=$(git rev-parse HEAD) --build-arg CHAINLINK_USER=chainlink -t $(image):$(tag) ../../
From bf728094b534f81021453a602b71532296525c11 Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Fri, 27 Sep 2024 18:31:15 +0200
Subject: [PATCH 13/32] RMNHome (#1469)
New PR to have this be standalone
---
contracts/gas-snapshots/ccip.gas-snapshot | 22 +
contracts/src/v0.8/ccip/rmn/RMNHome.sol | 442 ++++++++++++++----
.../src/v0.8/ccip/test/rmn/RMNHome.t.sol | 374 ++++++++++++++-
3 files changed, 730 insertions(+), 108 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 5d00beeae3..8bf5c45e55 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -811,6 +811,28 @@ PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310)
PingPong_plumbing:test_Pausing_Success() (gas: 17810)
PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 162091)
PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 181509)
+RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 18822)
+RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 18682)
+RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 20371)
+RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() (gas: 20810)
+RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 137268)
+RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 20472)
+RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1077745)
+RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23857)
+RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 10575)
+RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 10936)
+RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1083071)
+RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19063)
+RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 10963)
+RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 10606)
+RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 28147)
+RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 594679)
+RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 15177)
+RMNHome_setCandidate:test_setCandidate_success() (gas: 588379)
+RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 30159)
+RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 18848)
+RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 14115)
+RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 103911)
RMNRemote_constructor:test_constructor_success() (gas: 8334)
RMNRemote_constructor:test_constructor_zeroChainSelector_reverts() (gas: 59165)
RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 154457)
diff --git a/contracts/src/v0.8/ccip/rmn/RMNHome.sol b/contracts/src/v0.8/ccip/rmn/RMNHome.sol
index ec479bf663..0280daddc2 100644
--- a/contracts/src/v0.8/ccip/rmn/RMNHome.sol
+++ b/contracts/src/v0.8/ccip/rmn/RMNHome.sol
@@ -7,146 +7,384 @@ import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
/// @notice Stores the home configuration for RMN, that is referenced by CCIP oracles, RMN nodes, and the RMNRemote
/// contracts.
+/// @dev This contract is a state machine with the following states:
+/// - Init: The initial state of the contract, no config has been set, or all configs have been revoked.
+/// [0, 0]
+///
+/// - Candidate: A new config has been set, but it has not been promoted yet, or all active configs have been revoked.
+/// [0, 1]
+///
+/// - Active: A non-zero config has been promoted and is active, there is no candidate configured.
+/// [1, 0]
+///
+/// - ActiveAndCandidate: A non-zero config has been promoted and is active, and a new config has been set as candidate.
+/// [1, 1]
+///
+/// The following state transitions are allowed:
+/// - Init -> Candidate: setCandidate()
+/// - Candidate -> Active: promoteCandidateAndRevokeActive()
+/// - Candidate -> Candidate: setCandidate()
+/// - Candidate -> Init: revokeCandidate()
+/// - Active -> ActiveAndCandidate: setCandidate()
+/// - Active -> Init: promoteCandidateAndRevokeActive()
+/// - ActiveAndCandidate -> Active: promoteCandidateAndRevokeActive()
+/// - ActiveAndCandidate -> Active: revokeCandidate()
+/// - ActiveAndCandidate -> ActiveAndCandidate: setCandidate()
+///
+/// This means the following calls are not allowed at the following states:
+/// - Init: promoteCandidateAndRevokeActive(), as there is no config to promote.
+/// - Init: revokeCandidate(), as there is no config to revoke
+/// - Active: revokeCandidate(), as there is no candidate to revoke
+/// Note that we explicitly do allow promoteCandidateAndRevokeActive() to be called when there is an active config but
+/// no candidate config. This is the only way to remove the active config. The alternative would be to set some unusable
+/// config as candidate and promote that, but fully clearing it is cleaner.
+///
+/// ┌─────────────┐ setCandidate ┌─────────────┐
+/// │ ├───────────────────►│ │ setCandidate
+/// │ Init │ revokeCandidate │ Candidate │◄───────────┐
+/// │ [0,0] │◄───────────────────┤ [0,1] │────────────┘
+/// │ │ ┌─────────────────┤ │
+/// └─────────────┘ │ promote- └─────────────┘
+/// ▲ │ Candidate
+/// promote- │ │
+/// Candidate │ │
+/// │ │
+/// ┌──────────┴──┐ │ promote- ┌─────────────┐
+/// │ │◄─┘ Candidate OR │ Active & │ setCandidate
+/// │ Active │ revokeCandidate │ Candidate │◄───────────┐
+/// │ [1,0] │◄───────────────────┤ [1,1] │────────────┘
+/// │ ├───────────────────►│ │
+/// └─────────────┘ setSecondary └─────────────┘
+///
contract RMNHome is OwnerIsCreator, ITypeAndVersion {
+ event ConfigSet(bytes32 indexed configDigest, uint32 version, StaticConfig staticConfig, DynamicConfig dynamicConfig);
+ event ActiveConfigRevoked(bytes32 indexed configDigest);
+ event CandidateConfigRevoked(bytes32 indexed configDigest);
+ event DynamicConfigSet(bytes32 indexed configDigest, DynamicConfig dynamicConfig);
+ event ConfigPromoted(bytes32 indexed configDigest);
+
+ error OutOfBoundsNodesLength();
error DuplicatePeerId();
error DuplicateOffchainPublicKey();
- error OutOfOrderSourceChains();
- error OutOfOrderObserverNodeIndices();
+ error DuplicateSourceChain();
error OutOfBoundsObserverNodeIndex();
error MinObserversTooHigh();
-
- event ConfigSet(bytes32 configDigest, VersionedConfig versionedConfig);
- event ConfigRevoked(bytes32 configDigest);
+ error ConfigDigestMismatch(bytes32 expectedConfigDigest, bytes32 gotConfigDigest);
+ error DigestNotFound(bytes32 configDigest);
+ error RevokingZeroDigestNotAllowed();
+ error NoOpStateTransitionNotAllowed();
struct Node {
- string peerId; // used for p2p communication, base58 encoded
- bytes32 offchainPublicKey; // observations are signed with this public key, and are only verified offchain
+ bytes32 peerId; // Used for p2p communication.
+ bytes32 offchainPublicKey; // Observations are signed with this public key, and are only verified offchain.
}
struct SourceChain {
- uint64 chainSelector;
- uint64[] observerNodeIndices; // indices into Config.nodes, strictly increasing
- uint64 minObservers; // required to agree on an observation for this source chain
+ uint64 chainSelector; // ─────╮ The Source chain selector.
+ uint64 minObservers; // ──────╯ Required number of observers to agree on an observation for this source chain.
+ // ObserverNodesBitmap & (1< 0 && !(newConfig.sourceChains[i - 1].chainSelector < newConfig.sourceChains[i].chainSelector)) {
- revert OutOfOrderSourceChains();
- }
+ /// @notice Used for encoding the config digest prefix, unique per Home contract implementation.
+ uint256 private constant PREFIX = 0x000b << (256 - 16); // 0x000b00..00
+ /// @notice Used for encoding the config digest prefix
+ uint256 private constant PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..00
+ /// @notice The max number of configs that can be active at the same time.
+ uint256 private constant MAX_CONCURRENT_CONFIGS = 2;
+ /// @notice Helper to identify the zero config digest with less casting.
+ bytes32 private constant ZERO_DIGEST = bytes32(uint256(0));
+ // @notice To ensure that observerNodesBitmap can be bit-encoded into a uint256.
+ uint256 private constant MAX_NODES = 256;
- // all observerNodeIndices are valid
- for (uint256 j = 0; j < newConfig.sourceChains[i].observerNodeIndices.length; ++j) {
- if (
- j > 0
- && !(newConfig.sourceChains[i].observerNodeIndices[j - 1] < newConfig.sourceChains[i].observerNodeIndices[j])
- ) {
- revert OutOfOrderObserverNodeIndices();
- }
- if (!(newConfig.sourceChains[i].observerNodeIndices[j] < newConfig.nodes.length)) {
- revert OutOfBoundsObserverNodeIndex();
- }
- }
+ /// @notice This array holds the configs.
+ /// @dev Value i in this array is valid iff s_configs[i].configDigest != 0.
+ VersionedConfig[MAX_CONCURRENT_CONFIGS] private s_configs;
- // minObservers are tenable
- if (!(newConfig.sourceChains[i].minObservers <= newConfig.sourceChains[i].observerNodeIndices.length)) {
- revert MinObserversTooHigh();
- }
- }
- }
+ /// @notice The latest version set, incremented by one for each new config.
+ uint32 private s_currentVersion = 0;
+ /// @notice The index of the active config. Used to determine which config is active. Adding the configs to a list
+ /// with two items and using this index to determine which one is active is a gas efficient way to handle this. Having
+ /// a set place for the active config would mean we have to copy the candidate config to the active config when it is
+ /// promoted, which would be more expensive. This index allows us to flip the configs around using `XOR 1`, which
+ /// flips 0 to 1 and 1 to 0.
+ uint32 private s_activeConfigIndex = 0;
+
+ // ================================================================
+ // │ Getters │
+ // ================================================================
+
+ /// @notice Returns the current active and candidate config digests.
+ /// @dev Can be bytes32(0) if no config has been set yet or it has been revoked.
+ /// @return activeConfigDigest The digest of the active config.
+ /// @return candidateConfigDigest The digest of the candidate config.
+ function getConfigDigests() external view returns (bytes32 activeConfigDigest, bytes32 candidateConfigDigest) {
+ return (s_configs[getActiveIndex()].configDigest, s_configs[getCandidateIndex()].configDigest);
+ }
+
+ /// @notice Returns the active config digest
+ function getActiveDigest() external view returns (bytes32) {
+ return s_configs[getActiveIndex()].configDigest;
+ }
- uint256 oldConfigIndex = s_latestConfigIndex;
- uint32 oldConfigCount = s_configCounts[oldConfigIndex];
- uint256 newConfigIndex = (oldConfigIndex + 1) % CONFIG_RING_BUFFER_SIZE;
+ /// @notice Returns the candidate config digest
+ function getCandidateDigest() public view returns (bytes32) {
+ return s_configs[getCandidateIndex()].configDigest;
+ }
- for (uint256 i = 0; i < CONFIG_RING_BUFFER_SIZE; ++i) {
- if ((i == newConfigIndex || revokePastConfigs) && s_configCounts[i] > 0) {
- emit ConfigRevoked(_configDigest(VersionedConfig({version: s_configCounts[i], config: s_configs[i]})));
- delete s_configCounts[i];
+ /// @notice The offchain code can use this to fetch an old config which might still be in use by some remotes. Use
+ /// in case one of the configs is too large to be returnable by one of the other getters.
+ /// @param configDigest The digest of the config to fetch.
+ /// @return versionedConfig The config and its version.
+ /// @return ok True if the config was found, false otherwise.
+ function getConfig(bytes32 configDigest) external view returns (VersionedConfig memory versionedConfig, bool ok) {
+ for (uint256 i = 0; i < MAX_CONCURRENT_CONFIGS; ++i) {
+ // We never want to return true for a zero digest, even if the caller is asking for it, as this can expose old
+ // config state that is invalid.
+ if (s_configs[i].configDigest == configDigest && configDigest != ZERO_DIGEST) {
+ return (s_configs[i], true);
}
}
-
- uint32 newConfigCount = oldConfigCount + 1;
- VersionedConfig memory newVersionedConfig = VersionedConfig({version: newConfigCount, config: newConfig});
- bytes32 newConfigDigest = _configDigest(newVersionedConfig);
- s_configs[newConfigIndex] = newConfig;
- s_configCounts[newConfigIndex] = newConfigCount;
- s_latestConfigIndex = newConfigIndex;
- s_latestConfigDigest = newConfigDigest;
- emit ConfigSet(newConfigDigest, newVersionedConfig);
+ return (versionedConfig, false);
}
- /// @return configDigest will be zero in case no config has been set
- function getLatestConfigDigestAndVersionedConfig()
+ function getAllConfigs()
external
view
- returns (bytes32 configDigest, VersionedConfig memory)
+ returns (VersionedConfig memory activeConfig, VersionedConfig memory candidateConfig)
{
- return (
- s_latestConfigDigest,
- VersionedConfig({version: s_configCounts[s_latestConfigIndex], config: s_configs[s_latestConfigIndex]})
+ VersionedConfig memory storedActiveConfig = s_configs[getActiveIndex()];
+ if (storedActiveConfig.configDigest != ZERO_DIGEST) {
+ activeConfig = storedActiveConfig;
+ }
+
+ VersionedConfig memory storedCandidateConfig = s_configs[getCandidateIndex()];
+ if (storedCandidateConfig.configDigest != ZERO_DIGEST) {
+ candidateConfig = storedCandidateConfig;
+ }
+
+ return (activeConfig, candidateConfig);
+ }
+
+ // ================================================================
+ // │ State transitions │
+ // ================================================================
+
+ /// @notice Sets a new config as the candidate config. Does not influence the active config.
+ /// @param staticConfig The static part of the config.
+ /// @param dynamicConfig The dynamic part of the config.
+ /// @param digestToOverwrite The digest of the config to overwrite, or ZERO_DIGEST if no config is to be overwritten.
+ /// This is done to prevent accidental overwrites.
+ /// @return newConfigDigest The digest of the new config.
+ function setCandidate(
+ StaticConfig calldata staticConfig,
+ DynamicConfig calldata dynamicConfig,
+ bytes32 digestToOverwrite
+ ) external onlyOwner returns (bytes32 newConfigDigest) {
+ _validateStaticAndDynamicConfig(staticConfig, dynamicConfig);
+
+ bytes32 existingDigest = getCandidateDigest();
+
+ if (existingDigest != digestToOverwrite) {
+ revert ConfigDigestMismatch(existingDigest, digestToOverwrite);
+ }
+
+ // are we going to overwrite a config? If so, emit an event.
+ if (existingDigest != ZERO_DIGEST) {
+ emit CandidateConfigRevoked(digestToOverwrite);
+ }
+
+ uint32 newVersion = ++s_currentVersion;
+ newConfigDigest = _calculateConfigDigest(abi.encode(staticConfig), newVersion);
+
+ VersionedConfig storage existingConfig = s_configs[getCandidateIndex()];
+ existingConfig.configDigest = newConfigDigest;
+ existingConfig.version = newVersion;
+ existingConfig.staticConfig = staticConfig;
+ existingConfig.dynamicConfig = dynamicConfig;
+
+ emit ConfigSet(newConfigDigest, newVersion, staticConfig, dynamicConfig);
+
+ return newConfigDigest;
+ }
+
+ /// @notice Revokes a specific config by digest. This is used when the candidate config turns out to be incorrect to
+ /// remove it without it ever having to be promoted. It's also possible to revoke the candidate config by setting a
+ /// newer candidate config using `setCandidate`.
+ /// @param configDigest The digest of the config to revoke. This is done to prevent accidental revokes.
+ function revokeCandidate(bytes32 configDigest) external onlyOwner {
+ if (configDigest == ZERO_DIGEST) {
+ revert RevokingZeroDigestNotAllowed();
+ }
+
+ uint256 candidateConfigIndex = getCandidateIndex();
+ if (s_configs[candidateConfigIndex].configDigest != configDigest) {
+ revert ConfigDigestMismatch(s_configs[candidateConfigIndex].configDigest, configDigest);
+ }
+
+ emit CandidateConfigRevoked(configDigest);
+ // Delete only the digest, as that's what's used to determine if a config is active. This means the actual
+ // config stays in storage which should significantly reduce the gas cost of overwriting that storage space in
+ // the future.
+ delete s_configs[candidateConfigIndex].configDigest;
+ }
+
+ /// @notice Promotes the candidate config to the active config and revokes the active config.
+ /// @param digestToPromote The digest of the config to promote.
+ /// @param digestToRevoke The digest of the config to revoke.
+ /// @dev No config is changed in storage, the only storage changes that happen are
+ /// - The activeConfigIndex is flipped.
+ /// - The digest of the old active config is deleted.
+ function promoteCandidateAndRevokeActive(bytes32 digestToPromote, bytes32 digestToRevoke) external onlyOwner {
+ if (digestToPromote == ZERO_DIGEST && digestToRevoke == ZERO_DIGEST) {
+ revert NoOpStateTransitionNotAllowed();
+ }
+
+ uint256 candidateConfigIndex = getCandidateIndex();
+ if (s_configs[candidateConfigIndex].configDigest != digestToPromote) {
+ revert ConfigDigestMismatch(s_configs[candidateConfigIndex].configDigest, digestToPromote);
+ }
+
+ VersionedConfig storage activeConfig = s_configs[getActiveIndex()];
+ if (activeConfig.configDigest != digestToRevoke) {
+ revert ConfigDigestMismatch(activeConfig.configDigest, digestToRevoke);
+ }
+
+ delete activeConfig.configDigest;
+
+ s_activeConfigIndex ^= 1;
+ if (digestToRevoke != ZERO_DIGEST) {
+ emit ActiveConfigRevoked(digestToRevoke);
+ }
+ emit ConfigPromoted(digestToPromote);
+ }
+
+ /// @notice Sets the dynamic config for a specific config.
+ /// @param newDynamicConfig The new dynamic config.
+ /// @param currentDigest The digest of the config to update.
+ /// @dev This does not update the config digest as only the static config is part of the digest.
+ function setDynamicConfig(DynamicConfig calldata newDynamicConfig, bytes32 currentDigest) external onlyOwner {
+ for (uint256 i = 0; i < MAX_CONCURRENT_CONFIGS; ++i) {
+ if (s_configs[i].configDigest == currentDigest && currentDigest != ZERO_DIGEST) {
+ _validateDynamicConfig(newDynamicConfig, s_configs[i].staticConfig.nodes.length);
+ // Since the static config doesn't change we don't have to update the digest or version.
+ s_configs[i].dynamicConfig = newDynamicConfig;
+
+ emit DynamicConfigSet(currentDigest, newDynamicConfig);
+ return;
+ }
+ }
+
+ revert DigestNotFound(currentDigest);
+ }
+
+ /// @notice Calculates the config digest for a given plugin key, static config, and version.
+ /// @param staticConfig The static part of the config.
+ /// @param version The version of the config.
+ /// @return The calculated config digest.
+ function _calculateConfigDigest(bytes memory staticConfig, uint32 version) internal view returns (bytes32) {
+ return bytes32(
+ (PREFIX & PREFIX_MASK)
+ | (
+ uint256(
+ keccak256(bytes.concat(abi.encode(bytes32("EVM"), block.chainid, address(this), version), staticConfig))
+ ) & ~PREFIX_MASK
+ )
);
}
- /// @notice The offchain code can use this to fetch an old config which might still be in use by some remotes
- /// @dev Only to be called by offchain code, efficiency is not a concern
- function getConfig(bytes32 configDigest) external view returns (VersionedConfig memory versionedConfig, bool ok) {
- for (uint256 i = 0; i < CONFIG_RING_BUFFER_SIZE; ++i) {
- if (s_configCounts[i] == 0) {
- // unset config
- continue;
+ function getActiveIndex() private view returns (uint32) {
+ return s_activeConfigIndex;
+ }
+
+ function getCandidateIndex() private view returns (uint32) {
+ return s_activeConfigIndex ^ 1;
+ }
+
+ // ================================================================
+ // │ Validation │
+ // ================================================================
+
+ /// @notice Validates the static and dynamic config. Reverts when the config is invalid.
+ /// @param staticConfig The static part of the config.
+ /// @param dynamicConfig The dynamic part of the config.
+ function _validateStaticAndDynamicConfig(
+ StaticConfig memory staticConfig,
+ DynamicConfig memory dynamicConfig
+ ) internal pure {
+ // Ensure that observerNodesBitmap can be bit-encoded into a uint256.
+ if (staticConfig.nodes.length > MAX_NODES) {
+ revert OutOfBoundsNodesLength();
+ }
+
+ // Ensure no peerId or offchainPublicKey is duplicated.
+ for (uint256 i = 0; i < staticConfig.nodes.length; ++i) {
+ for (uint256 j = i + 1; j < staticConfig.nodes.length; ++j) {
+ if (staticConfig.nodes[i].peerId == staticConfig.nodes[j].peerId) {
+ revert DuplicatePeerId();
+ }
+ if (staticConfig.nodes[i].offchainPublicKey == staticConfig.nodes[j].offchainPublicKey) {
+ revert DuplicateOffchainPublicKey();
+ }
+ }
+ }
+
+ _validateDynamicConfig(dynamicConfig, staticConfig.nodes.length);
+ }
+
+ /// @notice Validates the dynamic config. Reverts when the config is invalid.
+ /// @param dynamicConfig The dynamic part of the config.
+ /// @param numberOfNodes The number of nodes in the static config.
+ function _validateDynamicConfig(DynamicConfig memory dynamicConfig, uint256 numberOfNodes) internal pure {
+ uint256 numberOfSourceChains = dynamicConfig.sourceChains.length;
+ for (uint256 i = 0; i < numberOfSourceChains; ++i) {
+ SourceChain memory currentSourceChain = dynamicConfig.sourceChains[i];
+ // Ensure the source chain is unique.
+ for (uint256 j = i + 1; j < numberOfSourceChains; ++j) {
+ if (currentSourceChain.chainSelector == dynamicConfig.sourceChains[j].chainSelector) {
+ revert DuplicateSourceChain();
+ }
}
- VersionedConfig memory vc = VersionedConfig({version: s_configCounts[i], config: s_configs[i]});
- if (_configDigest(vc) == configDigest) {
- versionedConfig = vc;
- ok = true;
- break;
+
+ // all observer node indices are valid
+ uint256 bitmap = currentSourceChain.observerNodesBitmap;
+ // Check if there are any bits set for indexes outside of the expected range.
+ if (bitmap & (type(uint256).max >> (256 - numberOfNodes)) != bitmap) {
+ revert OutOfBoundsObserverNodeIndex();
+ }
+
+ uint256 observersCount = 0;
+ for (; bitmap != 0; ++observersCount) {
+ bitmap &= bitmap - 1;
+ }
+
+ // minObservers are tenable
+ if (currentSourceChain.minObservers > observersCount) {
+ revert MinObserversTooHigh();
}
}
}
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome.t.sol
index 40cb1e4a07..c5226d3206 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNHome.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome.t.sol
@@ -3,13 +3,375 @@ pragma solidity 0.8.24;
import {Internal} from "../../libraries/Internal.sol";
import {RMNHome} from "../../rmn/RMNHome.sol";
-import {BaseTest} from "../BaseTest.t.sol";
+import {Test} from "forge-std/Test.sol";
+import {Vm} from "forge-std/Vm.sol";
-contract RMNHomeTest is BaseTest {
- RMNHome public s_rmnHome;
+contract RMNHomeTest is Test {
+ struct Config {
+ RMNHome.StaticConfig staticConfig;
+ RMNHome.DynamicConfig dynamicConfig;
+ }
+
+ bytes32 internal constant ZERO_DIGEST = bytes32(uint256(0));
+ RMNHome public s_rmnHome = new RMNHome();
+
+ function _getBaseConfig() internal pure returns (Config memory) {
+ RMNHome.Node[] memory nodes = new RMNHome.Node[](3);
+ nodes[0] = RMNHome.Node({peerId: keccak256("peerId_0"), offchainPublicKey: keccak256("offchainPublicKey_0")});
+ nodes[1] = RMNHome.Node({peerId: keccak256("peerId_1"), offchainPublicKey: keccak256("offchainPublicKey_1")});
+ nodes[2] = RMNHome.Node({peerId: keccak256("peerId_2"), offchainPublicKey: keccak256("offchainPublicKey_2")});
+
+ RMNHome.SourceChain[] memory sourceChains = new RMNHome.SourceChain[](2);
+ // Observer 0 for source chain 9000
+ sourceChains[0] = RMNHome.SourceChain({chainSelector: 9000, minObservers: 1, observerNodesBitmap: 1 << 0});
+ // Observers 1 and 2 for source chain 9001
+ sourceChains[1] = RMNHome.SourceChain({chainSelector: 9001, minObservers: 2, observerNodesBitmap: 1 << 1 | 1 << 2});
+
+ return Config({
+ staticConfig: RMNHome.StaticConfig({nodes: nodes, offchainConfig: abi.encode("static_config")}),
+ dynamicConfig: RMNHome.DynamicConfig({sourceChains: sourceChains, offchainConfig: abi.encode("dynamic_config")})
+ });
+ }
+
+ uint256 private constant PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..00
+ uint256 private constant PREFIX = 0x000b << (256 - 16); // 0x000b00..00
+
+ function _getConfigDigest(bytes memory staticConfig, uint32 version) internal view returns (bytes32) {
+ return bytes32(
+ (PREFIX & PREFIX_MASK)
+ | (
+ uint256(
+ keccak256(bytes.concat(abi.encode(bytes32("EVM"), block.chainid, address(s_rmnHome), version), staticConfig))
+ ) & ~PREFIX_MASK
+ )
+ );
+ }
+}
+
+contract RMNHome_getConfigDigests is RMNHomeTest {
+ function test_getConfigDigests_success() public {
+ (bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests();
+ assertEq(activeDigest, ZERO_DIGEST);
+ assertEq(candidateDigest, ZERO_DIGEST);
+
+ Config memory config = _getBaseConfig();
+ bytes32 firstDigest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+
+ (activeDigest, candidateDigest) = s_rmnHome.getConfigDigests();
+ assertEq(activeDigest, ZERO_DIGEST);
+ assertEq(candidateDigest, firstDigest);
+
+ s_rmnHome.promoteCandidateAndRevokeActive(firstDigest, ZERO_DIGEST);
+
+ (activeDigest, candidateDigest) = s_rmnHome.getConfigDigests();
+ assertEq(activeDigest, firstDigest);
+ assertEq(candidateDigest, ZERO_DIGEST);
+
+ bytes32 secondDigest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+
+ (activeDigest, candidateDigest) = s_rmnHome.getConfigDigests();
+ assertEq(activeDigest, firstDigest);
+ assertEq(candidateDigest, secondDigest);
+
+ assertEq(activeDigest, s_rmnHome.getActiveDigest());
+ assertEq(candidateDigest, s_rmnHome.getCandidateDigest());
+ }
+}
+
+contract RMNHome_setCandidate is RMNHomeTest {
+ function test_setCandidate_success() public {
+ Config memory config = _getBaseConfig();
+ RMNHome.VersionedConfig memory versionedConfig = RMNHome.VersionedConfig({
+ version: 1,
+ staticConfig: config.staticConfig,
+ dynamicConfig: config.dynamicConfig,
+ configDigest: ZERO_DIGEST
+ });
+
+ versionedConfig.configDigest = _getConfigDigest(abi.encode(versionedConfig.staticConfig), versionedConfig.version);
+
+ vm.expectEmit();
+ emit RMNHome.ConfigSet(
+ versionedConfig.configDigest, versionedConfig.version, versionedConfig.staticConfig, versionedConfig.dynamicConfig
+ );
+
+ s_rmnHome.setCandidate(versionedConfig.staticConfig, versionedConfig.dynamicConfig, ZERO_DIGEST);
+
+ (RMNHome.VersionedConfig memory storedVersionedConfig, bool ok) = s_rmnHome.getConfig(versionedConfig.configDigest);
+ assertTrue(ok);
+ assertEq(storedVersionedConfig.version, versionedConfig.version);
+ RMNHome.StaticConfig memory storedStaticConfig = storedVersionedConfig.staticConfig;
+ RMNHome.DynamicConfig memory storedDynamicConfig = storedVersionedConfig.dynamicConfig;
+
+ assertEq(storedStaticConfig.nodes.length, versionedConfig.staticConfig.nodes.length);
+ for (uint256 i = 0; i < storedStaticConfig.nodes.length; i++) {
+ RMNHome.Node memory storedNode = storedStaticConfig.nodes[i];
+ assertEq(storedNode.peerId, versionedConfig.staticConfig.nodes[i].peerId);
+ assertEq(storedNode.offchainPublicKey, versionedConfig.staticConfig.nodes[i].offchainPublicKey);
+ }
+
+ assertEq(storedDynamicConfig.sourceChains.length, versionedConfig.dynamicConfig.sourceChains.length);
+ for (uint256 i = 0; i < storedDynamicConfig.sourceChains.length; i++) {
+ RMNHome.SourceChain memory storedSourceChain = storedDynamicConfig.sourceChains[i];
+ assertEq(storedSourceChain.chainSelector, versionedConfig.dynamicConfig.sourceChains[i].chainSelector);
+ assertEq(storedSourceChain.minObservers, versionedConfig.dynamicConfig.sourceChains[i].minObservers);
+ assertEq(storedSourceChain.observerNodesBitmap, versionedConfig.dynamicConfig.sourceChains[i].observerNodesBitmap);
+ }
+ assertEq(storedDynamicConfig.offchainConfig, versionedConfig.dynamicConfig.offchainConfig);
+ assertEq(storedStaticConfig.offchainConfig, versionedConfig.staticConfig.offchainConfig);
+ }
+
+ function test_setCandidate_ConfigDigestMismatch_reverts() public {
+ Config memory config = _getBaseConfig();
+
+ bytes32 digest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+
+ vm.expectRevert(abi.encodeWithSelector(RMNHome.ConfigDigestMismatch.selector, digest, ZERO_DIGEST));
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+
+ vm.expectEmit();
+ emit RMNHome.CandidateConfigRevoked(digest);
+
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, digest);
+ }
+
+ function test_setCandidate_OnlyOwner_reverts() public {
+ Config memory config = _getBaseConfig();
+
+ vm.startPrank(address(0));
+
+ vm.expectRevert("Only callable by owner");
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+}
+
+contract RMNHome_revokeCandidate is RMNHomeTest {
+ // Sets two configs
+ function setUp() public {
+ Config memory config = _getBaseConfig();
+ bytes32 digest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ s_rmnHome.promoteCandidateAndRevokeActive(digest, ZERO_DIGEST);
+
+ config.dynamicConfig.sourceChains[0].minObservers--;
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+
+ function test_revokeCandidate_success() public {
+ (bytes32 priorActiveDigest, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests();
+
+ vm.expectEmit();
+ emit RMNHome.CandidateConfigRevoked(priorCandidateDigest);
+
+ s_rmnHome.revokeCandidate(priorCandidateDigest);
+
+ (RMNHome.VersionedConfig memory storedVersionedConfig, bool ok) = s_rmnHome.getConfig(priorCandidateDigest);
+ assertFalse(ok);
+ // Ensure no old data is returned, even though it's still in storage
+ assertEq(storedVersionedConfig.version, 0);
+ assertEq(storedVersionedConfig.staticConfig.nodes.length, 0);
+ assertEq(storedVersionedConfig.dynamicConfig.sourceChains.length, 0);
+
+ // Asser the active digest is unaffected but the candidate digest is set to zero
+ (bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests();
+ assertEq(activeDigest, priorActiveDigest);
+ assertEq(candidateDigest, ZERO_DIGEST);
+ assertTrue(candidateDigest != priorCandidateDigest);
+ }
+
+ function test_revokeCandidate_ConfigDigestMismatch_reverts() public {
+ (, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests();
+
+ bytes32 wrongDigest = keccak256("wrong_digest");
+ vm.expectRevert(abi.encodeWithSelector(RMNHome.ConfigDigestMismatch.selector, priorCandidateDigest, wrongDigest));
+ s_rmnHome.revokeCandidate(wrongDigest);
+ }
+
+ function test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() public {
+ vm.expectRevert(RMNHome.RevokingZeroDigestNotAllowed.selector);
+ s_rmnHome.revokeCandidate(ZERO_DIGEST);
+ }
+
+ function test_revokeCandidate_OnlyOwner_reverts() public {
+ vm.startPrank(address(0));
+
+ vm.expectRevert("Only callable by owner");
+ s_rmnHome.revokeCandidate(keccak256("configDigest"));
+ }
+}
+
+contract RMNHome_promoteCandidateAndRevokeActive is RMNHomeTest {
+ function test_promoteCandidateAndRevokeActive_success() public {
+ Config memory config = _getBaseConfig();
+ bytes32 firstConfigToPromote = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+
+ vm.expectEmit();
+ emit RMNHome.ConfigPromoted(firstConfigToPromote);
+
+ s_rmnHome.promoteCandidateAndRevokeActive(firstConfigToPromote, ZERO_DIGEST);
+
+ // Assert the active digest is updated and the candidate digest is set to zero
+ (bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests();
+ assertEq(activeDigest, firstConfigToPromote);
+ assertEq(candidateDigest, ZERO_DIGEST);
+
+ // Set a new candidate to promote over a non-zero active config.
+ config.staticConfig.offchainConfig = abi.encode("new_static_config");
+ config.dynamicConfig.offchainConfig = abi.encode("new_dynamic_config");
+ bytes32 secondConfigToPromote = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+
+ vm.expectEmit();
+ emit RMNHome.ActiveConfigRevoked(firstConfigToPromote);
+
+ vm.expectEmit();
+ emit RMNHome.ConfigPromoted(secondConfigToPromote);
+
+ s_rmnHome.promoteCandidateAndRevokeActive(secondConfigToPromote, firstConfigToPromote);
+
+ (RMNHome.VersionedConfig memory activeConfig, RMNHome.VersionedConfig memory candidateConfig) =
+ s_rmnHome.getAllConfigs();
+ assertEq(activeConfig.configDigest, secondConfigToPromote);
+ assertEq(activeConfig.staticConfig.offchainConfig, config.staticConfig.offchainConfig);
+ assertEq(activeConfig.dynamicConfig.offchainConfig, config.dynamicConfig.offchainConfig);
+
+ assertEq(candidateConfig.configDigest, ZERO_DIGEST);
+ }
+
+ function test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() public {
+ vm.expectRevert(RMNHome.NoOpStateTransitionNotAllowed.selector);
+ s_rmnHome.promoteCandidateAndRevokeActive(ZERO_DIGEST, ZERO_DIGEST);
+ }
+
+ function test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() public {
+ (bytes32 priorActiveDigest, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests();
+ bytes32 wrongActiveDigest = keccak256("wrongActiveDigest");
+ bytes32 wrongCandidateDigest = keccak256("wrongCandidateDigest");
+
+ vm.expectRevert(
+ abi.encodeWithSelector(RMNHome.ConfigDigestMismatch.selector, priorActiveDigest, wrongCandidateDigest)
+ );
+ s_rmnHome.promoteCandidateAndRevokeActive(wrongCandidateDigest, wrongActiveDigest);
+
+ vm.expectRevert(abi.encodeWithSelector(RMNHome.ConfigDigestMismatch.selector, priorActiveDigest, wrongActiveDigest));
+
+ s_rmnHome.promoteCandidateAndRevokeActive(priorCandidateDigest, wrongActiveDigest);
+ }
+
+ function test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() public {
+ vm.startPrank(address(0));
+
+ vm.expectRevert("Only callable by owner");
+ s_rmnHome.promoteCandidateAndRevokeActive(keccak256("toPromote"), keccak256("ToRevoke"));
+ }
+}
+
+contract RMNHome__validateStaticAndDynamicConfig is RMNHomeTest {
+ function test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() public {
+ Config memory config = _getBaseConfig();
+ config.staticConfig.nodes = new RMNHome.Node[](257);
+
+ vm.expectRevert(RMNHome.OutOfBoundsNodesLength.selector);
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+
+ function test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() public {
+ Config memory config = _getBaseConfig();
+ config.staticConfig.nodes[1].peerId = config.staticConfig.nodes[0].peerId;
+
+ vm.expectRevert(RMNHome.DuplicatePeerId.selector);
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+
+ function test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() public {
+ Config memory config = _getBaseConfig();
+ config.staticConfig.nodes[1].offchainPublicKey = config.staticConfig.nodes[0].offchainPublicKey;
+
+ vm.expectRevert(RMNHome.DuplicateOffchainPublicKey.selector);
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+
+ function test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() public {
+ Config memory config = _getBaseConfig();
+ config.dynamicConfig.sourceChains[1].chainSelector = config.dynamicConfig.sourceChains[0].chainSelector;
+
+ vm.expectRevert(RMNHome.DuplicateSourceChain.selector);
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+
+ function test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() public {
+ Config memory config = _getBaseConfig();
+ config.dynamicConfig.sourceChains[0].observerNodesBitmap = 1 << config.staticConfig.nodes.length;
+
+ vm.expectRevert(RMNHome.OutOfBoundsObserverNodeIndex.selector);
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+
+ function test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() public {
+ Config memory config = _getBaseConfig();
+ config.dynamicConfig.sourceChains[0].minObservers++;
+
+ vm.expectRevert(RMNHome.MinObserversTooHigh.selector);
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+}
+
+contract RMNHome_setDynamicConfig is RMNHomeTest {
+ function setUp() public {
+ Config memory config = _getBaseConfig();
+ s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
+ }
+
+ function test_setDynamicConfig_success() public {
+ (bytes32 priorActiveDigest,) = s_rmnHome.getConfigDigests();
+
+ Config memory config = _getBaseConfig();
+ config.dynamicConfig.sourceChains[0].minObservers--;
+
+ (, bytes32 candidateConfigDigest) = s_rmnHome.getConfigDigests();
+
+ vm.expectEmit();
+ emit RMNHome.DynamicConfigSet(candidateConfigDigest, config.dynamicConfig);
+
+ s_rmnHome.setDynamicConfig(config.dynamicConfig, candidateConfigDigest);
+
+ (RMNHome.VersionedConfig memory storedVersionedConfig, bool ok) = s_rmnHome.getConfig(candidateConfigDigest);
+ assertTrue(ok);
+ assertEq(
+ storedVersionedConfig.dynamicConfig.sourceChains[0].minObservers,
+ config.dynamicConfig.sourceChains[0].minObservers
+ );
+
+ // Asser the digests don't change when updating the dynamic config
+ (bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests();
+ assertEq(activeDigest, priorActiveDigest);
+ assertEq(candidateDigest, candidateConfigDigest);
+ }
+
+ // Asserts the validation function is being called
+ function test_setDynamicConfig_MinObserversTooHigh_reverts() public {
+ Config memory config = _getBaseConfig();
+ config.dynamicConfig.sourceChains[0].minObservers++;
+
+ vm.expectRevert(abi.encodeWithSelector(RMNHome.DigestNotFound.selector, ZERO_DIGEST));
+ s_rmnHome.setDynamicConfig(config.dynamicConfig, ZERO_DIGEST);
+ }
+
+ function test_setDynamicConfig_DigestNotFound_reverts() public {
+ // Zero always reverts
+ vm.expectRevert(abi.encodeWithSelector(RMNHome.DigestNotFound.selector, ZERO_DIGEST));
+ s_rmnHome.setDynamicConfig(_getBaseConfig().dynamicConfig, ZERO_DIGEST);
+
+ // Non-existent digest reverts
+ bytes32 nonExistentDigest = keccak256("nonExistentDigest");
+ vm.expectRevert(abi.encodeWithSelector(RMNHome.DigestNotFound.selector, nonExistentDigest));
+ s_rmnHome.setDynamicConfig(_getBaseConfig().dynamicConfig, nonExistentDigest);
+ }
+
+ function test_setDynamicConfig_OnlyOwner_reverts() public {
+ Config memory config = _getBaseConfig();
+
+ vm.startPrank(address(0));
- function setUp() public virtual override {
- super.setUp();
- s_rmnHome = new RMNHome();
+ vm.expectRevert("Only callable by owner");
+ s_rmnHome.setDynamicConfig(config.dynamicConfig, keccak256("configDigest"));
}
}
From 71799d2bd470db14162bf60fc51f8479f6c4183b Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Mon, 30 Sep 2024 20:37:23 +0200
Subject: [PATCH 14/32] ccip home (#1473)
Fresh PR
---
contracts/.solhintignore | 3 -
contracts/gas-snapshots/ccip.gas-snapshot | 105 +-
.../scripts/native_solc_compile_all_ccip | 5 +-
contracts/src/v0.8/ccip/CCIPEncodingUtils.sol | 18 -
contracts/src/v0.8/ccip/FeeQuoter.sol | 4 +-
.../src/v0.8/ccip/capability/CCIPConfig.sol | 570 -----
.../src/v0.8/ccip/capability/CCIPHome.sol | 613 ++++++
.../interfaces/IOCR3ConfigEncoder.sol | 11 -
.../capability/libraries/CCIPConfigTypes.sol | 69 -
.../interfaces/ICapabilitiesRegistry.sol | 2 +-
.../encodingutils/ICCIPEncodingUtils.sol | 16 +
contracts/src/v0.8/ccip/rmn/RMNHome.sol | 22 +-
.../ccip/test/capability/CCIPConfig.t.sol | 1532 -------------
.../v0.8/ccip/test/capability/CCIPHome.t.sol | 932 ++++++++
.../ccip/test/helpers/CCIPConfigHelper.sol | 68 -
.../v0.8/ccip/test/helpers/CCIPHomeHelper.sol | 16 +
.../ccip/generated/ccip_config/ccip_config.go | 1304 ------------
.../ccip_encoding_utils.go | 76 +-
.../ccip/generated/ccip_home/ccip_home.go | 1894 +++++++++++++++++
.../ocr3_config_encoder.go | 200 --
...rapper-dependency-versions-do-not-edit.txt | 5 +-
core/gethwrappers/ccip/go_generate.go | 5 +-
22 files changed, 3586 insertions(+), 3884 deletions(-)
delete mode 100644 contracts/src/v0.8/ccip/CCIPEncodingUtils.sol
delete mode 100644 contracts/src/v0.8/ccip/capability/CCIPConfig.sol
create mode 100644 contracts/src/v0.8/ccip/capability/CCIPHome.sol
delete mode 100644 contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol
delete mode 100644 contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
rename contracts/src/v0.8/ccip/{capability => }/interfaces/ICapabilitiesRegistry.sol (98%)
create mode 100644 contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol
delete mode 100644 contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
create mode 100644 contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol
delete mode 100644 contracts/src/v0.8/ccip/test/helpers/CCIPConfigHelper.sol
create mode 100644 contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol
delete mode 100644 core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
create mode 100644 core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
delete mode 100644 core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go
diff --git a/contracts/.solhintignore b/contracts/.solhintignore
index 82f217fa2a..d076b14dc6 100644
--- a/contracts/.solhintignore
+++ b/contracts/.solhintignore
@@ -42,8 +42,5 @@
./src/v0.8/vendor
./node_modules/
-# Ignore RMNHome contract temporarily
-./src/v0.8/ccip/rmn/RMNHome.sol
-
# Ignore tweaked vendored contracts
./src/v0.8/shared/enumerable/EnumerableSetWithBytes16.sol
\ No newline at end of file
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 8bf5c45e55..a984ecd919 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -35,65 +35,52 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas
BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050)
BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24170)
CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431)
-CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9508)
-CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 87751)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 359022)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 478323)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 443187)
-CCIPConfig_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 31646)
-CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 64324)
-CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 64262)
-CCIPConfig_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11734)
-CCIPConfig_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8783)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 308111)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 48274)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 27945)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 368614)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 116145)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 149842)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 368354)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 149909)
-CCIPConfig_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9632)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1798048)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1040966)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1040997)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_Reverts() (gas: 9665)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16115)
-CCIPConfig_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9596)
-CCIPConfig_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 185139)
-CCIPConfig_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 347170)
-CCIPConfig_chainConfig:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20599)
-CCIPConfig_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 270867)
-CCIPConfig_chainConfig:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14943)
-CCIPConfig_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9617)
-CCIPConfig_chainConfig:test_getPaginatedCCIPConfigs_Success() (gas: 370770)
-CCIPConfig_constructor:test_constructor_Success() (gas: 3275156)
-CCIPConfig_constructor:test_constructor_ZeroAddressNotAllowed_Revert() (gas: 61370)
-CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 24518)
-CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 21077)
-CCIPConfig_updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9654)
-CCIPConfig_updatePluginConfig:test_updatePluginConfig_InitToRunning_Success() (gas: 1092200)
-CCIPConfig_updatePluginConfig:test_updatePluginConfig_RunningToStaging_Success() (gas: 2043837)
-CCIPConfig_updatePluginConfig:test_updatePluginConfig_StagingToRunning_Success() (gas: 2043872)
-CCIPConfig_validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334491)
-CCIPConfig_validateConfig:test__validateConfigSmallerFChain_Success() (gas: 465605)
-CCIPConfig_validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289551)
-CCIPConfig_validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 289846)
-CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 292593)
-CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 289185)
-CCIPConfig_validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 336851)
-CCIPConfig_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 290977)
-CCIPConfig_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 290416)
-CCIPConfig_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 343692)
-CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 309173)
-CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1211220)
-CCIPConfig_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 289247)
-CCIPConfig_validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 289485)
-CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 300450)
-CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 790349)
-CCIPConfig_validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 293748)
-CCIPConfig_validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 293820)
-CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9596)
+CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334693)
+CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 466117)
+CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289739)
+CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 290034)
+CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 292771)
+CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 289373)
+CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 337311)
+CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 291145)
+CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 290604)
+CCIPHome__validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 344238)
+CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 309179)
+CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1212133)
+CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 289400)
+CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 289661)
+CCIPHome__validateConfig:test__validateConfig_Success() (gas: 300616)
+CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 773237)
+CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 293988)
+CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 294035)
+CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 185242)
+CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 347249)
+CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20631)
+CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 270824)
+CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14952)
+CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 370980)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 27108)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 11783)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 11038)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 26121)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1412263)
+CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 63866)
+CCIPHome_constructor:test_constructor_success() (gas: 3498390)
+CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 9173)
+CCIPHome_constructor:test_supportsInterface_success() (gas: 9865)
+CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2735455)
+CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2513909)
+CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 9110)
+CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 21877)
+CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 8796)
+CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 2556754)
+CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 9068)
+CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 18421)
+CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 8773)
+CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 29506)
+CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 19022)
+CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1385010)
+CCIPHome_setCandidate:test_setCandidate_success() (gas: 1355245)
CommitStore_constructor:test_Constructor_Success() (gas: 2855567)
CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73954)
CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28739)
diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip
index 0696d66115..a8f2b2f233 100755
--- a/contracts/scripts/native_solc_compile_all_ccip
+++ b/contracts/scripts/native_solc_compile_all_ccip
@@ -73,8 +73,7 @@ compileContract ccip/RMN.sol
compileContract ccip/ARMProxy.sol
compileContract ccip/tokenAdminRegistry/TokenAdminRegistry.sol
compileContract ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol
-compileContract ccip/capability/CCIPConfig.sol
-compileContract ccip/capability/interfaces/IOCR3ConfigEncoder.sol
+compileContract ccip/capability/CCIPHome.sol
compileContract ccip/NonceManager.sol
compileContract shared/token/ERC677/BurnMintERC677.sol
@@ -104,7 +103,7 @@ compileContract ccip/test/WETH9.sol
# Encoding Utils
-compileContract ccip/CCIPEncodingUtils.sol
+compileContract ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol
# Customer contracts
compileContract ccip/pools/USDC/USDCTokenPool.sol
diff --git a/contracts/src/v0.8/ccip/CCIPEncodingUtils.sol b/contracts/src/v0.8/ccip/CCIPEncodingUtils.sol
deleted file mode 100644
index 010fa4a1cd..0000000000
--- a/contracts/src/v0.8/ccip/CCIPEncodingUtils.sol
+++ /dev/null
@@ -1,18 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
-
-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
-contract CCIPEncodingUtils {
- error DoNotDeploy();
-
- constructor() {
- revert DoNotDeploy();
- }
-
- /// @dev the RMN Report struct is used in integration / E2E tests
- function _rmnReport(bytes32 rmnReportVersion, RMNRemote.Report memory rmnReport) external {}
-}
diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol
index 9004c6b97d..d2a6b77eff 100644
--- a/contracts/src/v0.8/ccip/FeeQuoter.sol
+++ b/contracts/src/v0.8/ccip/FeeQuoter.sol
@@ -94,8 +94,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
uint32 maxPerMsgGasLimit; // │ Maximum gas limit for messages targeting EVMs
uint32 destGasOverhead; // │ Gas charged on top of the gasLimit to cover destination chain costs
uint16 destGasPerPayloadByte; // │ Destination chain gas charged for passing each byte of `data` payload to receiver
- uint32 destDataAvailabilityOverheadGas; // | Extra data availability gas charged on top of the message, e.g. for OCR
- uint16 destGasPerDataAvailabilityByte; // | Amount of gas to charge per byte of message data that needs availability
+ uint32 destDataAvailabilityOverheadGas; // │ Extra data availability gas charged on top of the message, e.g. for OCR
+ uint16 destGasPerDataAvailabilityByte; // │ Amount of gas to charge per byte of message data that needs availability
uint16 destDataAvailabilityMultiplierBps; // │ Multiplier for data availability gas, multiples of bps, or 0.0001
// The following three properties are defaults, they can be overridden by setting the TokenTransferFeeConfig for a token
uint16 defaultTokenFeeUSDCents; // │ Default token fee charged per token transfer
diff --git a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol b/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
deleted file mode 100644
index e677c132f9..0000000000
--- a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
+++ /dev/null
@@ -1,570 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
-
-import {ICapabilityConfiguration} from "../../keystone/interfaces/ICapabilityConfiguration.sol";
-import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
-import {ICapabilitiesRegistry} from "./interfaces/ICapabilitiesRegistry.sol";
-
-import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
-import {Internal} from "../libraries/Internal.sol";
-import {CCIPConfigTypes} from "./libraries/CCIPConfigTypes.sol";
-
-import {IERC165} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/interfaces/IERC165.sol";
-import {EnumerableSet} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/structs/EnumerableSet.sol";
-
-/// @notice CCIPConfig stores the configuration for the CCIP capability.
-/// We have two classes of configuration: chain configuration and DON (in the CapabilitiesRegistry sense) configuration.
-/// Each chain will have a single configuration which includes information like the router address.
-/// Each CR DON will have up to four configurations: for each of (commit, exec), one blue and one green configuration.
-/// This is done in order to achieve "blue-green" deployments.
-contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator, IERC165 {
- using EnumerableSet for EnumerableSet.UintSet;
-
- /// @notice Emitted when a chain's configuration is set.
- /// @param chainSelector The chain selector.
- /// @param chainConfig The chain configuration.
- event ChainConfigSet(uint64 chainSelector, CCIPConfigTypes.ChainConfig chainConfig);
- /// @notice Emitted when a chain's configuration is removed.
- /// @param chainSelector The chain selector.
- event ChainConfigRemoved(uint64 chainSelector);
-
- error NodeNotInRegistry(bytes32 p2pId);
- error OnlyCapabilitiesRegistryCanCall();
- error ChainSelectorNotFound(uint64 chainSelector);
- error ChainSelectorNotSet();
- error TooManyOCR3Configs();
- error TooManySigners();
- error InvalidNode(CCIPConfigTypes.OCR3Node node);
- error NotEnoughTransmitters(uint256 got, uint256 minimum);
- error FChainMustBePositive();
- error FTooHigh();
- error FChainTooHigh(uint256 fChain, uint256 FRoleDON);
- error InvalidPluginType();
- error OfframpAddressCannotBeZero();
- error RMNHomeAddressCannotBeZero();
- error InvalidConfigLength(uint256 length);
- error InvalidConfigStateTransition(
- CCIPConfigTypes.ConfigState currentState, CCIPConfigTypes.ConfigState proposedState
- );
- error NonExistentConfigTransition();
- error WrongConfigCount(uint64 got, uint64 expected);
- error WrongConfigDigest(bytes32 got, bytes32 expected);
- error WrongConfigDigestBlueGreen(bytes32 got, bytes32 expected);
- error ZeroAddressNotAllowed();
-
- event ConfigSet(uint32 indexed donId, uint8 indexed pluginType, CCIPConfigTypes.OCR3ConfigWithMeta[] config);
-
- /// @dev Type and version override.
- string public constant override typeAndVersion = "CCIPConfig 1.6.0-dev";
-
- /// @dev The canonical capabilities registry address.
- address internal immutable i_capabilitiesRegistry;
-
- uint8 internal constant MAX_OCR3_CONFIGS_PER_PLUGIN = 2;
- uint8 internal constant MAX_OCR3_CONFIGS_PER_DON = 4;
- uint256 internal constant CONFIG_DIGEST_PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..0
- /// @dev must be equal to libocr multi role: https://github.com/smartcontractkit/libocr/blob/ae747ca5b81236ffdbf1714318c652e923a5ff4d/offchainreporting2plus/types/config_digest.go#L28
- uint256 internal constant CONFIG_DIGEST_PREFIX = 0x000a << (256 - 16); // 0x000a00..00
- bytes32 internal constant EMPTY_ENCODED_ADDRESS_HASH = keccak256(abi.encode(address(0)));
- /// @dev 256 is the hard limit due to the bit encoding of their indexes into a uint256.
- uint256 internal constant MAX_NUM_ORACLES = 256;
-
- /// @dev chain configuration for each chain that CCIP is deployed on.
- mapping(uint64 chainSelector => CCIPConfigTypes.ChainConfig chainConfig) private s_chainConfigurations;
-
- /// @dev All chains that are configured.
- EnumerableSet.UintSet private s_remoteChainSelectors;
-
- /// @dev OCR3 configurations for each DON.
- /// Each CR DON will have a commit and execution configuration.
- /// This means that a DON can have up to 4 configurations, since we are implementing blue/green deployments.
- mapping(
- uint32 donId => mapping(Internal.OCRPluginType pluginType => CCIPConfigTypes.OCR3ConfigWithMeta[] ocr3Configs)
- ) private s_ocr3Configs;
-
- /// @param capabilitiesRegistry the canonical capabilities registry address.
- constructor(address capabilitiesRegistry) {
- if (capabilitiesRegistry == address(0)) {
- revert ZeroAddressNotAllowed();
- }
- i_capabilitiesRegistry = capabilitiesRegistry;
- }
-
- /// @inheritdoc IERC165
- function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
- return interfaceId == type(ICapabilityConfiguration).interfaceId || interfaceId == type(IERC165).interfaceId;
- }
-
- // ================================================================
- // │ Config Getters │
- // ================================================================
- /// @notice Returns the capabilities registry address.
- /// @return The capabilities registry address.
- function getCapabilityRegistry() external view returns (address) {
- return i_capabilitiesRegistry;
- }
-
- /// @notice Returns the total number of chains configured.
- /// @return The total number of chains configured.
- function getNumChainConfigurations() external view returns (uint256) {
- return s_remoteChainSelectors.length();
- }
-
- /// @notice Returns all the chain configurations.
- /// @param pageIndex The page index.
- /// @param pageSize The page size.
- /// @return paginatedChainConfigs chain configurations.
- function getAllChainConfigs(
- uint256 pageIndex,
- uint256 pageSize
- ) external view returns (CCIPConfigTypes.ChainConfigInfo[] memory) {
- uint256 totalItems = s_remoteChainSelectors.length(); // Total number of chain selectors
- uint256 startIndex = pageIndex * pageSize;
-
- if (pageSize == 0 || startIndex >= totalItems) {
- return new CCIPConfigTypes.ChainConfigInfo[](0); // Return an empty array if pageSize is 0 or pageIndex is out of bounds
- }
-
- uint256 endIndex = startIndex + pageSize;
- if (endIndex > totalItems) {
- endIndex = totalItems;
- }
-
- CCIPConfigTypes.ChainConfigInfo[] memory paginatedChainConfigs =
- new CCIPConfigTypes.ChainConfigInfo[](endIndex - startIndex);
-
- uint256[] memory chainSelectors = s_remoteChainSelectors.values();
- for (uint256 i = startIndex; i < endIndex; ++i) {
- uint64 chainSelector = uint64(chainSelectors[i]);
- paginatedChainConfigs[i - startIndex] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: chainSelector,
- chainConfig: s_chainConfigurations[chainSelector]
- });
- }
-
- return paginatedChainConfigs;
- }
-
- /// @notice Returns the OCR configuration for the given don ID and plugin type.
- /// @param donId The DON ID.
- /// @param pluginType The plugin type.
- /// @return The OCR3 configurations, up to 2 (blue and green).
- function getOCRConfig(
- uint32 donId,
- Internal.OCRPluginType pluginType
- ) external view returns (CCIPConfigTypes.OCR3ConfigWithMeta[] memory) {
- return s_ocr3Configs[donId][pluginType];
- }
-
- // ================================================================
- // │ Capability Configuration │
- // ================================================================
-
- /// @inheritdoc ICapabilityConfiguration
- /// @dev The CCIP capability will fetch the configuration needed directly from this contract.
- /// The offchain syncer will call this function, however, so its important that it doesn't revert.
- function getCapabilityConfiguration(uint32 /* donId */ ) external pure override returns (bytes memory configuration) {
- return bytes("");
- }
-
- /// @notice Called by the registry prior to the config being set for a particular DON.
- /// @dev precondition Requires destination chain config to be set
- function beforeCapabilityConfigSet(
- bytes32[] calldata, /* nodes */
- bytes calldata config,
- uint64, /* configCount */
- uint32 donId
- ) external override {
- if (msg.sender != i_capabilitiesRegistry) {
- revert OnlyCapabilitiesRegistryCanCall();
- }
-
- (CCIPConfigTypes.OCR3Config[] memory commitConfigs, CCIPConfigTypes.OCR3Config[] memory execConfigs) =
- _groupByPluginType(abi.decode(config, (CCIPConfigTypes.OCR3Config[])));
- if (commitConfigs.length > 0) {
- _updatePluginConfig(donId, Internal.OCRPluginType.Commit, commitConfigs);
- }
- if (execConfigs.length > 0) {
- _updatePluginConfig(donId, Internal.OCRPluginType.Execution, execConfigs);
- }
- }
-
- /// @notice Sets a new OCR3 config for a specific plugin type for a DON.
- /// @param donId The DON ID.
- /// @param pluginType The plugin type.
- /// @param newConfig The new configuration.
- function _updatePluginConfig(
- uint32 donId,
- Internal.OCRPluginType pluginType,
- CCIPConfigTypes.OCR3Config[] memory newConfig
- ) internal {
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = s_ocr3Configs[donId][pluginType];
-
- // Validate the state transition being proposed, which is implicitly defined by the combination
- // of lengths of the current and new configurations.
- CCIPConfigTypes.ConfigState currentState = _stateFromConfigLength(currentConfig.length);
- CCIPConfigTypes.ConfigState proposedState = _stateFromConfigLength(newConfig.length);
- _validateConfigStateTransition(currentState, proposedState);
-
- // Build the new configuration with metadata and validate that the transition is valid.
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta =
- _computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, proposedState);
- _validateConfigTransition(currentConfig, newConfigWithMeta);
-
- // Update contract state with new configuration if its valid.
- // We won't run out of gas from this delete since the array is at most 2 elements long.
- delete s_ocr3Configs[donId][pluginType];
- for (uint256 i = 0; i < newConfigWithMeta.length; ++i) {
- // Struct has to be manually copied since there is a nested OCR3Node array. Direct assignment
- // will result in Unimplemented Feature issue.
- CCIPConfigTypes.OCR3ConfigWithMeta storage ocr3ConfigWithMeta = s_ocr3Configs[donId][pluginType].push();
- ocr3ConfigWithMeta.configDigest = newConfigWithMeta[i].configDigest;
- ocr3ConfigWithMeta.configCount = newConfigWithMeta[i].configCount;
-
- CCIPConfigTypes.OCR3Config storage ocr3Config = ocr3ConfigWithMeta.config;
- CCIPConfigTypes.OCR3Config memory newOcr3Config = newConfigWithMeta[i].config;
- ocr3Config.pluginType = newOcr3Config.pluginType;
- ocr3Config.chainSelector = newOcr3Config.chainSelector;
- ocr3Config.FRoleDON = newOcr3Config.FRoleDON;
- ocr3Config.offchainConfigVersion = newOcr3Config.offchainConfigVersion;
- ocr3Config.offrampAddress = newOcr3Config.offrampAddress;
- ocr3Config.rmnHomeAddress = newOcr3Config.rmnHomeAddress;
- ocr3Config.offchainConfig = newOcr3Config.offchainConfig;
-
- // Remove all excess nodes
- while (ocr3Config.nodes.length > newOcr3Config.nodes.length) {
- ocr3Config.nodes.pop();
- }
-
- // Assign nodes
- for (uint256 j = 0; j < newOcr3Config.nodes.length; ++j) {
- if (j >= ocr3Config.nodes.length) {
- ocr3Config.nodes.push(newOcr3Config.nodes[j]);
- }
- }
- }
-
- emit ConfigSet(donId, uint8(pluginType), newConfigWithMeta);
- }
-
- // ================================================================
- // │ Config State Machine │
- // ================================================================
-
- /// @notice Determine the config state of the configuration from the length of the config.
- /// @param configLen The length of the configuration.
- /// @return The config state.
- function _stateFromConfigLength(uint256 configLen) internal pure returns (CCIPConfigTypes.ConfigState) {
- if (configLen > 2) {
- revert InvalidConfigLength(configLen);
- }
- return CCIPConfigTypes.ConfigState(configLen);
- }
-
- /// @notice Validates the state transition between two config states.
- /// The only valid state transitions are the following:
- /// Init -> Running (first ever config)
- /// Running -> Staging (blue/green proposal)
- /// Staging -> Running (promotion)
- /// Everything else is invalid and should revert.
- /// @param currentState The current state.
- /// @param newState The new state.
- function _validateConfigStateTransition(
- CCIPConfigTypes.ConfigState currentState,
- CCIPConfigTypes.ConfigState newState
- ) internal pure {
- // Calculate the difference between the new state and the current state
- int256 stateDiff = int256(uint256(newState)) - int256(uint256(currentState));
-
- // Check if the state transition is valid:
- // Valid transitions:
- // 1. currentState -> newState (where stateDiff == 1)
- // e.g., init -> running or running -> staging
- // 2. staging -> running (where stateDiff == -1)
- if (stateDiff == 1 || (stateDiff == -1 && currentState == CCIPConfigTypes.ConfigState.Staging)) {
- return;
- }
- revert InvalidConfigStateTransition(currentState, newState);
- }
-
- /// @notice Validates the transition between two OCR3 configurations.
- /// @param currentConfig The current configuration with metadata.
- /// @param newConfigWithMeta The new configuration with metadata.
- function _validateConfigTransition(
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig,
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta
- ) internal pure {
- uint256 currentConfigLen = currentConfig.length;
- uint256 newConfigLen = newConfigWithMeta.length;
- if (currentConfigLen == 0 && newConfigLen == 1) {
- // Config counts always must start at 1 for the first ever config.
- if (newConfigWithMeta[0].configCount != 1) {
- revert WrongConfigCount(newConfigWithMeta[0].configCount, 1);
- }
- return;
- }
-
- if (currentConfigLen == 1 && newConfigLen == 2) {
- // On a blue/green proposal:
- // * the config digest of the blue config must remain unchanged.
- // * the green config count must be the blue config count + 1.
- if (newConfigWithMeta[0].configDigest != currentConfig[0].configDigest) {
- revert WrongConfigDigestBlueGreen(newConfigWithMeta[0].configDigest, currentConfig[0].configDigest);
- }
- if (newConfigWithMeta[1].configCount != currentConfig[0].configCount + 1) {
- revert WrongConfigCount(newConfigWithMeta[1].configCount, currentConfig[0].configCount + 1);
- }
- return;
- }
-
- if (currentConfigLen == 2 && newConfigLen == 1) {
- // On a promotion, the green config digest must become the blue config digest.
- if (newConfigWithMeta[0].configDigest != currentConfig[1].configDigest) {
- revert WrongConfigDigest(newConfigWithMeta[0].configDigest, currentConfig[1].configDigest);
- }
- return;
- }
-
- revert NonExistentConfigTransition();
- }
-
- /// @notice Computes a new configuration with metadata based on the current configuration and the new configuration.
- /// @param donId The DON ID.
- /// @param currentConfig The current configuration, including metadata.
- /// @param newConfig The new configuration, without metadata.
- /// @param currentState The current state of the configuration.
- /// @param newState The new state of the configuration.
- /// @return The new configuration with metadata.
- function _computeNewConfigWithMeta(
- uint32 donId,
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig,
- CCIPConfigTypes.OCR3Config[] memory newConfig,
- CCIPConfigTypes.ConfigState currentState,
- CCIPConfigTypes.ConfigState newState
- ) internal view returns (CCIPConfigTypes.OCR3ConfigWithMeta[] memory) {
- uint64[] memory configCounts = new uint64[](newConfig.length);
-
- // Set config counts based on the only valid state transitions.
- // Init -> Running (first ever config)
- // Running -> Staging (blue/green proposal)
- // Staging -> Running (promotion)
- if (currentState == CCIPConfigTypes.ConfigState.Init && newState == CCIPConfigTypes.ConfigState.Running) {
- // First ever config starts with config count == 1.
- configCounts[0] = 1;
- } else if (currentState == CCIPConfigTypes.ConfigState.Running && newState == CCIPConfigTypes.ConfigState.Staging) {
- // On a blue/green proposal, the config count of the green config is the blue config count + 1.
- configCounts[0] = currentConfig[0].configCount;
- configCounts[1] = currentConfig[0].configCount + 1;
- } else if (currentState == CCIPConfigTypes.ConfigState.Staging && newState == CCIPConfigTypes.ConfigState.Running) {
- // On a promotion, the config count of the green config becomes the blue config count.
- configCounts[0] = currentConfig[1].configCount;
- } else {
- revert InvalidConfigStateTransition(currentState, newState);
- }
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta =
- new CCIPConfigTypes.OCR3ConfigWithMeta[](newConfig.length);
- for (uint256 i = 0; i < configCounts.length; ++i) {
- _validateConfig(newConfig[i]);
- newConfigWithMeta[i] = CCIPConfigTypes.OCR3ConfigWithMeta({
- config: newConfig[i],
- configCount: configCounts[i],
- configDigest: _computeConfigDigest(donId, configCounts[i], newConfig[i])
- });
- }
-
- return newConfigWithMeta;
- }
-
- /// @notice Group the OCR3 configurations by plugin type for further processing.
- /// @param ocr3Configs The OCR3 configurations to group.
- /// @return commitConfigs The commit configurations.
- /// @return execConfigs The execution configurations.
- function _groupByPluginType(
- CCIPConfigTypes.OCR3Config[] memory ocr3Configs
- )
- internal
- pure
- returns (CCIPConfigTypes.OCR3Config[] memory commitConfigs, CCIPConfigTypes.OCR3Config[] memory execConfigs)
- {
- if (ocr3Configs.length > MAX_OCR3_CONFIGS_PER_DON) {
- revert TooManyOCR3Configs();
- }
-
- // Declare with size 2 since we have a maximum of two configs per plugin type (blue, green).
- // If we have less we will adjust the length later using mstore.
- // If the caller provides more than 2 configs per plugin type, we will revert due to out of bounds
- // access in the for loop below.
- commitConfigs = new CCIPConfigTypes.OCR3Config[](MAX_OCR3_CONFIGS_PER_PLUGIN);
- execConfigs = new CCIPConfigTypes.OCR3Config[](MAX_OCR3_CONFIGS_PER_PLUGIN);
- uint256 commitCount = 0;
- uint256 execCount = 0;
- for (uint256 i = 0; i < ocr3Configs.length; ++i) {
- if (ocr3Configs[i].pluginType == Internal.OCRPluginType.Commit) {
- commitConfigs[commitCount] = ocr3Configs[i];
- ++commitCount;
- } else {
- execConfigs[execCount] = ocr3Configs[i];
- ++execCount;
- }
- }
-
- // Adjust the length of the arrays to the actual number of configs.
- assembly {
- mstore(commitConfigs, commitCount)
- mstore(execConfigs, execCount)
- }
-
- return (commitConfigs, execConfigs);
- }
-
- /// @notice Validates an OCR3 configuration.
- /// @param cfg The OCR3 configuration.
- function _validateConfig(CCIPConfigTypes.OCR3Config memory cfg) internal view {
- if (cfg.chainSelector == 0) revert ChainSelectorNotSet();
- if (cfg.pluginType != Internal.OCRPluginType.Commit && cfg.pluginType != Internal.OCRPluginType.Execution) {
- revert InvalidPluginType();
- }
- if (cfg.offrampAddress.length == 0 || keccak256(cfg.offrampAddress) == EMPTY_ENCODED_ADDRESS_HASH) {
- revert OfframpAddressCannotBeZero();
- }
- if (cfg.rmnHomeAddress.length == 0 || keccak256(cfg.rmnHomeAddress) == EMPTY_ENCODED_ADDRESS_HASH) {
- revert RMNHomeAddressCannotBeZero();
- }
- if (!s_remoteChainSelectors.contains(cfg.chainSelector)) revert ChainSelectorNotFound(cfg.chainSelector);
-
- // fChain cannot exceed FRoleDON, since it is a subcommittee in the larger DON
- uint256 FRoleDON = cfg.FRoleDON;
- uint256 fChain = s_chainConfigurations[cfg.chainSelector].fChain;
- // fChain > 0 is enforced in applyChainConfigUpdates, and the presence of a chain config is checked above
- // FRoleDON != 0 because FRoleDON >= fChain is enforced here
- if (fChain > FRoleDON) {
- revert FChainTooHigh(fChain, FRoleDON);
- }
-
- // len(nodes) >= 3 * FRoleDON + 1
- // len(nodes) == numberOfSigners
- uint256 numberOfNodes = cfg.nodes.length;
- if (numberOfNodes > MAX_NUM_ORACLES) revert TooManySigners();
- if (numberOfNodes <= 3 * FRoleDON) revert FTooHigh();
-
- uint256 nonZeroTransmitters = 0;
- bytes32[] memory p2pIds = new bytes32[](numberOfNodes);
- for (uint256 i = 0; i < numberOfNodes; ++i) {
- CCIPConfigTypes.OCR3Node memory node = cfg.nodes[i];
-
- // 3 * fChain + 1 <= nonZeroTransmitters <= 3 * FRoleDON + 1
- // Transmitters can be set to 0 since there can be more signers than transmitters,
- if (node.transmitterKey.length != 0) {
- nonZeroTransmitters++;
- }
-
- // Signer key and p2pIds must always be present
- if (node.signerKey.length == 0 || node.p2pId == bytes32(0)) {
- revert InvalidNode(node);
- }
-
- p2pIds[i] = node.p2pId;
- }
-
- // We check for chain config presence above, so fChain here must be non-zero. fChain <= FRoleDON due to the checks above.
- // There can be less transmitters than signers - so they can be set to zero (which indicates that a node is a signer, but not a transmitter).
- uint256 minTransmittersLength = 3 * fChain + 1;
- if (nonZeroTransmitters < minTransmittersLength) {
- revert NotEnoughTransmitters(nonZeroTransmitters, minTransmittersLength);
- }
-
- // Check that the readers are in the capabilities registry.
- _ensureInRegistry(p2pIds);
- }
-
- /// @notice Computes the digest of the provided configuration.
- /// @dev In traditional OCR config digest computation, block.chainid and address(this) are used
- /// in order to further domain separate the digest. We can't do that here since the digest will
- /// be used on remote chains; so we use the chain selector instead of block.chainid. The don ID
- /// replaces the address(this) in the traditional computation.
- /// @param donId The DON ID.
- /// @param configCount The configuration count.
- /// @param ocr3Config The OCR3 configuration.
- /// @return The computed digest.
- function _computeConfigDigest(
- uint32 donId,
- uint64 configCount,
- CCIPConfigTypes.OCR3Config memory ocr3Config
- ) internal pure returns (bytes32) {
- uint256 h = uint256(
- keccak256(
- abi.encode(
- ocr3Config.chainSelector,
- donId,
- ocr3Config.pluginType,
- ocr3Config.offrampAddress,
- ocr3Config.rmnHomeAddress,
- configCount,
- ocr3Config.nodes,
- ocr3Config.FRoleDON,
- ocr3Config.offchainConfigVersion,
- ocr3Config.offchainConfig
- )
- )
- );
-
- return bytes32((CONFIG_DIGEST_PREFIX & CONFIG_DIGEST_PREFIX_MASK) | (h & ~CONFIG_DIGEST_PREFIX_MASK));
- }
-
- // ================================================================
- // │ Chain Configuration │
- // ================================================================
-
- /// @notice Sets and/or removes chain configurations.
- /// Does not validate that fChain <= FRoleDON and relies on OCR3Configs to be changed in case fChain becomes larger than the FRoleDON value.
- /// @param chainSelectorRemoves The chain configurations to remove.
- /// @param chainConfigAdds The chain configurations to add.
- function applyChainConfigUpdates(
- uint64[] calldata chainSelectorRemoves,
- CCIPConfigTypes.ChainConfigInfo[] calldata chainConfigAdds
- ) external onlyOwner {
- // Process removals first.
- for (uint256 i = 0; i < chainSelectorRemoves.length; ++i) {
- // check if the chain selector is in s_remoteChainSelectors first.
- if (!s_remoteChainSelectors.contains(chainSelectorRemoves[i])) {
- revert ChainSelectorNotFound(chainSelectorRemoves[i]);
- }
-
- delete s_chainConfigurations[chainSelectorRemoves[i]];
- s_remoteChainSelectors.remove(chainSelectorRemoves[i]);
-
- emit ChainConfigRemoved(chainSelectorRemoves[i]);
- }
-
- // Process additions next.
- for (uint256 i = 0; i < chainConfigAdds.length; ++i) {
- CCIPConfigTypes.ChainConfig memory chainConfig = chainConfigAdds[i].chainConfig;
- uint64 chainSelector = chainConfigAdds[i].chainSelector;
-
- // Verify that the provided readers are present in the capabilities registry.
- _ensureInRegistry(chainConfig.readers);
-
- // Verify that fChain is positive.
- if (chainConfig.fChain == 0) {
- revert FChainMustBePositive();
- }
-
- s_chainConfigurations[chainSelector] = chainConfig;
- s_remoteChainSelectors.add(chainSelector);
-
- emit ChainConfigSet(chainSelector, chainConfig);
- }
- }
-
- /// @notice Helper function to ensure that a node is in the capabilities registry.
- /// @param p2pIds The P2P IDs of the node to check.
- function _ensureInRegistry(bytes32[] memory p2pIds) internal view {
- for (uint256 i = 0; i < p2pIds.length; ++i) {
- // TODO add a method that does the validation in the ICapabilitiesRegistry contract
- if (ICapabilitiesRegistry(i_capabilitiesRegistry).getNode(p2pIds[i]).p2pId == bytes32("")) {
- revert NodeNotInRegistry(p2pIds[i]);
- }
- }
- }
-}
diff --git a/contracts/src/v0.8/ccip/capability/CCIPHome.sol b/contracts/src/v0.8/ccip/capability/CCIPHome.sol
new file mode 100644
index 0000000000..3f05b59d5b
--- /dev/null
+++ b/contracts/src/v0.8/ccip/capability/CCIPHome.sol
@@ -0,0 +1,613 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.24;
+
+import {ICapabilityConfiguration} from "../../keystone/interfaces/ICapabilityConfiguration.sol";
+import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
+import {ICapabilitiesRegistry} from "../interfaces/ICapabilitiesRegistry.sol";
+
+import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
+import {Internal} from "../libraries/Internal.sol";
+
+import {IERC165} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/interfaces/IERC165.sol";
+import {EnumerableSet} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/structs/EnumerableSet.sol";
+
+/// @notice CCIPHome stores the configuration for the CCIP capability.
+/// We have two classes of configuration: chain configuration and DON (in the CapabilitiesRegistry sense) configuration.
+/// Each chain will have a single configuration which includes information like the router address.
+/// @dev This contract is a state machine with the following states:
+/// - Init: The initial state of the contract, no config has been set, or all configs have been revoked.
+/// [0, 0]
+///
+/// - Candidate: A new config has been set, but it has not been promoted yet, or all active configs have been revoked.
+/// [0, 1]
+///
+/// - Active: A non-zero config has been promoted and is active, there is no candidate configured.
+/// [1, 0]
+///
+/// - ActiveAndCandidate: A non-zero config has been promoted and is active, and a new config has been set as candidate.
+/// [1, 1]
+///
+/// The following state transitions are allowed:
+/// - Init -> Candidate: setCandidate()
+/// - Candidate -> Active: promoteCandidateAndRevokeActive()
+/// - Candidate -> Candidate: setCandidate()
+/// - Candidate -> Init: revokeCandidate()
+/// - Active -> ActiveAndCandidate: setCandidate()
+/// - Active -> Init: promoteCandidateAndRevokeActive()
+/// - ActiveAndCandidate -> Active: promoteCandidateAndRevokeActive()
+/// - ActiveAndCandidate -> Active: revokeCandidate()
+/// - ActiveAndCandidate -> ActiveAndCandidate: setCandidate()
+///
+/// This means the following calls are not allowed at the following states:
+/// - Init: promoteCandidateAndRevokeActive(), as there is no config to promote.
+/// - Init: revokeCandidate(), as there is no config to revoke
+/// - Active: revokeCandidate(), as there is no candidate to revoke
+/// Note that we explicitly do allow promoteCandidateAndRevokeActive() to be called when there is an active config but
+/// no candidate config. This is the only way to remove the active config. The alternative would be to set some unusable
+/// config as candidate and promote that, but fully clearing it is cleaner.
+///
+/// ┌─────────────┐ setCandidate ┌─────────────┐
+/// │ ├───────────────────►│ │ setCandidate
+/// │ Init │ revokeCandidate │ Candidate │◄───────────┐
+/// │ [0,0] │◄───────────────────┤ [0,1] │────────────┘
+/// │ │ ┌─────────────────┤ │
+/// └─────────────┘ │ promote- └─────────────┘
+/// ▲ │ Candidate
+/// promote- │ │
+/// Candidate │ │
+/// │ │
+/// ┌──────────┴──┐ │ promote- ┌─────────────┐
+/// │ │◄─┘ Candidate OR │ Active & │ setCandidate
+/// │ Active │ revokeCandidate │ Candidate │◄───────────┐
+/// │ [1,0] │◄───────────────────┤ [1,1] │────────────┘
+/// │ ├───────────────────►│ │
+/// └─────────────┘ setSecondary └─────────────┘
+///
+contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration, IERC165 {
+ using EnumerableSet for EnumerableSet.UintSet;
+
+ event ChainConfigRemoved(uint64 chainSelector);
+ event ChainConfigSet(uint64 chainSelector, ChainConfig chainConfig);
+ event ConfigSet(bytes32 indexed configDigest, uint32 version, OCR3Config config);
+ event ActiveConfigRevoked(bytes32 indexed configDigest);
+ event CandidateConfigRevoked(bytes32 indexed configDigest);
+ event ConfigPromoted(bytes32 indexed configDigest);
+
+ error NodeNotInRegistry(bytes32 p2pId);
+ error ChainSelectorNotFound(uint64 chainSelector);
+ error FChainMustBePositive();
+ error ChainSelectorNotSet();
+ error InvalidPluginType();
+ error OfframpAddressCannotBeZero();
+ error FChainTooHigh(uint256 fChain, uint256 FRoleDON);
+ error TooManySigners();
+ error FTooHigh();
+ error RMNHomeAddressCannotBeZero();
+ error InvalidNode(OCR3Node node);
+ error NotEnoughTransmitters(uint256 got, uint256 minimum);
+ error OnlyCapabilitiesRegistryCanCall();
+ error ZeroAddressNotAllowed();
+ error ConfigDigestMismatch(bytes32 expectedConfigDigest, bytes32 gotConfigDigest);
+ error CanOnlySelfCall();
+ error RevokingZeroDigestNotAllowed();
+ error NoOpStateTransitionNotAllowed();
+ error InvalidSelector(bytes4 selector);
+ error DONIdMismatch(uint32 callDonId, uint32 capabilityRegistryDonId);
+
+ error InvalidStateTransition(
+ bytes32 currentActiveDigest,
+ bytes32 currentCandidateDigest,
+ bytes32 proposedActiveDigest,
+ bytes32 proposedCandidateDigest
+ );
+
+ /// @notice Represents an oracle node in OCR3 configs part of the role DON.
+ /// Every configured node should be a signer, but does not have to be a transmitter.
+ struct OCR3Node {
+ bytes32 p2pId; // Peer2Peer connection ID of the oracle
+ bytes signerKey; // On-chain signer public key
+ bytes transmitterKey; // On-chain transmitter public key. Can be set to empty bytes to represent that the node is a signer but not a transmitter.
+ }
+
+ /// @notice OCR3 configuration.
+ /// Note that FRoleDON >= fChain, since FRoleDON represents the role DON, and fChain represents sub-committees.
+ /// FRoleDON values are typically identical across multiple OCR3 configs since the chains pertain to one role DON,
+ /// but FRoleDON values can change across OCR3 configs to indicate role DON splits.
+ struct OCR3Config {
+ Internal.OCRPluginType pluginType; // ─╮ The plugin that the configuration is for.
+ uint64 chainSelector; // │ The (remote) chain that the configuration is for.
+ uint8 FRoleDON; // │ The "big F" parameter for the role DON.
+ uint64 offchainConfigVersion; // ──────╯ The version of the exec offchain configuration.
+ bytes offrampAddress; // The remote chain offramp address.
+ bytes rmnHomeAddress; // The home chain RMN home address.
+ OCR3Node[] nodes; // Keys & IDs of nodes part of the role DON
+ bytes offchainConfig; // The offchain configuration for the OCR3 plugin. Protobuf encoded.
+ }
+
+ struct VersionedConfig {
+ uint32 version;
+ bytes32 configDigest;
+ OCR3Config config;
+ }
+
+ /// @notice Chain configuration.
+ /// Changes to chain configuration are detected out-of-band in plugins and decoded offchain.
+ struct ChainConfig {
+ bytes32[] readers; // The P2P IDs of the readers for the chain. These IDs must be registered in the capabilities registry.
+ uint8 fChain; // The fault tolerance parameter of the chain.
+ bytes config; // The chain configuration. This is kept intentionally opaque so as to add fields in the future if needed.
+ }
+
+ /// @notice Chain configuration information struct used in applyChainConfigUpdates and getAllChainConfigs.
+ struct ChainConfigArgs {
+ uint64 chainSelector;
+ ChainConfig chainConfig;
+ }
+
+ string public constant override typeAndVersion = "CCIPHome 1.6.0-dev";
+
+ /// @dev A prefix added to all config digests that is unique to the implementation
+ uint256 private constant PREFIX = 0x000a << (256 - 16); // 0x000a00..00
+ bytes32 internal constant EMPTY_ENCODED_ADDRESS_HASH = keccak256(abi.encode(address(0)));
+ /// @dev 256 is the hard limit due to the bit encoding of their indexes into a uint256.
+ uint256 internal constant MAX_NUM_ORACLES = 256;
+
+ /// @notice Used for encoding the config digest prefix
+ uint256 private constant PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..00
+ /// @notice The max number of configs that can be active at the same time.
+ uint256 private constant MAX_CONCURRENT_CONFIGS = 2;
+ /// @notice Helper to identify the zero config digest with less casting.
+ bytes32 private constant ZERO_DIGEST = bytes32(uint256(0));
+
+ /// @dev The canonical capabilities registry address.
+ address internal immutable i_capabilitiesRegistry;
+
+ /// @dev chain configuration for each chain that CCIP is deployed on.
+ mapping(uint64 chainSelector => ChainConfig chainConfig) private s_chainConfigurations;
+
+ /// @dev All chains that are configured.
+ EnumerableSet.UintSet private s_remoteChainSelectors;
+
+ /// @notice This array holds the configs.
+ /// @dev A DonID covers a single chain, and the plugin type is used to differentiate between the commit and execution
+ mapping(uint32 donId => mapping(Internal.OCRPluginType pluginType => VersionedConfig[MAX_CONCURRENT_CONFIGS])) private
+ s_configs;
+
+ /// @notice The total number of configs ever set, used for generating the version of the configs.
+ uint32 private s_currentVersion = 0;
+ /// @notice The index of the active config.
+ uint32 private s_activeConfigIndex = 0;
+
+ /// @notice Constructor for the CCIPHome contract takes in the address of the capabilities registry. This address
+ /// is the only allowed caller to mutate the configuration through beforeCapabilityConfigSet.
+ constructor(address capabilitiesRegistry) {
+ if (capabilitiesRegistry == address(0)) {
+ revert ZeroAddressNotAllowed();
+ }
+ i_capabilitiesRegistry = capabilitiesRegistry;
+ }
+
+ // ================================================================
+ // │ Capability Registry │
+ // ================================================================
+
+ /// @notice Returns the capabilities registry address.
+ /// @return The capabilities registry address.
+ function getCapabilityRegistry() external view returns (address) {
+ return i_capabilitiesRegistry;
+ }
+
+ /// @inheritdoc IERC165
+ /// @dev Required for the capabilities registry to recognize this contract.
+ function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
+ return interfaceId == type(ICapabilityConfiguration).interfaceId || interfaceId == type(IERC165).interfaceId;
+ }
+
+ /// @notice Called by the registry prior to the config being set for a particular DON.
+ /// @dev precondition Requires destination chain config to be set
+ function beforeCapabilityConfigSet(
+ bytes32[] calldata, // nodes
+ bytes calldata update,
+ // Config count is unused because we don't want to invalidate a config on blue/green promotions so we keep track of
+ // the actual newly submitted configs instead of the number of config mutations.
+ uint64, // config count
+ uint32 donId
+ ) external override {
+ if (msg.sender != i_capabilitiesRegistry) {
+ revert OnlyCapabilitiesRegistryCanCall();
+ }
+
+ bytes4 selector = bytes4(update[:4]);
+ // We only allow self-calls to the following approved methods
+ if (
+ selector != this.setCandidate.selector && selector != this.revokeCandidate.selector
+ && selector != this.promoteCandidateAndRevokeActive.selector
+ ) {
+ revert InvalidSelector(selector);
+ }
+
+ // We validate that the call contains the correct DON ID. The DON ID is always the first function argument.
+ uint256 callDonId = abi.decode(update[4:36], (uint256));
+ if (callDonId != donId) {
+ revert DONIdMismatch(uint32(callDonId), donId);
+ }
+
+ // solhint-disable-next-line avoid-low-level-calls
+ (bool success, bytes memory retData) = address(this).call(update);
+ // if not successful, revert with the original revert
+ if (!success) {
+ assembly {
+ revert(add(retData, 0x20), returndatasize())
+ }
+ }
+ }
+
+ /// @inheritdoc ICapabilityConfiguration
+ /// @dev The CCIP capability will fetch the configuration needed directly from this contract.
+ /// The offchain syncer will call this function, so its important that it doesn't revert.
+ function getCapabilityConfiguration(uint32 /* donId */ ) external pure override returns (bytes memory configuration) {
+ return bytes("");
+ }
+
+ // ================================================================
+ // │ Getters │
+ // ================================================================
+
+ /// @notice Returns the current active and candidate config digests.
+ /// @dev Can be bytes32(0) if no config has been set yet or it has been revoked.
+ /// @param donId The key of the plugin to get the config digests for.
+ /// @return activeConfigDigest The digest of the active config.
+ /// @return candidateConfigDigest The digest of the candidate config.
+ function getConfigDigests(
+ uint32 donId,
+ Internal.OCRPluginType pluginType
+ ) public view returns (bytes32 activeConfigDigest, bytes32 candidateConfigDigest) {
+ return (
+ s_configs[donId][pluginType][_getActiveIndex()].configDigest,
+ s_configs[donId][pluginType][_getCandidateIndex()].configDigest
+ );
+ }
+
+ /// @notice Returns the active config digest for for a given key.
+ /// @param donId The key of the plugin to get the config digests for.
+ function getActiveDigest(uint32 donId, Internal.OCRPluginType pluginType) public view returns (bytes32) {
+ return s_configs[donId][pluginType][_getActiveIndex()].configDigest;
+ }
+
+ /// @notice Returns the candidate config digest for for a given key.
+ /// @param donId The key of the plugin to get the config digests for.
+ function getCandidateDigest(uint32 donId, Internal.OCRPluginType pluginType) public view returns (bytes32) {
+ return s_configs[donId][pluginType][_getCandidateIndex()].configDigest;
+ }
+
+ /// @notice The offchain code can use this to fetch an old config which might still be in use by some remotes. Use
+ /// in case one of the configs is too large to be returnable by one of the other getters.
+ /// @param donId The unique key for the DON that the configuration applies to.
+ /// @param configDigest The digest of the config to fetch.
+ /// @return versionedConfig The config and its version.
+ /// @return ok True if the config was found, false otherwise.
+ function getConfig(
+ uint32 donId,
+ Internal.OCRPluginType pluginType,
+ bytes32 configDigest
+ ) external view returns (VersionedConfig memory versionedConfig, bool ok) {
+ for (uint256 i = 0; i < MAX_CONCURRENT_CONFIGS; ++i) {
+ // We never want to return true for a zero digest, even if the caller is asking for it, as this can expose old
+ // config state that is invalid.
+ if (s_configs[donId][pluginType][i].configDigest == configDigest && configDigest != ZERO_DIGEST) {
+ return (s_configs[donId][pluginType][i], true);
+ }
+ }
+ // versionConfig is uninitialized so it contains default values.
+ return (versionedConfig, false);
+ }
+
+ /// @notice Returns the active and candidate configuration for a given plugin key.
+ /// @param donId The unique key for the DON that the configuration applies to.
+ /// @return activeConfig The active configuration.
+ /// @return candidateConfig The candidate configuration.
+ function getAllConfigs(
+ uint32 donId,
+ Internal.OCRPluginType pluginType
+ ) external view returns (VersionedConfig memory activeConfig, VersionedConfig memory candidateConfig) {
+ VersionedConfig memory storedActiveConfig = s_configs[donId][pluginType][_getActiveIndex()];
+ if (storedActiveConfig.configDigest != ZERO_DIGEST) {
+ activeConfig = storedActiveConfig;
+ }
+
+ VersionedConfig memory storedCandidateConfig = s_configs[donId][pluginType][_getCandidateIndex()];
+ if (storedCandidateConfig.configDigest != ZERO_DIGEST) {
+ candidateConfig = storedCandidateConfig;
+ }
+
+ return (activeConfig, candidateConfig);
+ }
+
+ // ================================================================
+ // │ State transitions │
+ // ================================================================
+
+ /// @notice Sets a new config as the candidate config. Does not influence the active config.
+ /// @param donId The key of the plugin to set the config for.
+ /// @return newConfigDigest The digest of the new config.
+ function setCandidate(
+ uint32 donId,
+ Internal.OCRPluginType pluginType,
+ OCR3Config calldata config,
+ bytes32 digestToOverwrite
+ ) external returns (bytes32 newConfigDigest) {
+ _onlySelfCall();
+ _validateConfig(config);
+
+ bytes32 existingDigest = getCandidateDigest(donId, pluginType);
+
+ if (existingDigest != digestToOverwrite) {
+ revert ConfigDigestMismatch(existingDigest, digestToOverwrite);
+ }
+
+ // are we going to overwrite a config? If so, emit an event.
+ if (existingDigest != ZERO_DIGEST) {
+ emit CandidateConfigRevoked(digestToOverwrite);
+ }
+
+ uint32 newVersion = ++s_currentVersion;
+ newConfigDigest = _calculateConfigDigest(donId, pluginType, abi.encode(config), newVersion);
+
+ VersionedConfig storage existingConfig = s_configs[donId][pluginType][_getCandidateIndex()];
+ existingConfig.configDigest = newConfigDigest;
+ existingConfig.version = newVersion;
+ existingConfig.config = config;
+
+ emit ConfigSet(newConfigDigest, newVersion, config);
+
+ return newConfigDigest;
+ }
+
+ /// @notice Revokes a specific config by digest.
+ /// @param donId The key of the plugin to revoke the config for.
+ /// @param configDigest The digest of the config to revoke. This is done to prevent accidental revokes.
+ function revokeCandidate(uint32 donId, Internal.OCRPluginType pluginType, bytes32 configDigest) external {
+ _onlySelfCall();
+
+ if (configDigest == ZERO_DIGEST) {
+ revert RevokingZeroDigestNotAllowed();
+ }
+
+ uint256 candidateConfigIndex = _getCandidateIndex();
+ if (s_configs[donId][pluginType][candidateConfigIndex].configDigest != configDigest) {
+ revert ConfigDigestMismatch(s_configs[donId][pluginType][candidateConfigIndex].configDigest, configDigest);
+ }
+
+ emit CandidateConfigRevoked(configDigest);
+ // Delete only the digest, as that's what's used to determine if a config is active. This means the actual
+ // config stays in storage which should significantly reduce the gas cost of overwriting that storage space in
+ // the future.
+ delete s_configs[donId][pluginType][candidateConfigIndex].configDigest;
+ }
+
+ /// @notice Promotes the candidate config to the active config and revokes the active config.
+ /// @param donId The key of the plugin to promote the config for.
+ /// @param digestToPromote The digest of the config to promote.
+ function promoteCandidateAndRevokeActive(
+ uint32 donId,
+ Internal.OCRPluginType pluginType,
+ bytes32 digestToPromote,
+ bytes32 digestToRevoke
+ ) external {
+ _onlySelfCall();
+
+ if (digestToPromote == ZERO_DIGEST && digestToRevoke == ZERO_DIGEST) {
+ revert NoOpStateTransitionNotAllowed();
+ }
+
+ uint256 candidateConfigIndex = _getCandidateIndex();
+ if (s_configs[donId][pluginType][candidateConfigIndex].configDigest != digestToPromote) {
+ revert ConfigDigestMismatch(s_configs[donId][pluginType][candidateConfigIndex].configDigest, digestToPromote);
+ }
+
+ VersionedConfig storage activeConfig = s_configs[donId][pluginType][_getActiveIndex()];
+ if (activeConfig.configDigest != digestToRevoke) {
+ revert ConfigDigestMismatch(activeConfig.configDigest, digestToRevoke);
+ }
+
+ delete activeConfig.configDigest;
+
+ s_activeConfigIndex ^= 1;
+ if (digestToRevoke != ZERO_DIGEST) {
+ emit ActiveConfigRevoked(digestToRevoke);
+ }
+ emit ConfigPromoted(digestToPromote);
+ }
+
+ /// @notice Calculates the config digest for a given plugin key, static config, and version.
+ /// @param donId The key of the plugin to calculate the digest for.
+ /// @param staticConfig The static part of the config.
+ /// @param version The version of the config.
+ /// @return The calculated config digest.
+ function _calculateConfigDigest(
+ uint32 donId,
+ Internal.OCRPluginType pluginType,
+ bytes memory staticConfig,
+ uint32 version
+ ) internal view returns (bytes32) {
+ return bytes32(
+ (PREFIX & PREFIX_MASK)
+ | (
+ uint256(
+ keccak256(
+ bytes.concat(
+ abi.encode(bytes32("EVM"), block.chainid, address(this), donId, pluginType, version), staticConfig
+ )
+ )
+ ) & ~PREFIX_MASK
+ )
+ );
+ }
+
+ function _getActiveIndex() private view returns (uint32) {
+ return s_activeConfigIndex;
+ }
+
+ function _getCandidateIndex() private view returns (uint32) {
+ return s_activeConfigIndex ^ 1;
+ }
+
+ // ================================================================
+ // │ Validation │
+ // ================================================================
+
+ function _validateConfig(OCR3Config memory cfg) internal view {
+ if (cfg.chainSelector == 0) revert ChainSelectorNotSet();
+ if (cfg.pluginType != Internal.OCRPluginType.Commit && cfg.pluginType != Internal.OCRPluginType.Execution) {
+ revert InvalidPluginType();
+ }
+ if (cfg.offrampAddress.length == 0 || keccak256(cfg.offrampAddress) == EMPTY_ENCODED_ADDRESS_HASH) {
+ revert OfframpAddressCannotBeZero();
+ }
+ if (cfg.rmnHomeAddress.length == 0 || keccak256(cfg.rmnHomeAddress) == EMPTY_ENCODED_ADDRESS_HASH) {
+ revert RMNHomeAddressCannotBeZero();
+ }
+ if (!s_remoteChainSelectors.contains(cfg.chainSelector)) revert ChainSelectorNotFound(cfg.chainSelector);
+
+ // fChain cannot exceed FRoleDON, since it is a subcommittee in the larger DON
+ uint256 FRoleDON = cfg.FRoleDON;
+ uint256 fChain = s_chainConfigurations[cfg.chainSelector].fChain;
+ // fChain > 0 is enforced in applyChainConfigUpdates, and the presence of a chain config is checked above
+ // FRoleDON != 0 because FRoleDON >= fChain is enforced here
+ if (fChain > FRoleDON) {
+ revert FChainTooHigh(fChain, FRoleDON);
+ }
+
+ // len(nodes) >= 3 * FRoleDON + 1
+ // len(nodes) == numberOfSigners
+ uint256 numberOfNodes = cfg.nodes.length;
+ if (numberOfNodes > MAX_NUM_ORACLES) revert TooManySigners();
+ if (numberOfNodes <= 3 * FRoleDON) revert FTooHigh();
+
+ uint256 nonZeroTransmitters = 0;
+ bytes32[] memory p2pIds = new bytes32[](numberOfNodes);
+ for (uint256 i = 0; i < numberOfNodes; ++i) {
+ OCR3Node memory node = cfg.nodes[i];
+
+ // 3 * fChain + 1 <= nonZeroTransmitters <= 3 * FRoleDON + 1
+ // Transmitters can be set to 0 since there can be more signers than transmitters,
+ if (node.transmitterKey.length != 0) {
+ nonZeroTransmitters++;
+ }
+
+ // Signer key and p2pIds must always be present
+ if (node.signerKey.length == 0 || node.p2pId == bytes32(0)) {
+ revert InvalidNode(node);
+ }
+
+ p2pIds[i] = node.p2pId;
+ }
+
+ // We check for chain config presence above, so fChain here must be non-zero. fChain <= FRoleDON due to the checks above.
+ // There can be less transmitters than signers - so they can be set to zero (which indicates that a node is a signer, but not a transmitter).
+ uint256 minTransmittersLength = 3 * fChain + 1;
+ if (nonZeroTransmitters < minTransmittersLength) {
+ revert NotEnoughTransmitters(nonZeroTransmitters, minTransmittersLength);
+ }
+
+ // Check that the readers are in the capabilities registry.
+ _ensureInRegistry(p2pIds);
+ }
+
+ function _onlySelfCall() internal view {
+ if (msg.sender != address(this)) {
+ revert CanOnlySelfCall();
+ }
+ }
+
+ // ================================================================
+ // │ Chain Configuration │
+ // ================================================================
+
+ /// @notice Returns the total number of chains configured.
+ /// @return The total number of chains configured.
+ function getNumChainConfigurations() external view returns (uint256) {
+ return s_remoteChainSelectors.length();
+ }
+
+ /// @notice Returns all the chain configurations.
+ /// @param pageIndex The page index.
+ /// @param pageSize The page size.
+ /// @return paginatedChainConfigs chain configurations.
+ function getAllChainConfigs(uint256 pageIndex, uint256 pageSize) external view returns (ChainConfigArgs[] memory) {
+ uint256 numberOfChains = s_remoteChainSelectors.length();
+ uint256 startIndex = pageIndex * pageSize;
+
+ if (pageSize == 0 || startIndex >= numberOfChains) {
+ return new ChainConfigArgs[](0); // Return an empty array if pageSize is 0 or pageIndex is out of bounds
+ }
+
+ uint256 endIndex = startIndex + pageSize;
+ if (endIndex > numberOfChains) {
+ endIndex = numberOfChains;
+ }
+
+ ChainConfigArgs[] memory paginatedChainConfigs = new ChainConfigArgs[](endIndex - startIndex);
+
+ uint256[] memory chainSelectors = s_remoteChainSelectors.values();
+ for (uint256 i = startIndex; i < endIndex; ++i) {
+ uint64 chainSelector = uint64(chainSelectors[i]);
+ paginatedChainConfigs[i - startIndex] =
+ ChainConfigArgs({chainSelector: chainSelector, chainConfig: s_chainConfigurations[chainSelector]});
+ }
+
+ return paginatedChainConfigs;
+ }
+
+ /// @notice Sets and/or removes chain configurations.
+ /// Does not validate that fChain <= FRoleDON and relies on OCR3Configs to be changed in case fChain becomes larger than the FRoleDON value.
+ /// @param chainSelectorRemoves The chain configurations to remove.
+ /// @param chainConfigAdds The chain configurations to add.
+ function applyChainConfigUpdates(
+ uint64[] calldata chainSelectorRemoves,
+ ChainConfigArgs[] calldata chainConfigAdds
+ ) external onlyOwner {
+ // Process removals first.
+ for (uint256 i = 0; i < chainSelectorRemoves.length; ++i) {
+ // check if the chain selector is in s_remoteChainSelectors first.
+ if (!s_remoteChainSelectors.contains(chainSelectorRemoves[i])) {
+ revert ChainSelectorNotFound(chainSelectorRemoves[i]);
+ }
+
+ delete s_chainConfigurations[chainSelectorRemoves[i]];
+ s_remoteChainSelectors.remove(chainSelectorRemoves[i]);
+
+ emit ChainConfigRemoved(chainSelectorRemoves[i]);
+ }
+
+ // Process additions next.
+ for (uint256 i = 0; i < chainConfigAdds.length; ++i) {
+ ChainConfig memory chainConfig = chainConfigAdds[i].chainConfig;
+ uint64 chainSelector = chainConfigAdds[i].chainSelector;
+
+ // Verify that the provided readers are present in the capabilities registry.
+ _ensureInRegistry(chainConfig.readers);
+
+ // Verify that fChain is positive.
+ if (chainConfig.fChain == 0) {
+ revert FChainMustBePositive();
+ }
+
+ s_chainConfigurations[chainSelector] = chainConfig;
+ s_remoteChainSelectors.add(chainSelector);
+
+ emit ChainConfigSet(chainSelector, chainConfig);
+ }
+ }
+
+ /// @notice Helper function to ensure that a node is in the capabilities registry.
+ /// @param p2pIds The P2P IDs of the node to check.
+ function _ensureInRegistry(bytes32[] memory p2pIds) internal view {
+ for (uint256 i = 0; i < p2pIds.length; ++i) {
+ // TODO add a method that does the validation in the ICapabilitiesRegistry contract
+ if (ICapabilitiesRegistry(i_capabilitiesRegistry).getNode(p2pIds[i]).p2pId == bytes32("")) {
+ revert NodeNotInRegistry(p2pIds[i]);
+ }
+ }
+ }
+}
diff --git a/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol b/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol
deleted file mode 100644
index d09dbeb65a..0000000000
--- a/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol
+++ /dev/null
@@ -1,11 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.4;
-
-import {CCIPConfigTypes} from "../libraries/CCIPConfigTypes.sol";
-
-/// @dev This is so that we can generate gethwrappers and easily encode/decode OCR3Config
-/// in the offchain integration tests.
-interface IOCR3ConfigEncoder {
- /// @dev Encodes an array of OCR3Config into a bytes array. For test usage only.
- function exposeOCR3Config(CCIPConfigTypes.OCR3Config[] calldata config) external view returns (bytes memory);
-}
diff --git a/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol b/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
deleted file mode 100644
index e5d77b02e5..0000000000
--- a/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol
+++ /dev/null
@@ -1,69 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.4;
-
-import {Internal} from "../../libraries/Internal.sol";
-
-library CCIPConfigTypes {
- /// @notice ConfigState indicates the state of the configuration.
- /// A DON's configuration always starts out in the "Init" state - this is the starting state.
- /// The only valid transition from "Init" is to the "Running" state - this is the first ever configuration.
- /// The only valid transition from "Running" is to the "Staging" state - this is a blue/green proposal.
- /// The only valid transition from "Staging" is back to the "Running" state - this is a promotion.
- /// In order to rollback a configuration, we must therefore do the following:
- /// - Suppose that we have a correct configuration in the "Running" state (V1).
- /// - We propose a new configuration and transition to the "Staging" state (V2).
- /// - V2 turns out to be buggy
- /// - In the same transaction, we must:
- /// - Promote V2
- /// - Re-propose V1
- /// - Promote V1
- enum ConfigState {
- Init,
- Running,
- Staging
- }
-
- /// @notice Chain configuration.
- /// Changes to chain configuration are detected out-of-band in plugins and decoded offchain.
- struct ChainConfig {
- bytes32[] readers; // The P2P IDs of the readers for the chain. These IDs must be registered in the capabilities registry.
- uint8 fChain; // The fault tolerance parameter of the chain.
- bytes config; // The chain configuration. This is kept intentionally opaque so as to add fields in the future if needed.
- }
-
- /// @notice Chain configuration information struct used in applyChainConfigUpdates and getAllChainConfigs.
- struct ChainConfigInfo {
- uint64 chainSelector;
- ChainConfig chainConfig;
- }
-
- /// @notice Represents an oracle node in OCR3 configs part of the role DON.
- /// Every configured node should be a signer, but does not have to be a transmitter.
- struct OCR3Node {
- bytes32 p2pId; // Peer2Peer connection ID of the oracle
- bytes signerKey; // On-chain signer public key
- bytes transmitterKey; // On-chain transmitter public key. Can be set to empty bytes to represent that the node is a signer but not a transmitter.
- }
-
- /// @notice OCR3 configuration.
- /// Note that FRoleDON >= fChain, since FRoleDON represents the role DON, and fChain represents sub-committees.
- /// FRoleDON values are typically identical across multiple OCR3 configs since the chains pertain to one role DON,
- /// but FRoleDON values can change across OCR3 configs to indicate role DON splits.
- struct OCR3Config {
- Internal.OCRPluginType pluginType; // ────────╮ The plugin that the configuration is for.
- uint64 chainSelector; // | The (remote) chain that the configuration is for.
- uint8 FRoleDON; // | The "big F" parameter for the role DON.
- uint64 offchainConfigVersion; // ─────────────╯ The version of the offchain configuration.
- bytes offrampAddress; // The remote chain offramp address.
- bytes rmnHomeAddress; // The home chain RMN home address.
- OCR3Node[] nodes; // Keys & IDs of nodes part of the role DON
- bytes offchainConfig; // The offchain configuration for the OCR3 protocol. Protobuf encoded.
- }
-
- /// @notice OCR3 configuration with metadata, specifically the config count and the config digest.
- struct OCR3ConfigWithMeta {
- OCR3Config config; // The OCR3 configuration.
- uint64 configCount; // The config count used to compute the config digest.
- bytes32 configDigest; // The config digest of the OCR3 configuration.
- }
-}
diff --git a/contracts/src/v0.8/ccip/capability/interfaces/ICapabilitiesRegistry.sol b/contracts/src/v0.8/ccip/interfaces/ICapabilitiesRegistry.sol
similarity index 98%
rename from contracts/src/v0.8/ccip/capability/interfaces/ICapabilitiesRegistry.sol
rename to contracts/src/v0.8/ccip/interfaces/ICapabilitiesRegistry.sol
index 621c3686cf..dac7317e41 100644
--- a/contracts/src/v0.8/ccip/capability/interfaces/ICapabilitiesRegistry.sol
+++ b/contracts/src/v0.8/ccip/interfaces/ICapabilitiesRegistry.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.24;
+pragma solidity ^0.8.0;
interface ICapabilitiesRegistry {
struct NodeInfo {
diff --git a/contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol b/contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol
new file mode 100644
index 0000000000..026c5fa50b
--- /dev/null
+++ b/contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.0;
+
+import {CCIPHome} from "../../capability/CCIPHome.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 {
+ /// @dev the RMN Report struct is used in integration / E2E tests
+ function exposeRmnReport(bytes32 rmnReportVersion, RMNRemote.Report memory rmnReport) external;
+
+ /// @dev the OCR3Config Config struct is used in integration / E2E tests
+ function exposeOCR3Config(CCIPHome.OCR3Config[] calldata config) external view returns (bytes memory);
+}
diff --git a/contracts/src/v0.8/ccip/rmn/RMNHome.sol b/contracts/src/v0.8/ccip/rmn/RMNHome.sol
index 0280daddc2..d13385aed8 100644
--- a/contracts/src/v0.8/ccip/rmn/RMNHome.sol
+++ b/contracts/src/v0.8/ccip/rmn/RMNHome.sol
@@ -143,17 +143,17 @@ contract RMNHome is OwnerIsCreator, ITypeAndVersion {
/// @return activeConfigDigest The digest of the active config.
/// @return candidateConfigDigest The digest of the candidate config.
function getConfigDigests() external view returns (bytes32 activeConfigDigest, bytes32 candidateConfigDigest) {
- return (s_configs[getActiveIndex()].configDigest, s_configs[getCandidateIndex()].configDigest);
+ return (s_configs[_getActiveIndex()].configDigest, s_configs[_getCandidateIndex()].configDigest);
}
/// @notice Returns the active config digest
function getActiveDigest() external view returns (bytes32) {
- return s_configs[getActiveIndex()].configDigest;
+ return s_configs[_getActiveIndex()].configDigest;
}
/// @notice Returns the candidate config digest
function getCandidateDigest() public view returns (bytes32) {
- return s_configs[getCandidateIndex()].configDigest;
+ return s_configs[_getCandidateIndex()].configDigest;
}
/// @notice The offchain code can use this to fetch an old config which might still be in use by some remotes. Use
@@ -177,12 +177,12 @@ contract RMNHome is OwnerIsCreator, ITypeAndVersion {
view
returns (VersionedConfig memory activeConfig, VersionedConfig memory candidateConfig)
{
- VersionedConfig memory storedActiveConfig = s_configs[getActiveIndex()];
+ VersionedConfig memory storedActiveConfig = s_configs[_getActiveIndex()];
if (storedActiveConfig.configDigest != ZERO_DIGEST) {
activeConfig = storedActiveConfig;
}
- VersionedConfig memory storedCandidateConfig = s_configs[getCandidateIndex()];
+ VersionedConfig memory storedCandidateConfig = s_configs[_getCandidateIndex()];
if (storedCandidateConfig.configDigest != ZERO_DIGEST) {
candidateConfig = storedCandidateConfig;
}
@@ -221,7 +221,7 @@ contract RMNHome is OwnerIsCreator, ITypeAndVersion {
uint32 newVersion = ++s_currentVersion;
newConfigDigest = _calculateConfigDigest(abi.encode(staticConfig), newVersion);
- VersionedConfig storage existingConfig = s_configs[getCandidateIndex()];
+ VersionedConfig storage existingConfig = s_configs[_getCandidateIndex()];
existingConfig.configDigest = newConfigDigest;
existingConfig.version = newVersion;
existingConfig.staticConfig = staticConfig;
@@ -241,7 +241,7 @@ contract RMNHome is OwnerIsCreator, ITypeAndVersion {
revert RevokingZeroDigestNotAllowed();
}
- uint256 candidateConfigIndex = getCandidateIndex();
+ uint256 candidateConfigIndex = _getCandidateIndex();
if (s_configs[candidateConfigIndex].configDigest != configDigest) {
revert ConfigDigestMismatch(s_configs[candidateConfigIndex].configDigest, configDigest);
}
@@ -264,12 +264,12 @@ contract RMNHome is OwnerIsCreator, ITypeAndVersion {
revert NoOpStateTransitionNotAllowed();
}
- uint256 candidateConfigIndex = getCandidateIndex();
+ uint256 candidateConfigIndex = _getCandidateIndex();
if (s_configs[candidateConfigIndex].configDigest != digestToPromote) {
revert ConfigDigestMismatch(s_configs[candidateConfigIndex].configDigest, digestToPromote);
}
- VersionedConfig storage activeConfig = s_configs[getActiveIndex()];
+ VersionedConfig storage activeConfig = s_configs[_getActiveIndex()];
if (activeConfig.configDigest != digestToRevoke) {
revert ConfigDigestMismatch(activeConfig.configDigest, digestToRevoke);
}
@@ -317,11 +317,11 @@ contract RMNHome is OwnerIsCreator, ITypeAndVersion {
);
}
- function getActiveIndex() private view returns (uint32) {
+ function _getActiveIndex() private view returns (uint32) {
return s_activeConfigIndex;
}
- function getCandidateIndex() private view returns (uint32) {
+ function _getCandidateIndex() private view returns (uint32) {
return s_activeConfigIndex ^ 1;
}
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
deleted file mode 100644
index 0f95d8b42c..0000000000
--- a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
+++ /dev/null
@@ -1,1532 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.24;
-
-import {CCIPConfig} from "../../capability/CCIPConfig.sol";
-import {ICapabilitiesRegistry} from "../../capability/interfaces/ICapabilitiesRegistry.sol";
-import {CCIPConfigTypes} from "../../capability/libraries/CCIPConfigTypes.sol";
-import {Internal} from "../../libraries/Internal.sol";
-import {CCIPConfigHelper} from "../helpers/CCIPConfigHelper.sol";
-import {Test} from "forge-std/Test.sol";
-
-contract CCIPConfigSetup is Test {
- address public constant OWNER = 0x82ae2B4F57CA5C1CBF8f744ADbD3697aD1a35AFe;
- address public constant CAPABILITIES_REGISTRY = 0x272aF4BF7FBFc4944Ed59F914Cd864DfD912D55e;
-
- CCIPConfigHelper public s_ccipCC;
-
- function setUp() public {
- changePrank(OWNER);
- s_ccipCC = new CCIPConfigHelper(CAPABILITIES_REGISTRY);
- }
-
- function _makeBytes32Array(uint256 length, uint256 seed) internal pure returns (bytes32[] memory arr) {
- arr = new bytes32[](length);
- for (uint256 i = 0; i < length; i++) {
- arr[i] = keccak256(abi.encode(i, 1, seed));
- }
- return arr;
- }
-
- function _makeBytesArray(uint256 length, uint256 seed) internal pure returns (bytes[] memory arr) {
- arr = new bytes[](length);
- for (uint256 i = 0; i < length; i++) {
- arr[i] = abi.encode(keccak256(abi.encode(i, 1, seed)));
- }
- return arr;
- }
-
- function _subset(bytes32[] memory arr, uint256 start, uint256 end) internal pure returns (bytes32[] memory) {
- bytes32[] memory subset = new bytes32[](end - start);
- for (uint256 i = start; i < end; i++) {
- subset[i - start] = arr[i];
- }
- return subset;
- }
-
- function _addChainConfig(uint256 numNodes) internal returns (CCIPConfigTypes.OCR3Node[] memory nodes) {
- return _addChainConfig(numNodes, 1);
- }
-
- function _addChainConfig(uint256 numNodes, uint8 fChain) internal returns (CCIPConfigTypes.OCR3Node[] memory nodes) {
- bytes32[] memory p2pIds = _makeBytes32Array(numNodes, 0);
- bytes[] memory signers = _makeBytesArray(numNodes, 10);
- bytes[] memory transmitters = _makeBytesArray(numNodes, 20);
-
- nodes = new CCIPConfigTypes.OCR3Node[](numNodes);
-
- for (uint256 i = 0; i < numNodes; i++) {
- nodes[i] = CCIPConfigTypes.OCR3Node({p2pId: p2pIds[i], signerKey: signers[i], transmitterKey: transmitters[i]});
-
- vm.mockCall(
- CAPABILITIES_REGISTRY,
- abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, p2pIds[i]),
- abi.encode(
- ICapabilitiesRegistry.NodeInfo({
- nodeOperatorId: 1,
- signer: bytes32(signers[i]),
- p2pId: p2pIds[i],
- hashedCapabilityIds: new bytes32[](0),
- configCount: uint32(1),
- workflowDONId: uint32(1),
- capabilitiesDONIds: new uint256[](0)
- })
- )
- );
- }
- // Add chain selector for chain 1.
- CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](1);
- adds[0] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 1,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: p2pIds, fChain: fChain, config: bytes("config1")})
- });
-
- vm.expectEmit();
- emit CCIPConfig.ChainConfigSet(1, adds[0].chainConfig);
- s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds);
-
- return nodes;
- }
-
- function _constructNodesArray(
- bytes32[] memory p2pIds,
- bytes[] memory signers,
- bytes[] memory transmitters
- ) internal pure returns (CCIPConfigTypes.OCR3Node[] memory nodes) {
- nodes = new CCIPConfigTypes.OCR3Node[](p2pIds.length);
-
- for (uint256 i = 0; i < p2pIds.length; i++) {
- nodes[i] = CCIPConfigTypes.OCR3Node({p2pId: p2pIds[i], signerKey: signers[i], transmitterKey: transmitters[i]});
- }
-
- return nodes;
- }
-
- function _assertOCR3ConfigWithMetaEqual(
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory a,
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory b
- ) internal pure {
- assertEq(a.length, b.length, "OCR3ConfigWithMeta lengths do no match");
- for (uint256 i = 0; i < a.length; ++i) {
- _assertOCR3ConfigEqual(a[i].config, b[i].config);
- assertEq(a[i].configCount, b[i].configCount, "configCount must match");
- assertEq(a[i].configDigest, b[i].configDigest, "configDigest must match");
- }
- }
-
- function _assertOCR3ConfigEqual(
- CCIPConfigTypes.OCR3Config memory a,
- CCIPConfigTypes.OCR3Config memory b
- ) internal pure {
- assertEq(uint8(a.pluginType), uint8(b.pluginType), "pluginType must match");
- assertEq(a.chainSelector, b.chainSelector, "chainSelector must match");
- assertEq(a.FRoleDON, b.FRoleDON, "FRoleDON must match");
- assertEq(a.offchainConfigVersion, b.offchainConfigVersion, "offchainConfigVersion must match");
- assertEq(a.offrampAddress, b.offrampAddress, "offrampAddress must match");
- assertEq(a.rmnHomeAddress, b.rmnHomeAddress, "rmnHomeAddress must match");
- assertEq(a.nodes.length, b.nodes.length, "nodes length must match");
- assertEq(a.offchainConfig, b.offchainConfig, "offchainConfig must match");
-
- for (uint256 i = 0; i < a.nodes.length; ++i) {
- assertEq(a.nodes[i].p2pId, b.nodes[i].p2pId, "p2pId must match");
- assertEq(a.nodes[i].signerKey, b.nodes[i].signerKey, "signerKey must match");
- assertEq(a.nodes[i].transmitterKey, b.nodes[i].transmitterKey, "transmitterKey must match");
- }
- }
-
- function test_getCapabilityConfiguration_Success() public view {
- bytes memory capConfig = s_ccipCC.getCapabilityConfiguration(42 /* doesn't matter, not used */ );
- assertEq(capConfig.length, 0, "capability config length must be 0");
- }
-}
-
-contract CCIPConfig_constructor is Test {
- // Successes.
-
- function test_constructor_Success() public {
- address capabilitiesRegistry = makeAddr("capabilitiesRegistry");
- CCIPConfigHelper ccipCC = new CCIPConfigHelper(capabilitiesRegistry);
- assertEq(address(ccipCC.getCapabilityRegistry()), capabilitiesRegistry);
- assertEq(ccipCC.typeAndVersion(), "CCIPConfig 1.6.0-dev");
- }
-
- // Reverts.
-
- function test_constructor_ZeroAddressNotAllowed_Revert() public {
- vm.expectRevert(CCIPConfig.ZeroAddressNotAllowed.selector);
- new CCIPConfigHelper(address(0));
- }
-}
-
-contract CCIPConfig_chainConfig is CCIPConfigSetup {
- // Successes.
- function test_applyChainConfigUpdates_addChainConfigs_Success() public {
- bytes32[] memory chainReaders = new bytes32[](1);
- chainReaders[0] = keccak256(abi.encode(1));
- CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](2);
- adds[0] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 1,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")})
- });
- adds[1] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 2,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")})
- });
- vm.mockCall(
- CAPABILITIES_REGISTRY,
- abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
- abi.encode(
- ICapabilitiesRegistry.NodeInfo({
- nodeOperatorId: 1,
- signer: bytes32(uint256(1)),
- p2pId: chainReaders[0],
- hashedCapabilityIds: new bytes32[](0),
- configCount: uint32(1),
- workflowDONId: uint32(1),
- capabilitiesDONIds: new uint256[](0)
- })
- )
- );
- vm.expectEmit();
- emit CCIPConfig.ChainConfigSet(1, adds[0].chainConfig);
- vm.expectEmit();
- emit CCIPConfig.ChainConfigSet(2, adds[1].chainConfig);
- s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds);
-
- CCIPConfigTypes.ChainConfigInfo[] memory configs = s_ccipCC.getAllChainConfigs(0, 2);
- assertEq(configs.length, 2, "chain configs length must be 2");
- assertEq(configs[0].chainSelector, 1, "chain selector must match");
- assertEq(configs[1].chainSelector, 2, "chain selector must match");
- assertEq(s_ccipCC.getNumChainConfigurations(), 2, "total chain configs must be 2");
- }
-
- function test_getPaginatedCCIPConfigs_Success() public {
- bytes32[] memory chainReaders = new bytes32[](1);
- chainReaders[0] = keccak256(abi.encode(1));
- CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](2);
- adds[0] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 1,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")})
- });
- adds[1] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 2,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")})
- });
- vm.mockCall(
- CAPABILITIES_REGISTRY,
- abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
- abi.encode(
- ICapabilitiesRegistry.NodeInfo({
- nodeOperatorId: 1,
- signer: bytes32(uint256(1)),
- p2pId: chainReaders[0],
- hashedCapabilityIds: new bytes32[](0),
- configCount: uint32(1),
- workflowDONId: uint32(1),
- capabilitiesDONIds: new uint256[](0)
- })
- )
- );
-
- s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds);
-
- CCIPConfigTypes.ChainConfigInfo[] memory configs = s_ccipCC.getAllChainConfigs(0, 2);
- assertEq(configs.length, 2, "chain configs length must be 2");
- assertEq(configs[0].chainSelector, 1, "chain selector must match");
- assertEq(configs[1].chainSelector, 2, "chain selector must match");
-
- configs = s_ccipCC.getAllChainConfigs(0, 1);
- assertEq(configs.length, 1, "chain configs length must be 1");
- assertEq(configs[0].chainSelector, 1, "chain selector must match");
-
- configs = s_ccipCC.getAllChainConfigs(0, 10);
- assertEq(configs.length, 2, "chain configs length must be 2");
- assertEq(configs[0].chainSelector, 1, "chain selector must match");
- assertEq(configs[1].chainSelector, 2, "chain selector must match");
-
- configs = s_ccipCC.getAllChainConfigs(1, 1);
- assertEq(configs.length, 1, "chain configs length must be 1");
-
- configs = s_ccipCC.getAllChainConfigs(1, 2);
- assertEq(configs.length, 0, "chain configs length must be 0");
- }
-
- function test_applyChainConfigUpdates_removeChainConfigs_Success() public {
- bytes32[] memory chainReaders = new bytes32[](1);
- chainReaders[0] = keccak256(abi.encode(1));
- CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](2);
- adds[0] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 1,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")})
- });
- adds[1] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 2,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")})
- });
-
- vm.mockCall(
- CAPABILITIES_REGISTRY,
- abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
- abi.encode(
- ICapabilitiesRegistry.NodeInfo({
- nodeOperatorId: 1,
- signer: bytes32(uint256(1)),
- p2pId: chainReaders[0],
- hashedCapabilityIds: new bytes32[](0),
- configCount: uint32(1),
- workflowDONId: uint32(1),
- capabilitiesDONIds: new uint256[](0)
- })
- )
- );
-
- vm.expectEmit();
- emit CCIPConfig.ChainConfigSet(1, adds[0].chainConfig);
- vm.expectEmit();
- emit CCIPConfig.ChainConfigSet(2, adds[1].chainConfig);
- s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds);
-
- assertEq(s_ccipCC.getNumChainConfigurations(), 2, "total chain configs must be 2");
-
- uint64[] memory removes = new uint64[](1);
- removes[0] = uint64(1);
-
- vm.expectEmit();
- emit CCIPConfig.ChainConfigRemoved(1);
- s_ccipCC.applyChainConfigUpdates(removes, new CCIPConfigTypes.ChainConfigInfo[](0));
-
- assertEq(s_ccipCC.getNumChainConfigurations(), 1, "total chain configs must be 1");
- }
-
- // Reverts.
-
- function test_applyChainConfigUpdates_selectorNotFound_Reverts() public {
- uint64[] memory removes = new uint64[](1);
- removes[0] = uint64(1);
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.ChainSelectorNotFound.selector, 1));
- s_ccipCC.applyChainConfigUpdates(removes, new CCIPConfigTypes.ChainConfigInfo[](0));
- }
-
- function test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() public {
- bytes32[] memory chainReaders = new bytes32[](1);
- chainReaders[0] = keccak256(abi.encode(1));
- CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](1);
- adds[0] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 1,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: abi.encode(1, 2, 3)})
- });
-
- vm.mockCall(
- CAPABILITIES_REGISTRY,
- abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
- abi.encode(
- ICapabilitiesRegistry.NodeInfo({
- nodeOperatorId: 0,
- signer: bytes32(0),
- p2pId: bytes32(uint256(0)),
- hashedCapabilityIds: new bytes32[](0),
- configCount: uint32(1),
- workflowDONId: uint32(1),
- capabilitiesDONIds: new uint256[](0)
- })
- )
- );
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NodeNotInRegistry.selector, chainReaders[0]));
- s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds);
- }
-
- function test__applyChainConfigUpdates_FChainNotPositive_Reverts() public {
- bytes32[] memory chainReaders = new bytes32[](1);
- chainReaders[0] = keccak256(abi.encode(1));
- CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](2);
- adds[0] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 1,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")})
- });
- adds[1] = CCIPConfigTypes.ChainConfigInfo({
- chainSelector: 2,
- chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 0, config: bytes("config2")}) // bad fChain
- });
-
- vm.mockCall(
- CAPABILITIES_REGISTRY,
- abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
- abi.encode(
- ICapabilitiesRegistry.NodeInfo({
- nodeOperatorId: 1,
- signer: bytes32(uint256(1)),
- p2pId: chainReaders[0],
- hashedCapabilityIds: new bytes32[](0),
- configCount: uint32(1),
- workflowDONId: uint32(1),
- capabilitiesDONIds: new uint256[](0)
- })
- )
- );
-
- vm.expectRevert(CCIPConfig.FChainMustBePositive.selector);
- s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds);
- }
-}
-
-contract CCIPConfig_validateConfig is CCIPConfigSetup {
- function _getCorrectOCR3Config(uint8 numNodes, uint8 FRoleDON) internal returns (CCIPConfigTypes.OCR3Config memory) {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(numNodes);
-
- return CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: FRoleDON,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
- }
-
- function _getCorrectOCR3Config() internal returns (CCIPConfigTypes.OCR3Config memory) {
- return _getCorrectOCR3Config(4, 1);
- }
-
- // Successes.
-
- function test__validateConfig_Success() public {
- s_ccipCC.validateConfig(_getCorrectOCR3Config());
- }
-
- function test__validateConfigLessTransmittersThanSigners_Success() public {
- // fChain is 1, so there should be at least 4 transmitters.
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(5, 1);
- config.nodes[1].transmitterKey = bytes("");
-
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfigSmallerFChain_Success() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(11, 3);
-
- // Set fChain to 2
- _addChainConfig(4, 2);
-
- s_ccipCC.validateConfig(config);
- }
-
- // Reverts.
-
- function test__validateConfig_ChainSelectorNotSet_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.chainSelector = 0; // invalid
-
- vm.expectRevert(CCIPConfig.ChainSelectorNotSet.selector);
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_OfframpAddressCannotBeZero_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.offrampAddress = ""; // invalid
-
- vm.expectRevert(CCIPConfig.OfframpAddressCannotBeZero.selector);
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.offrampAddress = abi.encode(address(0)); // invalid
-
- vm.expectRevert(CCIPConfig.OfframpAddressCannotBeZero.selector);
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.rmnHomeAddress = ""; // invalid
-
- vm.expectRevert(CCIPConfig.RMNHomeAddressCannotBeZero.selector);
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.rmnHomeAddress = abi.encode(address(0)); // invalid
-
- vm.expectRevert(CCIPConfig.RMNHomeAddressCannotBeZero.selector);
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_ChainSelectorNotFound_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.chainSelector = 2; // not set
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.ChainSelectorNotFound.selector, 2));
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_NotEnoughTransmitters_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- uint256 numberOfTransmitters = 3;
-
- // 32 > 31 (max num oracles)
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(31);
-
- // truncate transmitters to < 3 * fChain + 1
- // since fChain is 1 in this case, we need to truncate to 3 transmitters.
- for (uint256 i = numberOfTransmitters; i < nodes.length; ++i) {
- nodes[i].transmitterKey = bytes("");
- }
-
- config.nodes = nodes;
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NotEnoughTransmitters.selector, numberOfTransmitters, 4));
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.nodes[0].transmitterKey = bytes("");
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NotEnoughTransmitters.selector, 3, 4));
- s_ccipCC.validateConfig(config);
-
- // Zero out remaining transmitters to verify error changes
- for (uint256 i = 1; i < config.nodes.length; ++i) {
- config.nodes[i].transmitterKey = bytes("");
- }
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NotEnoughTransmitters.selector, 0, 4));
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_TooManySigners_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.nodes = new CCIPConfigTypes.OCR3Node[](257);
-
- vm.expectRevert(CCIPConfig.TooManySigners.selector);
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_FChainTooHigh_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.FRoleDON = 2; // too low
-
- // Set fChain to 3
- _addChainConfig(4, 3);
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.FChainTooHigh.selector, 3, 2));
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_FMustBePositive_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.FRoleDON = 0; // not positive
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.FChainTooHigh.selector, 1, 0));
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_FTooHigh_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.FRoleDON = 2; // too high
-
- vm.expectRevert(CCIPConfig.FTooHigh.selector);
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_ZeroP2PId_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.nodes[1].p2pId = bytes32(0);
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.InvalidNode.selector, config.nodes[1]));
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_ZeroSignerKey_Reverts() public {
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.nodes[2].signerKey = bytes("");
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.InvalidNode.selector, config.nodes[2]));
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_NodeNotInRegistry_Reverts() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- bytes32 nonExistentP2PId = keccak256("notInRegistry");
- nodes[0].p2pId = nonExistentP2PId;
-
- vm.mockCall(
- CAPABILITIES_REGISTRY,
- abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, nonExistentP2PId),
- abi.encode(
- ICapabilitiesRegistry.NodeInfo({
- nodeOperatorId: 0,
- signer: bytes32(0),
- p2pId: bytes32(uint256(0)),
- hashedCapabilityIds: new bytes32[](0),
- configCount: uint32(1),
- workflowDONId: uint32(1),
- capabilitiesDONIds: new uint256[](0)
- })
- )
- );
- CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- config.nodes = nodes;
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NodeNotInRegistry.selector, nonExistentP2PId));
- s_ccipCC.validateConfig(config);
- }
-}
-
-contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
- // Successful cases.
-
- function test__stateFromConfigLength_Success() public view {
- uint256 configLen = 0;
- CCIPConfigTypes.ConfigState state = s_ccipCC.stateFromConfigLength(configLen);
- assertEq(uint256(state), uint256(CCIPConfigTypes.ConfigState.Init));
-
- configLen = 1;
- state = s_ccipCC.stateFromConfigLength(configLen);
- assertEq(uint256(state), uint256(CCIPConfigTypes.ConfigState.Running));
-
- configLen = 2;
- state = s_ccipCC.stateFromConfigLength(configLen);
- assertEq(uint256(state), uint256(CCIPConfigTypes.ConfigState.Staging));
- }
-
- function test__validateConfigStateTransition_Success() public view {
- s_ccipCC.validateConfigStateTransition(CCIPConfigTypes.ConfigState.Init, CCIPConfigTypes.ConfigState.Running);
-
- s_ccipCC.validateConfigStateTransition(CCIPConfigTypes.ConfigState.Running, CCIPConfigTypes.ConfigState.Staging);
-
- s_ccipCC.validateConfigStateTransition(CCIPConfigTypes.ConfigState.Staging, CCIPConfigTypes.ConfigState.Running);
- }
-
- function test__computeConfigDigest_Success() public view {
- // config digest must change upon:
- // - ocr config change (e.g plugin type, chain selector, etc.)
- // - don id change
- // - config count change
- bytes32[] memory p2pIds = _makeBytes32Array(4, 0);
- bytes[] memory signers = _makeBytesArray(4, 10);
- bytes[] memory transmitters = _makeBytesArray(4, 20);
-
- CCIPConfigTypes.OCR3Node[] memory nodes = new CCIPConfigTypes.OCR3Node[](4);
- for (uint256 i = 0; i < 4; ++i) {
- nodes[i] = CCIPConfigTypes.OCR3Node({p2pId: p2pIds[i], signerKey: signers[i], transmitterKey: transmitters[i]});
- }
-
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
- uint32 donId = 1;
- uint32 configCount = 1;
-
- bytes32 configDigest1 = s_ccipCC.computeConfigDigest(donId, configCount, config);
-
- donId = 2;
- bytes32 configDigest2 = s_ccipCC.computeConfigDigest(donId, configCount, config);
-
- donId = 1;
- configCount = 2;
- bytes32 configDigest3 = s_ccipCC.computeConfigDigest(donId, configCount, config);
-
- configCount = 1;
- config.pluginType = Internal.OCRPluginType.Execution;
- bytes32 configDigest4 = s_ccipCC.computeConfigDigest(donId, configCount, config);
-
- assertNotEq(configDigest1, configDigest2, "config digests 1 and 2 must not match");
- assertNotEq(configDigest1, configDigest3, "config digests 1 and 3 must not match");
- assertNotEq(configDigest1, configDigest4, "config digests 1 and 4 must not match");
-
- assertNotEq(configDigest2, configDigest3, "config digests 2 and 3 must not match");
- assertNotEq(configDigest2, configDigest4, "config digests 2 and 4 must not match");
- }
-
- function test_Fuzz__groupByPluginType_Success(uint256 numCommitCfgs, uint256 numExecCfgs) public view {
- numCommitCfgs = bound(numCommitCfgs, 0, 2);
- numExecCfgs = bound(numExecCfgs, 0, 2);
-
- bytes32[] memory p2pIds = _makeBytes32Array(4, 0);
- bytes[] memory signers = _makeBytesArray(4, 10);
- bytes[] memory transmitters = _makeBytesArray(4, 20);
- CCIPConfigTypes.OCR3Node[] memory nodes = new CCIPConfigTypes.OCR3Node[](4);
- for (uint256 i = 0; i < 4; ++i) {
- nodes[i] = CCIPConfigTypes.OCR3Node({p2pId: p2pIds[i], signerKey: signers[i], transmitterKey: transmitters[i]});
- }
-
- CCIPConfigTypes.OCR3Config[] memory cfgs = new CCIPConfigTypes.OCR3Config[](numCommitCfgs + numExecCfgs);
- for (uint256 i = 0; i < numCommitCfgs; i++) {
- cfgs[i] = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: abi.encode("commit", i)
- });
- }
- for (uint256 i = 0; i < numExecCfgs; i++) {
- cfgs[numCommitCfgs + i] = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Execution,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: abi.encode("exec", numCommitCfgs + i)
- });
- }
- (CCIPConfigTypes.OCR3Config[] memory commitCfgs, CCIPConfigTypes.OCR3Config[] memory execCfgs) =
- s_ccipCC.groupByPluginType(cfgs);
-
- assertEq(commitCfgs.length, numCommitCfgs, "commitCfgs length must match");
- assertEq(execCfgs.length, numExecCfgs, "execCfgs length must match");
- for (uint256 i = 0; i < commitCfgs.length; i++) {
- assertEq(uint8(commitCfgs[i].pluginType), uint8(Internal.OCRPluginType.Commit), "plugin type must be commit");
- assertEq(commitCfgs[i].offchainConfig, abi.encode("commit", i), "offchain config must match");
- }
- for (uint256 i = 0; i < execCfgs.length; i++) {
- assertEq(uint8(execCfgs[i].pluginType), uint8(Internal.OCRPluginType.Execution), "plugin type must be execution");
- assertEq(execCfgs[i].offchainConfig, abi.encode("exec", numCommitCfgs + i), "offchain config must match");
- }
- }
-
- function test__computeNewConfigWithMeta_InitToRunning_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- uint32 donId = 1;
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](0);
- CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](1);
- newConfig[0] = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.ConfigState currentState = CCIPConfigTypes.ConfigState.Init;
- CCIPConfigTypes.ConfigState newState = CCIPConfigTypes.ConfigState.Running;
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta =
- s_ccipCC.computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, newState);
- assertEq(newConfigWithMeta.length, 1, "new config with meta length must be 1");
- assertEq(newConfigWithMeta[0].configCount, uint64(1), "config count must be 1");
- assertEq(uint8(newConfigWithMeta[0].config.pluginType), uint8(newConfig[0].pluginType), "plugin type must match");
- assertEq(newConfigWithMeta[0].config.offchainConfig, newConfig[0].offchainConfig, "offchain config must match");
- assertEq(
- newConfigWithMeta[0].configDigest,
- s_ccipCC.computeConfigDigest(donId, 1, newConfig[0]),
- "config digest must match"
- );
-
- // This ensures that the test case is using correct inputs.
- s_ccipCC.validateConfigTransition(currentConfig, newConfigWithMeta);
- }
-
- function test__computeNewConfigWithMeta_RunningToStaging_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
-
- CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](2);
- // existing blue config first.
- newConfig[0] = blueConfig;
- // green config next.
- newConfig[1] = greenConfig;
-
- CCIPConfigTypes.ConfigState currentState = CCIPConfigTypes.ConfigState.Running;
- CCIPConfigTypes.ConfigState newState = CCIPConfigTypes.ConfigState.Staging;
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta =
- s_ccipCC.computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, newState);
- assertEq(newConfigWithMeta.length, 2, "new config with meta length must be 2");
-
- assertEq(newConfigWithMeta[0].configCount, uint64(1), "config count of blue must be 1");
- assertEq(
- uint8(newConfigWithMeta[0].config.pluginType), uint8(blueConfig.pluginType), "plugin type of blue must match"
- );
- assertEq(
- newConfigWithMeta[0].config.offchainConfig, blueConfig.offchainConfig, "offchain config of blue must match"
- );
- assertEq(
- newConfigWithMeta[0].configDigest,
- s_ccipCC.computeConfigDigest(donId, 1, blueConfig),
- "config digest of blue must match"
- );
-
- assertEq(newConfigWithMeta[1].configCount, uint64(2), "config count of green must be 2");
- assertEq(
- uint8(newConfigWithMeta[1].config.pluginType), uint8(greenConfig.pluginType), "plugin type of green must match"
- );
- assertEq(
- newConfigWithMeta[1].config.offchainConfig, greenConfig.offchainConfig, "offchain config of green must match"
- );
- assertEq(
- newConfigWithMeta[1].configDigest,
- s_ccipCC.computeConfigDigest(donId, 2, greenConfig),
- "config digest of green must match"
- );
-
- // This ensures that the test case is using correct inputs.
- s_ccipCC.validateConfigTransition(currentConfig, newConfigWithMeta);
- }
-
- function test__computeNewConfigWithMeta_StagingToRunning_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2);
- currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- currentConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 2,
- config: greenConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- });
- CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](1);
- newConfig[0] = greenConfig;
-
- CCIPConfigTypes.ConfigState currentState = CCIPConfigTypes.ConfigState.Staging;
- CCIPConfigTypes.ConfigState newState = CCIPConfigTypes.ConfigState.Running;
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta =
- s_ccipCC.computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, newState);
-
- assertEq(newConfigWithMeta.length, 1, "new config with meta length must be 1");
- assertEq(newConfigWithMeta[0].configCount, uint64(2), "config count must be 2");
- assertEq(uint8(newConfigWithMeta[0].config.pluginType), uint8(greenConfig.pluginType), "plugin type must match");
- assertEq(newConfigWithMeta[0].config.offchainConfig, greenConfig.offchainConfig, "offchain config must match");
- assertEq(
- newConfigWithMeta[0].configDigest, s_ccipCC.computeConfigDigest(donId, 2, greenConfig), "config digest must match"
- );
-
- // This ensures that the test case is using correct inputs.
- s_ccipCC.validateConfigTransition(currentConfig, newConfigWithMeta);
- }
-
- function test__validateConfigTransition_InitToRunning_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](0);
-
- s_ccipCC.validateConfigTransition(currentConfig, newConfig);
- }
-
- function test__validateConfigTransition_RunningToStaging_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2);
- newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- newConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 2,
- config: greenConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
-
- s_ccipCC.validateConfigTransition(currentConfig, newConfig);
- }
-
- function test__validateConfigTransition_StagingToRunning_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2);
- currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- currentConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 2,
- config: greenConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 2,
- config: greenConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- });
-
- s_ccipCC.validateConfigTransition(currentConfig, newConfig);
- }
-
- // Reverts.
-
- function test_Fuzz__stateFromConfigLength_Reverts(uint256 configLen) public {
- vm.assume(configLen > 2);
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.InvalidConfigLength.selector, configLen));
- s_ccipCC.stateFromConfigLength(configLen);
- }
-
- function test__groupByPluginType_threeCommitConfigs_Reverts() public {
- bytes32[] memory p2pIds = _makeBytes32Array(4, 0);
- bytes[] memory signers = _makeBytesArray(4, 10);
- bytes[] memory transmitters = _makeBytesArray(4, 20);
- CCIPConfigTypes.OCR3Config[] memory cfgs = new CCIPConfigTypes.OCR3Config[](3);
- for (uint256 i = 0; i < 3; i++) {
- cfgs[i] = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(p2pIds, signers, transmitters),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: abi.encode("commit", i)
- });
- }
- vm.expectRevert();
- s_ccipCC.groupByPluginType(cfgs);
- }
-
- function test__groupByPluginType_threeExecutionConfigs_Reverts() public {
- bytes32[] memory p2pIds = _makeBytes32Array(4, 0);
- bytes[] memory signers = _makeBytesArray(4, 10);
- bytes[] memory transmitters = _makeBytesArray(4, 20);
- CCIPConfigTypes.OCR3Config[] memory cfgs = new CCIPConfigTypes.OCR3Config[](3);
- for (uint256 i = 0; i < 3; i++) {
- cfgs[i] = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Execution,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(p2pIds, signers, transmitters),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: abi.encode("exec", i)
- });
- }
- vm.expectRevert();
- s_ccipCC.groupByPluginType(cfgs);
- }
-
- function test__groupByPluginType_TooManyOCR3Configs_Reverts() public {
- CCIPConfigTypes.OCR3Config[] memory cfgs = new CCIPConfigTypes.OCR3Config[](5);
- vm.expectRevert(CCIPConfig.TooManyOCR3Configs.selector);
- s_ccipCC.groupByPluginType(cfgs);
- }
-
- function test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() public {
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
- // p2pIds: _makeBytes32Array(4, 0),
- // signers: _makeBytesArray(4, 10),
- // transmitters: _makeBytesArray(4, 20),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 0,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](0);
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.WrongConfigCount.selector, 0, 1));
- s_ccipCC.validateConfigTransition(currentConfig, newConfig);
- }
-
- function test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() public {
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
- // p2pIds: _makeBytes32Array(4, 0),
- // signers: _makeBytesArray(4, 10),
- // transmitters: _makeBytesArray(4, 20),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2);
- newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 3, blueConfig) // wrong config digest (due to diff config count)
- });
- newConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 2,
- config: greenConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- });
-
- vm.expectRevert(
- abi.encodeWithSelector(
- CCIPConfig.WrongConfigDigestBlueGreen.selector,
- s_ccipCC.computeConfigDigest(donId, 3, blueConfig),
- s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- )
- );
- s_ccipCC.validateConfigTransition(currentConfig, newConfig);
- }
-
- function test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() public {
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2);
- newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- newConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 3, // wrong config count
- config: greenConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 3, greenConfig)
- });
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.WrongConfigCount.selector, 3, 2));
- s_ccipCC.validateConfigTransition(currentConfig, newConfig);
- }
-
- function test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() public {
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: _constructNodesArray(_makeBytes32Array(4, 0), _makeBytesArray(4, 10), _makeBytesArray(4, 20)),
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2);
- currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 1,
- config: blueConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- currentConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 2,
- config: greenConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- });
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- configCount: 2,
- config: greenConfig,
- configDigest: s_ccipCC.computeConfigDigest(donId, 3, greenConfig) // wrong config digest
- });
-
- vm.expectRevert(
- abi.encodeWithSelector(
- CCIPConfig.WrongConfigDigest.selector,
- s_ccipCC.computeConfigDigest(donId, 3, greenConfig),
- s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- )
- );
- s_ccipCC.validateConfigTransition(currentConfig, newConfig);
- }
-
- function test__validateConfigTransition_NonExistentConfigTransition_Reverts() public {
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](3);
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- vm.expectRevert(CCIPConfig.NonExistentConfigTransition.selector);
- s_ccipCC.validateConfigTransition(currentConfig, newConfig);
- }
-}
-
-contract CCIPConfig_updatePluginConfig is CCIPConfigSetup {
- // Successes.
-
- function test_updatePluginConfig_InitToRunning_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](1);
- configs[0] = blueConfig;
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory expectedConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1);
- expectedConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- config: blueConfig,
- configCount: 1,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
-
- vm.expectEmit();
- emit CCIPConfig.ConfigSet(donId, uint8(Internal.OCRPluginType.Commit), expectedConfig);
- s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, configs);
-
- // should see the updated config in the contract state.
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfig =
- s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit);
-
- _assertOCR3ConfigWithMetaEqual(storedConfig, expectedConfig);
- }
-
- function test_updatePluginConfig_RunningToStaging_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- // add blue config.
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config[] memory startConfigs = new CCIPConfigTypes.OCR3Config[](1);
- startConfigs[0] = blueConfig;
-
- // add blue AND green config to indicate an update.
- s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, startConfigs);
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
- CCIPConfigTypes.OCR3Config[] memory blueAndGreen = new CCIPConfigTypes.OCR3Config[](2);
- blueAndGreen[0] = blueConfig;
- blueAndGreen[1] = greenConfig;
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory expectedConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2);
- expectedConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- config: blueConfig,
- configCount: 1,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- expectedConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({
- config: greenConfig,
- configCount: 2,
- configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- });
-
- vm.expectEmit();
- emit CCIPConfig.ConfigSet(donId, uint8(Internal.OCRPluginType.Commit), expectedConfig);
-
- s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, blueAndGreen);
-
- // should see the updated config in the contract state.
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfig =
- s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit);
-
- _assertOCR3ConfigWithMetaEqual(storedConfig, expectedConfig);
- }
-
- function test_updatePluginConfig_StagingToRunning_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- // add blue config.
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config[] memory startConfigs = new CCIPConfigTypes.OCR3Config[](1);
- startConfigs[0] = blueConfig;
-
- // add blue AND green config to indicate an update.
- s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, startConfigs);
- CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit-new")
- });
- CCIPConfigTypes.OCR3Config[] memory blueAndGreen = new CCIPConfigTypes.OCR3Config[](2);
- blueAndGreen[0] = blueConfig;
- blueAndGreen[1] = greenConfig;
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory expectedConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2);
- expectedConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({
- config: blueConfig,
- configCount: 1,
- configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig)
- });
- expectedConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({
- config: greenConfig,
- configCount: 2,
- configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig)
- });
-
- vm.expectEmit();
- emit CCIPConfig.ConfigSet(donId, uint8(Internal.OCRPluginType.Commit), expectedConfig);
-
- s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, blueAndGreen);
-
- // should see the updated config in the contract state.
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfig =
- s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit);
-
- _assertOCR3ConfigWithMetaEqual(storedConfig, expectedConfig);
- }
-
- // Reverts.
- function test__updatePluginConfig_InvalidConfigLength_Reverts() public {
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](3);
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.InvalidConfigLength.selector, uint256(3)));
- s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, newConfig);
- }
-
- function test__updatePluginConfig_InvalidConfigStateTransition_Reverts() public {
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](2);
- // 0 -> 2 is an invalid state transition.
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.InvalidConfigStateTransition.selector, 0, 2));
- s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, newConfig);
- }
-}
-
-contract CCIPConfig_beforeCapabilityConfigSet is CCIPConfigSetup {
- // Successes.
- function test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() public {
- changePrank(CAPABILITIES_REGISTRY);
-
- CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](0);
- bytes memory encodedConfigs = abi.encode(configs);
- s_ccipCC.beforeCapabilityConfigSet(new bytes32[](0), encodedConfigs, 1, 1);
- }
-
- function test_beforeCapabilityConfigSet_CommitConfigOnly_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- changePrank(CAPABILITIES_REGISTRY);
-
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](1);
- configs[0] = blueConfig;
-
- bytes memory encoded = abi.encode(configs);
- s_ccipCC.beforeCapabilityConfigSet(new bytes32[](0), encoded, 1, donId);
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfigs =
- s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit);
- assertEq(storedConfigs.length, 1, "config length must be 1");
- assertEq(storedConfigs[0].configCount, uint64(1), "config count must be 1");
- assertEq(
- uint256(storedConfigs[0].config.pluginType), uint256(Internal.OCRPluginType.Commit), "plugin type must be commit"
- );
- }
-
- function test_beforeCapabilityConfigSet_ExecConfigOnly_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- changePrank(CAPABILITIES_REGISTRY);
-
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Execution,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("exec")
- });
- CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](1);
- configs[0] = blueConfig;
-
- bytes memory encoded = abi.encode(configs);
- s_ccipCC.beforeCapabilityConfigSet(new bytes32[](0), encoded, 1, donId);
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfigs =
- s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Execution);
- assertEq(storedConfigs.length, 1, "config length must be 1");
- assertEq(storedConfigs[0].configCount, uint64(1), "config count must be 1");
- assertEq(
- uint256(storedConfigs[0].config.pluginType),
- uint256(Internal.OCRPluginType.Execution),
- "plugin type must be execution"
- );
- }
-
- function test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() public {
- CCIPConfigTypes.OCR3Node[] memory nodes = _addChainConfig(4);
- changePrank(CAPABILITIES_REGISTRY);
-
- uint32 donId = 1;
- CCIPConfigTypes.OCR3Config memory blueCommitConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("commit")
- });
- CCIPConfigTypes.OCR3Config memory blueExecConfig = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Execution,
- offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
- rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
- chainSelector: 1,
- nodes: nodes,
- FRoleDON: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("exec")
- });
- CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](2);
- configs[0] = blueExecConfig;
- configs[1] = blueCommitConfig;
-
- bytes memory encoded = abi.encode(configs);
- s_ccipCC.beforeCapabilityConfigSet(new bytes32[](0), encoded, 1, donId);
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedExecConfigs =
- s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Execution);
- assertEq(storedExecConfigs.length, 1, "config length must be 1");
- assertEq(storedExecConfigs[0].configCount, uint64(1), "config count must be 1");
- assertEq(
- uint256(storedExecConfigs[0].config.pluginType),
- uint256(Internal.OCRPluginType.Execution),
- "plugin type must be execution"
- );
-
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedCommitConfigs =
- s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit);
- assertEq(storedCommitConfigs.length, 1, "config length must be 1");
- assertEq(storedCommitConfigs[0].configCount, uint64(1), "config count must be 1");
- assertEq(
- uint256(storedCommitConfigs[0].config.pluginType),
- uint256(Internal.OCRPluginType.Commit),
- "plugin type must be commit"
- );
- }
-
- // Reverts.
-
- function test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_Reverts() public {
- bytes32[] memory nodes = new bytes32[](0);
- bytes memory config = bytes("");
- uint64 configCount = 1;
- uint32 donId = 1;
- vm.expectRevert(CCIPConfig.OnlyCapabilitiesRegistryCanCall.selector);
- s_ccipCC.beforeCapabilityConfigSet(nodes, config, configCount, donId);
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol
new file mode 100644
index 0000000000..1b91191cc0
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol
@@ -0,0 +1,932 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.24;
+
+import {ICapabilityConfiguration} from "../../../keystone/interfaces/ICapabilityConfiguration.sol";
+import {ICapabilitiesRegistry} from "../../interfaces/ICapabilitiesRegistry.sol";
+
+import {CCIPHome} from "../../capability/CCIPHome.sol";
+import {Internal} from "../../libraries/Internal.sol";
+import {CCIPHomeHelper} from "../helpers/CCIPHomeHelper.sol";
+import {Test} from "forge-std/Test.sol";
+import {Vm} from "forge-std/Vm.sol";
+
+import {IERC165} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/interfaces/IERC165.sol";
+
+contract CCIPHomeTest is Test {
+ // address internal constant OWNER = address(0x0000000123123123123);
+ bytes32 internal constant ZERO_DIGEST = bytes32(uint256(0));
+ address internal constant CAPABILITIES_REGISTRY = address(0x0000000123123123123);
+ Internal.OCRPluginType internal constant DEFAULT_PLUGIN_TYPE = Internal.OCRPluginType.Commit;
+ uint32 internal constant DEFAULT_DON_ID = 78978987;
+
+ CCIPHomeHelper public s_ccipHome;
+
+ uint256 private constant PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..00
+ uint256 private constant PREFIX = 0x000a << (256 - 16); // 0x000b00..00
+
+ uint64 private constant DEFAULT_CHAIN_SELECTOR = 9381579735;
+
+ function setUp() public virtual {
+ s_ccipHome = new CCIPHomeHelper(CAPABILITIES_REGISTRY);
+ s_ccipHome.applyChainConfigUpdates(new uint64[](0), _getBaseChainConfigs());
+
+ ICapabilitiesRegistry.NodeInfo memory nodeInfo = ICapabilitiesRegistry.NodeInfo({
+ p2pId: keccak256("p2pId"),
+ signer: keccak256("signer"),
+ nodeOperatorId: 1,
+ configCount: 1,
+ workflowDONId: 1,
+ hashedCapabilityIds: new bytes32[](0),
+ capabilitiesDONIds: new uint256[](0)
+ });
+
+ vm.mockCall(
+ CAPABILITIES_REGISTRY, abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector), abi.encode(nodeInfo)
+ );
+
+ vm.startPrank(address(s_ccipHome));
+ }
+
+ function _getBaseChainConfigs() internal pure returns (CCIPHome.ChainConfigArgs[] memory) {
+ CCIPHome.ChainConfigArgs[] memory configs = new CCIPHome.ChainConfigArgs[](1);
+ CCIPHome.ChainConfig memory chainConfig =
+ CCIPHome.ChainConfig({readers: new bytes32[](0), fChain: 1, config: abi.encode("chainConfig")});
+ configs[0] = CCIPHome.ChainConfigArgs({chainSelector: DEFAULT_CHAIN_SELECTOR, chainConfig: chainConfig});
+
+ return configs;
+ }
+
+ function _getConfigDigest(
+ uint32 donId,
+ Internal.OCRPluginType pluginType,
+ bytes memory config,
+ uint32 version
+ ) internal view returns (bytes32) {
+ return bytes32(
+ (PREFIX & PREFIX_MASK)
+ | (
+ uint256(
+ keccak256(
+ bytes.concat(
+ abi.encode(bytes32("EVM"), block.chainid, address(s_ccipHome), donId, pluginType, version), config
+ )
+ )
+ ) & ~PREFIX_MASK
+ )
+ );
+ }
+
+ function _getBaseConfig() internal pure returns (CCIPHome.OCR3Config memory) {
+ CCIPHome.OCR3Node[] memory nodes = new CCIPHome.OCR3Node[](4);
+ for (uint256 i = 0; i < nodes.length; i++) {
+ nodes[i] = CCIPHome.OCR3Node({
+ p2pId: keccak256(abi.encode("p2pId", i)),
+ signerKey: abi.encode("signerKey"),
+ transmitterKey: abi.encode("transmitterKey")
+ });
+ }
+
+ return CCIPHome.OCR3Config({
+ pluginType: Internal.OCRPluginType.Commit,
+ chainSelector: DEFAULT_CHAIN_SELECTOR,
+ FRoleDON: 1,
+ offchainConfigVersion: 98765,
+ offrampAddress: abi.encode("offrampAddress"),
+ rmnHomeAddress: abi.encode("rmnHomeAddress"),
+ nodes: nodes,
+ offchainConfig: abi.encode("offchainConfig")
+ });
+ }
+}
+
+contract CCIPHome_constructor is CCIPHomeTest {
+ function test_constructor_success() public {
+ CCIPHome ccipHome = new CCIPHome(CAPABILITIES_REGISTRY);
+
+ assertEq(address(ccipHome.getCapabilityRegistry()), CAPABILITIES_REGISTRY);
+ }
+
+ function test_supportsInterface_success() public view {
+ assertTrue(s_ccipHome.supportsInterface(type(IERC165).interfaceId));
+ assertTrue(s_ccipHome.supportsInterface(type(ICapabilityConfiguration).interfaceId));
+ }
+
+ function test_getCapabilityConfiguration_success() public view {
+ bytes memory config = s_ccipHome.getCapabilityConfiguration(DEFAULT_DON_ID);
+ assertEq(config.length, 0);
+ }
+
+ function test_constructor_CapabilitiesRegistryAddressZero_reverts() public {
+ vm.expectRevert(CCIPHome.ZeroAddressNotAllowed.selector);
+ new CCIPHome(address(0));
+ }
+}
+
+contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTest {
+ function setUp() public virtual override {
+ super.setUp();
+ vm.stopPrank();
+ vm.startPrank(address(CAPABILITIES_REGISTRY));
+ }
+
+ function test_beforeCapabilityConfigSet_success() public {
+ // first set a config
+ bytes memory callData =
+ abi.encodeCall(CCIPHome.setCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST));
+
+ vm.expectCall(address(s_ccipHome), callData);
+
+ s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
+
+ // Then revoke the config
+ bytes32 candidateDigest = s_ccipHome.getCandidateDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertNotEq(candidateDigest, ZERO_DIGEST);
+
+ callData = abi.encodeCall(CCIPHome.revokeCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, candidateDigest));
+
+ vm.expectCall(address(s_ccipHome), callData);
+
+ s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
+
+ // Then set a new config
+ callData =
+ abi.encodeCall(CCIPHome.setCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST));
+
+ vm.expectCall(address(s_ccipHome), callData);
+
+ s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
+
+ // Then promote the new config
+
+ bytes32 newCandidateDigest = s_ccipHome.getCandidateDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertNotEq(newCandidateDigest, ZERO_DIGEST);
+
+ callData = abi.encodeCall(
+ CCIPHome.promoteCandidateAndRevokeActive, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, newCandidateDigest, ZERO_DIGEST)
+ );
+
+ vm.expectCall(address(s_ccipHome), callData);
+
+ s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
+
+ bytes32 activeDigest = s_ccipHome.getActiveDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeDigest, newCandidateDigest);
+ }
+
+ function test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() public {
+ bytes memory callData =
+ abi.encodeCall(CCIPHome.setCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST));
+
+ vm.stopPrank();
+
+ vm.expectRevert(CCIPHome.OnlyCapabilitiesRegistryCanCall.selector);
+
+ s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
+ }
+
+ function test_beforeCapabilityConfigSet_InvalidSelector_reverts() 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 {
+ uint32 wrongDonId = DEFAULT_DON_ID + 1;
+
+ bytes memory callData =
+ abi.encodeCall(CCIPHome.setCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST));
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.DONIdMismatch.selector, DEFAULT_DON_ID, wrongDonId));
+ s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, wrongDonId);
+ }
+
+ function test_beforeCapabilityConfigSet_InnerCallReverts_reverts() public {
+ bytes memory callData = abi.encodeCall(CCIPHome.revokeCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, ZERO_DIGEST));
+
+ vm.expectRevert(CCIPHome.RevokingZeroDigestNotAllowed.selector);
+ s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
+ }
+}
+
+contract CCIPHome_getConfigDigests is CCIPHomeTest {
+ function test_getConfigDigests_success() public {
+ (bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeDigest, ZERO_DIGEST);
+ assertEq(candidateDigest, ZERO_DIGEST);
+
+ CCIPHome.OCR3Config memory config = _getBaseConfig();
+ bytes32 firstDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+
+ (activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeDigest, ZERO_DIGEST);
+ assertEq(candidateDigest, firstDigest);
+
+ s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, firstDigest, ZERO_DIGEST);
+
+ (activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeDigest, firstDigest);
+ assertEq(candidateDigest, ZERO_DIGEST);
+
+ bytes32 secondDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+
+ (activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeDigest, firstDigest);
+ assertEq(candidateDigest, secondDigest);
+
+ assertEq(activeDigest, s_ccipHome.getActiveDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE));
+ assertEq(candidateDigest, s_ccipHome.getCandidateDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE));
+ }
+}
+
+contract CCIPHome_getAllConfigs is CCIPHomeTest {
+ function test_getAllConfigs_success() public {
+ CCIPHome.OCR3Config memory config = _getBaseConfig();
+ bytes32 firstDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+
+ (CCIPHome.VersionedConfig memory activeConfig, CCIPHome.VersionedConfig memory candidateConfig) =
+ s_ccipHome.getAllConfigs(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeConfig.configDigest, ZERO_DIGEST);
+ assertEq(candidateConfig.configDigest, firstDigest);
+
+ s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, firstDigest, ZERO_DIGEST);
+
+ (activeConfig, candidateConfig) = s_ccipHome.getAllConfigs(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeConfig.configDigest, firstDigest);
+ assertEq(candidateConfig.configDigest, ZERO_DIGEST);
+
+ bytes32 secondDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+
+ (activeConfig, candidateConfig) = s_ccipHome.getAllConfigs(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeConfig.configDigest, firstDigest);
+ assertEq(candidateConfig.configDigest, secondDigest);
+
+ (activeConfig, candidateConfig) = s_ccipHome.getAllConfigs(DEFAULT_DON_ID + 1, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeConfig.configDigest, ZERO_DIGEST);
+ assertEq(candidateConfig.configDigest, ZERO_DIGEST);
+
+ (activeConfig, candidateConfig) = s_ccipHome.getAllConfigs(DEFAULT_DON_ID, Internal.OCRPluginType.Execution);
+ assertEq(activeConfig.configDigest, ZERO_DIGEST);
+ assertEq(candidateConfig.configDigest, ZERO_DIGEST);
+ }
+}
+
+contract CCIPHome_setCandidate is CCIPHomeTest {
+ function test_setCandidate_success() public {
+ CCIPHome.OCR3Config memory config = _getBaseConfig();
+ CCIPHome.VersionedConfig memory versionedConfig =
+ CCIPHome.VersionedConfig({version: 1, config: config, configDigest: ZERO_DIGEST});
+
+ versionedConfig.configDigest =
+ _getConfigDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, abi.encode(versionedConfig.config), versionedConfig.version);
+
+ vm.expectEmit();
+ emit CCIPHome.ConfigSet(versionedConfig.configDigest, versionedConfig.version, versionedConfig.config);
+
+ s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, versionedConfig.config, ZERO_DIGEST);
+
+ (CCIPHome.VersionedConfig memory storedVersionedConfig, bool ok) =
+ s_ccipHome.getConfig(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, versionedConfig.configDigest);
+ assertTrue(ok);
+ assertEq(storedVersionedConfig.version, versionedConfig.version);
+ assertEq(storedVersionedConfig.configDigest, versionedConfig.configDigest);
+ assertEq(keccak256(abi.encode(storedVersionedConfig.config)), keccak256(abi.encode(versionedConfig.config)));
+ }
+
+ function test_setCandidate_ConfigDigestMismatch_reverts() public {
+ CCIPHome.OCR3Config memory config = _getBaseConfig();
+
+ bytes32 digest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.ConfigDigestMismatch.selector, digest, ZERO_DIGEST));
+ s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+
+ vm.expectEmit();
+ emit CCIPHome.CandidateConfigRevoked(digest);
+
+ s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, digest);
+ }
+
+ function test_setCandidate_CanOnlySelfCall_reverts() public {
+ vm.stopPrank();
+
+ vm.expectRevert(CCIPHome.CanOnlySelfCall.selector);
+ s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST);
+ }
+}
+
+contract CCIPHome_revokeCandidate is CCIPHomeTest {
+ // Sets two configs
+ function setUp() public virtual override {
+ super.setUp();
+ CCIPHome.OCR3Config memory config = _getBaseConfig();
+ bytes32 digest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+ s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, digest, ZERO_DIGEST);
+
+ config.offrampAddress = abi.encode("new_offrampAddress");
+ s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+ }
+
+ function test_revokeCandidate_success() public {
+ (bytes32 priorActiveDigest, bytes32 priorCandidateDigest) =
+ s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+
+ vm.expectEmit();
+ emit CCIPHome.CandidateConfigRevoked(priorCandidateDigest);
+
+ s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, priorCandidateDigest);
+
+ (CCIPHome.VersionedConfig memory storedVersionedConfig, bool ok) =
+ s_ccipHome.getConfig(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, priorCandidateDigest);
+ assertFalse(ok);
+ // Ensure no old data is returned, even though it's still in storage
+ assertEq(storedVersionedConfig.version, 0);
+ assertEq(storedVersionedConfig.config.chainSelector, 0);
+ assertEq(storedVersionedConfig.config.FRoleDON, 0);
+
+ // Asser the active digest is unaffected but the candidate digest is set to zero
+ (bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeDigest, priorActiveDigest);
+ assertEq(candidateDigest, ZERO_DIGEST);
+ assertTrue(candidateDigest != priorCandidateDigest);
+ }
+
+ function test_revokeCandidate_ConfigDigestMismatch_reverts() public {
+ (, bytes32 priorCandidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+
+ bytes32 wrongDigest = keccak256("wrong_digest");
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.ConfigDigestMismatch.selector, priorCandidateDigest, wrongDigest));
+ s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, wrongDigest);
+ }
+
+ function test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() public {
+ vm.expectRevert(CCIPHome.RevokingZeroDigestNotAllowed.selector);
+ s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, ZERO_DIGEST);
+ }
+
+ function test_revokeCandidate_CanOnlySelfCall_reverts() public {
+ vm.startPrank(address(0));
+
+ vm.expectRevert(CCIPHome.CanOnlySelfCall.selector);
+ s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, keccak256("configDigest"));
+ }
+}
+
+contract CCIPHome_promoteCandidateAndRevokeActive is CCIPHomeTest {
+ function test_promoteCandidateAndRevokeActive_success() public {
+ CCIPHome.OCR3Config memory config = _getBaseConfig();
+ bytes32 firstConfigToPromote = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+
+ vm.expectEmit();
+ emit CCIPHome.ConfigPromoted(firstConfigToPromote);
+
+ s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, firstConfigToPromote, ZERO_DIGEST);
+
+ // Assert the active digest is updated and the candidate digest is set to zero
+ (bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeDigest, firstConfigToPromote);
+ assertEq(candidateDigest, ZERO_DIGEST);
+
+ // Set a new candidate to promote over a non-zero active config.
+ config.offchainConfig = abi.encode("new_offchainConfig_config");
+ bytes32 secondConfigToPromote = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+
+ vm.expectEmit();
+ emit CCIPHome.ActiveConfigRevoked(firstConfigToPromote);
+
+ vm.expectEmit();
+ emit CCIPHome.ConfigPromoted(secondConfigToPromote);
+
+ s_ccipHome.promoteCandidateAndRevokeActive(
+ DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, secondConfigToPromote, firstConfigToPromote
+ );
+
+ (CCIPHome.VersionedConfig memory activeConfig, CCIPHome.VersionedConfig memory candidateConfig) =
+ s_ccipHome.getAllConfigs(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ assertEq(activeConfig.configDigest, secondConfigToPromote);
+ assertEq(candidateConfig.configDigest, ZERO_DIGEST);
+ assertEq(keccak256(abi.encode(activeConfig.config)), keccak256(abi.encode(config)));
+ }
+
+ function test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() 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 {
+ (bytes32 priorActiveDigest, bytes32 priorCandidateDigest) =
+ s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ bytes32 wrongActiveDigest = keccak256("wrongActiveDigest");
+ bytes32 wrongCandidateDigest = keccak256("wrongCandidateDigest");
+
+ vm.expectRevert(
+ abi.encodeWithSelector(CCIPHome.ConfigDigestMismatch.selector, priorActiveDigest, wrongCandidateDigest)
+ );
+ s_ccipHome.promoteCandidateAndRevokeActive(
+ DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, wrongCandidateDigest, wrongActiveDigest
+ );
+
+ vm.expectRevert(
+ abi.encodeWithSelector(CCIPHome.ConfigDigestMismatch.selector, priorActiveDigest, wrongActiveDigest)
+ );
+
+ s_ccipHome.promoteCandidateAndRevokeActive(
+ DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, priorCandidateDigest, wrongActiveDigest
+ );
+ }
+
+ function test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() public {
+ vm.stopPrank();
+
+ vm.expectRevert(CCIPHome.CanOnlySelfCall.selector);
+ s_ccipHome.promoteCandidateAndRevokeActive(
+ DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, keccak256("toPromote"), keccak256("ToRevoke")
+ );
+ }
+}
+
+contract CCIPHome__validateConfig is CCIPHomeTest {
+ function setUp() public virtual override {
+ s_ccipHome = new CCIPHomeHelper(CAPABILITIES_REGISTRY);
+ }
+
+ function _addChainConfig(uint256 numNodes) internal returns (CCIPHome.OCR3Node[] memory nodes) {
+ return _addChainConfig(numNodes, 1);
+ }
+
+ function _makeBytes32Array(uint256 length, uint256 seed) internal pure returns (bytes32[] memory arr) {
+ arr = new bytes32[](length);
+ for (uint256 i = 0; i < length; i++) {
+ arr[i] = keccak256(abi.encode(i, 1, seed));
+ }
+ return arr;
+ }
+
+ function _makeBytesArray(uint256 length, uint256 seed) internal pure returns (bytes[] memory arr) {
+ arr = new bytes[](length);
+ for (uint256 i = 0; i < length; i++) {
+ arr[i] = abi.encode(keccak256(abi.encode(i, 1, seed)));
+ }
+ return arr;
+ }
+
+ function _addChainConfig(uint256 numNodes, uint8 fChain) internal returns (CCIPHome.OCR3Node[] memory nodes) {
+ bytes32[] memory p2pIds = _makeBytes32Array(numNodes, 0);
+ bytes[] memory signers = _makeBytesArray(numNodes, 10);
+ bytes[] memory transmitters = _makeBytesArray(numNodes, 20);
+
+ nodes = new CCIPHome.OCR3Node[](numNodes);
+
+ for (uint256 i = 0; i < numNodes; i++) {
+ nodes[i] = CCIPHome.OCR3Node({p2pId: p2pIds[i], signerKey: signers[i], transmitterKey: transmitters[i]});
+
+ vm.mockCall(
+ CAPABILITIES_REGISTRY,
+ abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, p2pIds[i]),
+ abi.encode(
+ ICapabilitiesRegistry.NodeInfo({
+ nodeOperatorId: 1,
+ signer: bytes32(signers[i]),
+ p2pId: p2pIds[i],
+ hashedCapabilityIds: new bytes32[](0),
+ configCount: uint32(1),
+ workflowDONId: uint32(1),
+ capabilitiesDONIds: new uint256[](0)
+ })
+ )
+ );
+ }
+ // Add chain selector for chain 1.
+ CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](1);
+ adds[0] = CCIPHome.ChainConfigArgs({
+ chainSelector: 1,
+ chainConfig: CCIPHome.ChainConfig({readers: p2pIds, fChain: fChain, config: bytes("config1")})
+ });
+
+ vm.expectEmit();
+ emit CCIPHome.ChainConfigSet(1, adds[0].chainConfig);
+ s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds);
+
+ return nodes;
+ }
+
+ function _getCorrectOCR3Config(uint8 numNodes, uint8 FRoleDON) internal returns (CCIPHome.OCR3Config memory) {
+ CCIPHome.OCR3Node[] memory nodes = _addChainConfig(numNodes);
+
+ return CCIPHome.OCR3Config({
+ pluginType: Internal.OCRPluginType.Commit,
+ offrampAddress: abi.encode(keccak256(abi.encode("offramp"))),
+ rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))),
+ chainSelector: 1,
+ nodes: nodes,
+ FRoleDON: FRoleDON,
+ offchainConfigVersion: 30,
+ offchainConfig: bytes("offchainConfig")
+ });
+ }
+
+ function _getCorrectOCR3Config() internal returns (CCIPHome.OCR3Config memory) {
+ return _getCorrectOCR3Config(4, 1);
+ }
+
+ // Successes.
+
+ function test__validateConfig_Success() public {
+ s_ccipHome.validateConfig(_getCorrectOCR3Config());
+ }
+
+ function test__validateConfigLessTransmittersThanSigners_Success() public {
+ // fChain is 1, so there should be at least 4 transmitters.
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(5, 1);
+ config.nodes[1].transmitterKey = bytes("");
+
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfigSmallerFChain_Success() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(11, 3);
+
+ // Set fChain to 2
+ _addChainConfig(4, 2);
+
+ s_ccipHome.validateConfig(config);
+ }
+
+ // Reverts
+
+ function test__validateConfig_ChainSelectorNotSet_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.chainSelector = 0; // invalid
+
+ vm.expectRevert(CCIPHome.ChainSelectorNotSet.selector);
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_OfframpAddressCannotBeZero_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.offrampAddress = ""; // invalid
+
+ vm.expectRevert(CCIPHome.OfframpAddressCannotBeZero.selector);
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.offrampAddress = abi.encode(address(0)); // invalid
+
+ vm.expectRevert(CCIPHome.OfframpAddressCannotBeZero.selector);
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.rmnHomeAddress = ""; // invalid
+
+ vm.expectRevert(CCIPHome.RMNHomeAddressCannotBeZero.selector);
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.rmnHomeAddress = abi.encode(address(0)); // invalid
+
+ vm.expectRevert(CCIPHome.RMNHomeAddressCannotBeZero.selector);
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_ChainSelectorNotFound_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.chainSelector = 2; // not set
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.ChainSelectorNotFound.selector, 2));
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_NotEnoughTransmitters_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ uint256 numberOfTransmitters = 3;
+
+ // 32 > 31 (max num oracles)
+ CCIPHome.OCR3Node[] memory nodes = _addChainConfig(31);
+
+ // truncate transmitters to < 3 * fChain + 1
+ // since fChain is 1 in this case, we need to truncate to 3 transmitters.
+ for (uint256 i = numberOfTransmitters; i < nodes.length; ++i) {
+ nodes[i].transmitterKey = bytes("");
+ }
+
+ config.nodes = nodes;
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.NotEnoughTransmitters.selector, numberOfTransmitters, 4));
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.nodes[0].transmitterKey = bytes("");
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.NotEnoughTransmitters.selector, 3, 4));
+ s_ccipHome.validateConfig(config);
+
+ // Zero out remaining transmitters to verify error changes
+ for (uint256 i = 1; i < config.nodes.length; ++i) {
+ config.nodes[i].transmitterKey = bytes("");
+ }
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.NotEnoughTransmitters.selector, 0, 4));
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_TooManySigners_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.nodes = new CCIPHome.OCR3Node[](257);
+
+ vm.expectRevert(CCIPHome.TooManySigners.selector);
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_FChainTooHigh_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.FRoleDON = 2; // too low
+
+ // Set fChain to 3
+ _addChainConfig(4, 3);
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.FChainTooHigh.selector, 3, 2));
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_FMustBePositive_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.FRoleDON = 0; // not positive
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.FChainTooHigh.selector, 1, 0));
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_FTooHigh_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.FRoleDON = 2; // too high
+
+ vm.expectRevert(CCIPHome.FTooHigh.selector);
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_ZeroP2PId_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.nodes[1].p2pId = bytes32(0);
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.InvalidNode.selector, config.nodes[1]));
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_ZeroSignerKey_Reverts() public {
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.nodes[2].signerKey = bytes("");
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.InvalidNode.selector, config.nodes[2]));
+ s_ccipHome.validateConfig(config);
+ }
+
+ function test__validateConfig_NodeNotInRegistry_Reverts() public {
+ CCIPHome.OCR3Node[] memory nodes = _addChainConfig(4);
+ bytes32 nonExistentP2PId = keccak256("notInRegistry");
+ nodes[0].p2pId = nonExistentP2PId;
+
+ vm.mockCall(
+ CAPABILITIES_REGISTRY,
+ abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, nonExistentP2PId),
+ abi.encode(
+ ICapabilitiesRegistry.NodeInfo({
+ nodeOperatorId: 0,
+ signer: bytes32(0),
+ p2pId: bytes32(uint256(0)),
+ hashedCapabilityIds: new bytes32[](0),
+ configCount: uint32(1),
+ workflowDONId: uint32(1),
+ capabilitiesDONIds: new uint256[](0)
+ })
+ )
+ );
+ CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
+ config.nodes = nodes;
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.NodeNotInRegistry.selector, nonExistentP2PId));
+ s_ccipHome.validateConfig(config);
+ }
+}
+
+contract CCIPHome_applyChainConfigUpdates is CCIPHomeTest {
+ function setUp() public virtual override {
+ s_ccipHome = new CCIPHomeHelper(CAPABILITIES_REGISTRY);
+ }
+
+ function test_applyChainConfigUpdates_addChainConfigs_Success() public {
+ bytes32[] memory chainReaders = new bytes32[](1);
+ chainReaders[0] = keccak256(abi.encode(1));
+ CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2);
+ adds[0] = CCIPHome.ChainConfigArgs({
+ chainSelector: 1,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")})
+ });
+ adds[1] = CCIPHome.ChainConfigArgs({
+ chainSelector: 2,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")})
+ });
+ vm.mockCall(
+ CAPABILITIES_REGISTRY,
+ abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
+ abi.encode(
+ ICapabilitiesRegistry.NodeInfo({
+ nodeOperatorId: 1,
+ signer: bytes32(uint256(1)),
+ p2pId: chainReaders[0],
+ hashedCapabilityIds: new bytes32[](0),
+ configCount: uint32(1),
+ workflowDONId: uint32(1),
+ capabilitiesDONIds: new uint256[](0)
+ })
+ )
+ );
+ vm.expectEmit();
+ emit CCIPHome.ChainConfigSet(1, adds[0].chainConfig);
+ vm.expectEmit();
+ emit CCIPHome.ChainConfigSet(2, adds[1].chainConfig);
+ s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds);
+
+ CCIPHome.ChainConfigArgs[] memory configs = s_ccipHome.getAllChainConfigs(0, 2);
+ assertEq(configs.length, 2, "chain configs length must be 2");
+ assertEq(configs[0].chainSelector, 1, "chain selector must match");
+ assertEq(configs[1].chainSelector, 2, "chain selector must match");
+ assertEq(s_ccipHome.getNumChainConfigurations(), 2, "total chain configs must be 2");
+ }
+
+ function test_getPaginatedCCIPHomes_Success() public {
+ bytes32[] memory chainReaders = new bytes32[](1);
+ chainReaders[0] = keccak256(abi.encode(1));
+ CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2);
+ adds[0] = CCIPHome.ChainConfigArgs({
+ chainSelector: 1,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")})
+ });
+ adds[1] = CCIPHome.ChainConfigArgs({
+ chainSelector: 2,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")})
+ });
+ vm.mockCall(
+ CAPABILITIES_REGISTRY,
+ abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
+ abi.encode(
+ ICapabilitiesRegistry.NodeInfo({
+ nodeOperatorId: 1,
+ signer: bytes32(uint256(1)),
+ p2pId: chainReaders[0],
+ hashedCapabilityIds: new bytes32[](0),
+ configCount: uint32(1),
+ workflowDONId: uint32(1),
+ capabilitiesDONIds: new uint256[](0)
+ })
+ )
+ );
+
+ s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds);
+
+ CCIPHome.ChainConfigArgs[] memory configs = s_ccipHome.getAllChainConfigs(0, 2);
+ assertEq(configs.length, 2, "chain configs length must be 2");
+ assertEq(configs[0].chainSelector, 1, "chain selector must match");
+ assertEq(configs[1].chainSelector, 2, "chain selector must match");
+
+ configs = s_ccipHome.getAllChainConfigs(0, 1);
+ assertEq(configs.length, 1, "chain configs length must be 1");
+ assertEq(configs[0].chainSelector, 1, "chain selector must match");
+
+ configs = s_ccipHome.getAllChainConfigs(0, 10);
+ assertEq(configs.length, 2, "chain configs length must be 2");
+ assertEq(configs[0].chainSelector, 1, "chain selector must match");
+ assertEq(configs[1].chainSelector, 2, "chain selector must match");
+
+ configs = s_ccipHome.getAllChainConfigs(1, 1);
+ assertEq(configs.length, 1, "chain configs length must be 1");
+
+ configs = s_ccipHome.getAllChainConfigs(1, 2);
+ assertEq(configs.length, 0, "chain configs length must be 0");
+ }
+
+ function test_applyChainConfigUpdates_removeChainConfigs_Success() public {
+ bytes32[] memory chainReaders = new bytes32[](1);
+ chainReaders[0] = keccak256(abi.encode(1));
+ CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2);
+ adds[0] = CCIPHome.ChainConfigArgs({
+ chainSelector: 1,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")})
+ });
+ adds[1] = CCIPHome.ChainConfigArgs({
+ chainSelector: 2,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")})
+ });
+
+ vm.mockCall(
+ CAPABILITIES_REGISTRY,
+ abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
+ abi.encode(
+ ICapabilitiesRegistry.NodeInfo({
+ nodeOperatorId: 1,
+ signer: bytes32(uint256(1)),
+ p2pId: chainReaders[0],
+ hashedCapabilityIds: new bytes32[](0),
+ configCount: uint32(1),
+ workflowDONId: uint32(1),
+ capabilitiesDONIds: new uint256[](0)
+ })
+ )
+ );
+
+ vm.expectEmit();
+ emit CCIPHome.ChainConfigSet(1, adds[0].chainConfig);
+ vm.expectEmit();
+ emit CCIPHome.ChainConfigSet(2, adds[1].chainConfig);
+ s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds);
+
+ assertEq(s_ccipHome.getNumChainConfigurations(), 2, "total chain configs must be 2");
+
+ uint64[] memory removes = new uint64[](1);
+ removes[0] = uint64(1);
+
+ vm.expectEmit();
+ emit CCIPHome.ChainConfigRemoved(1);
+ s_ccipHome.applyChainConfigUpdates(removes, new CCIPHome.ChainConfigArgs[](0));
+
+ assertEq(s_ccipHome.getNumChainConfigurations(), 1, "total chain configs must be 1");
+ }
+
+ // Reverts.
+
+ function test_applyChainConfigUpdates_selectorNotFound_Reverts() public {
+ uint64[] memory removes = new uint64[](1);
+ removes[0] = uint64(1);
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.ChainSelectorNotFound.selector, 1));
+ s_ccipHome.applyChainConfigUpdates(removes, new CCIPHome.ChainConfigArgs[](0));
+ }
+
+ function test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() public {
+ bytes32[] memory chainReaders = new bytes32[](1);
+ chainReaders[0] = keccak256(abi.encode(1));
+ CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](1);
+ adds[0] = CCIPHome.ChainConfigArgs({
+ chainSelector: 1,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: abi.encode(1, 2, 3)})
+ });
+
+ vm.mockCall(
+ CAPABILITIES_REGISTRY,
+ abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
+ abi.encode(
+ ICapabilitiesRegistry.NodeInfo({
+ nodeOperatorId: 0,
+ signer: bytes32(0),
+ p2pId: bytes32(uint256(0)),
+ hashedCapabilityIds: new bytes32[](0),
+ configCount: uint32(1),
+ workflowDONId: uint32(1),
+ capabilitiesDONIds: new uint256[](0)
+ })
+ )
+ );
+
+ vm.expectRevert(abi.encodeWithSelector(CCIPHome.NodeNotInRegistry.selector, chainReaders[0]));
+ s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds);
+ }
+
+ function test__applyChainConfigUpdates_FChainNotPositive_Reverts() public {
+ bytes32[] memory chainReaders = new bytes32[](1);
+ chainReaders[0] = keccak256(abi.encode(1));
+ CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2);
+ adds[0] = CCIPHome.ChainConfigArgs({
+ chainSelector: 1,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")})
+ });
+ adds[1] = CCIPHome.ChainConfigArgs({
+ chainSelector: 2,
+ chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 0, config: bytes("config2")}) // bad fChain
+ });
+
+ vm.mockCall(
+ CAPABILITIES_REGISTRY,
+ abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]),
+ abi.encode(
+ ICapabilitiesRegistry.NodeInfo({
+ nodeOperatorId: 1,
+ signer: bytes32(uint256(1)),
+ p2pId: chainReaders[0],
+ hashedCapabilityIds: new bytes32[](0),
+ configCount: uint32(1),
+ workflowDONId: uint32(1),
+ capabilitiesDONIds: new uint256[](0)
+ })
+ )
+ );
+
+ vm.expectRevert(CCIPHome.FChainMustBePositive.selector);
+ s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds);
+ }
+}
diff --git a/contracts/src/v0.8/ccip/test/helpers/CCIPConfigHelper.sol b/contracts/src/v0.8/ccip/test/helpers/CCIPConfigHelper.sol
deleted file mode 100644
index efade5190b..0000000000
--- a/contracts/src/v0.8/ccip/test/helpers/CCIPConfigHelper.sol
+++ /dev/null
@@ -1,68 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.24;
-
-import {CCIPConfig} from "../../capability/CCIPConfig.sol";
-import {CCIPConfigTypes} from "../../capability/libraries/CCIPConfigTypes.sol";
-import {Internal} from "../../libraries/Internal.sol";
-
-contract CCIPConfigHelper is CCIPConfig {
- constructor(address capabilitiesRegistry) CCIPConfig(capabilitiesRegistry) {}
-
- function stateFromConfigLength(uint256 configLength) public pure returns (CCIPConfigTypes.ConfigState) {
- return _stateFromConfigLength(configLength);
- }
-
- function validateConfigStateTransition(
- CCIPConfigTypes.ConfigState currentState,
- CCIPConfigTypes.ConfigState newState
- ) public pure {
- _validateConfigStateTransition(currentState, newState);
- }
-
- function validateConfigTransition(
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig,
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta
- ) public pure {
- _validateConfigTransition(currentConfig, newConfigWithMeta);
- }
-
- function computeNewConfigWithMeta(
- uint32 donId,
- CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig,
- CCIPConfigTypes.OCR3Config[] memory newConfig,
- CCIPConfigTypes.ConfigState currentState,
- CCIPConfigTypes.ConfigState newState
- ) public view returns (CCIPConfigTypes.OCR3ConfigWithMeta[] memory) {
- return _computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, newState);
- }
-
- function groupByPluginType(
- CCIPConfigTypes.OCR3Config[] memory ocr3Configs
- )
- public
- pure
- returns (CCIPConfigTypes.OCR3Config[] memory commitConfigs, CCIPConfigTypes.OCR3Config[] memory execConfigs)
- {
- return _groupByPluginType(ocr3Configs);
- }
-
- function computeConfigDigest(
- uint32 donId,
- uint64 configCount,
- CCIPConfigTypes.OCR3Config memory ocr3Config
- ) public pure returns (bytes32) {
- return _computeConfigDigest(donId, configCount, ocr3Config);
- }
-
- function validateConfig(CCIPConfigTypes.OCR3Config memory cfg) public view {
- _validateConfig(cfg);
- }
-
- function updatePluginConfig(
- uint32 donId,
- Internal.OCRPluginType pluginType,
- CCIPConfigTypes.OCR3Config[] memory newConfig
- ) public {
- _updatePluginConfig(donId, pluginType, newConfig);
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol b/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol
new file mode 100644
index 0000000000..8e460b791e
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.24;
+
+import {CCIPHome} from "../../capability/CCIPHome.sol";
+
+contract CCIPHomeHelper is CCIPHome {
+ constructor(address capabilitiesRegistry) CCIPHome(capabilitiesRegistry) {}
+
+ function validateConfig(OCR3Config memory cfg) external view {
+ return _validateConfig(cfg);
+ }
+
+ function ensureInRegistry(bytes32[] memory p2pIds) external view {
+ return _ensureInRegistry(p2pIds);
+ }
+}
diff --git a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go b/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
deleted file mode 100644
index d13dadc2b0..0000000000
--- a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
+++ /dev/null
@@ -1,1304 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package ccip_config
-
-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 CCIPConfigTypesChainConfig struct {
- Readers [][32]byte
- FChain uint8
- Config []byte
-}
-
-type CCIPConfigTypesChainConfigInfo struct {
- ChainSelector uint64
- ChainConfig CCIPConfigTypesChainConfig
-}
-
-type CCIPConfigTypesOCR3Config struct {
- PluginType uint8
- ChainSelector uint64
- FRoleDON uint8
- OffchainConfigVersion uint64
- OfframpAddress []byte
- RmnHomeAddress []byte
- Nodes []CCIPConfigTypesOCR3Node
- OffchainConfig []byte
-}
-
-type CCIPConfigTypesOCR3ConfigWithMeta struct {
- Config CCIPConfigTypesOCR3Config
- ConfigCount uint64
- ConfigDigest [32]byte
-}
-
-type CCIPConfigTypesOCR3Node struct {
- P2pId [32]byte
- SignerKey []byte
- TransmitterKey []byte
-}
-
-var CCIPConfigMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidConfigLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"currentState\",\"type\":\"uint8\"},{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"proposedState\",\"type\":\"uint8\"}],\"name\":\"InvalidConfigStateTransition\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Node\",\"name\":\"node\",\"type\":\"tuple\"}],\"name\":\"InvalidNode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentConfigTransition\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RMNHomeAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOCR3Configs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"}],\"name\":\"WrongConfigCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigestBlueGreen\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"components\":[{\"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\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"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\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilityRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumChainConfigurations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getOCRConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"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\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b5060405162004367380380620043678339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b608051614165620002026000396000818161010301528181610eee015261115e01526141656000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638318ed5d11610081578063f2fde38b1161005b578063f2fde38b14610230578063f442c89a14610243578063fba64a7c1461025657600080fd5b80638318ed5d146101d15780638da5cb5b146101f2578063b74b23561461021057600080fd5b80634bd0473f116100b25780634bd0473f1461019157806379ba5097146101b15780637ac0d41e146101bb57600080fd5b806301ffc9a7146100d9578063020330e614610101578063181f5a7714610148575b600080fd5b6100ec6100e7366004612f10565b610269565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b6101846040518060400160405280601481526020017f43434950436f6e66696720312e362e302d64657600000000000000000000000081525081565b6040516100f89190612fb6565b6101a461019f366004612ffa565b610302565b6040516100f8919061311e565b6101b961078f565b005b6101c3610891565b6040519081526020016100f8565b6101846101df3660046132bb565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff16610123565b61022361021e3660046132d8565b6108a2565b6040516100f89190613368565b6101b961023e3660046133f8565b610b23565b6101b961025136600461347a565b610b37565b6101b96102643660046134fe565b610ed6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea7210000000000000000000000000000000000000000000000000000000014806102fc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b63ffffffff8216600090815260056020526040812060609183600181111561032c5761032c61302f565b600181111561033d5761033d61302f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561078357600084815260209020604080516101608101909152600784029091018054829060608201908390829060ff1660018111156103b0576103b061302f565b60018111156103c1576103c161302f565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610419906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610445906135bb565b80156104925780601f1061046757610100808354040283529160200191610492565b820191906000526020600020905b81548152906001019060200180831161047557829003601f168201915b505050505081526020016002820180546104ab906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546104d7906135bb565b80156105245780601f106104f957610100808354040283529160200191610524565b820191906000526020600020905b81548152906001019060200180831161050757829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b828210156106b257838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461058f906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546105bb906135bb565b80156106085780601f106105dd57610100808354040283529160200191610608565b820191906000526020600020905b8154815290600101906020018083116105eb57829003601f168201915b50505050508152602001600282018054610621906135bb565b80601f016020809104026020016040519081016040528092919081815260200182805461064d906135bb565b801561069a5780601f1061066f5761010080835404028352916020019161069a565b820191906000526020600020905b81548152906001019060200180831161067d57829003601f168201915b50505050508152505081526020019060010190610552565b5050505081526020016004820180546106ca906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546106f6906135bb565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b505050919092525050508152600582015467ffffffffffffffff16602080830191909152600690920154604090910152908252600192909201910161036b565b50505050905092915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600061089d6003610f91565b905090565b606060006108b06003610f91565b905060006108be848661363d565b90508315806108cd5750818110155b1561090d576040805160008082526020820190925290610903565b6108f0612cfc565b8152602001906001900390816108e85790505b50925050506102fc565b60006109198583613683565b9050828111156109265750815b60006109328383613696565b67ffffffffffffffff81111561094a5761094a613654565b60405190808252806020026020018201604052801561098357816020015b610970612cfc565b8152602001906001900390816109685790505b50905060006109926003610f9b565b9050835b83811015610b165760008282815181106109b2576109b26136a9565b60209081029190910181015160408051808201825267ffffffffffffffff831680825260009081526002855282902082518154608081880283018101909552606082018181529597509295860194909391928492849190840182828015610a3857602002820191906000526020600020905b815481526020019060010190808311610a24575b5050509183525050600182015460ff166020820152600282018054604090920191610a62906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8e906135bb565b8015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b50505091909252505050905284610af28885613696565b81518110610b0257610b026136a9565b602090810291909101015250600101610996565b5090979650505050505050565b610b2b610faf565b610b3481611032565b50565b610b3f610faf565b60005b83811015610d2557610b86858583818110610b5f57610b5f6136a9565b9050602002016020810190610b7491906136d8565b60039067ffffffffffffffff16611127565b610bf057848482818110610b9c57610b9c6136a9565b9050602002016020810190610bb191906136d8565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161080c565b60026000868684818110610c0657610c066136a9565b9050602002016020810190610c1b91906136d8565b67ffffffffffffffff1681526020810191909152604001600090812090610c428282612d44565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610c7a600283016000612d62565b5050610cb8858583818110610c9157610c916136a9565b9050602002016020810190610ca691906136d8565b60039067ffffffffffffffff1661113f565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110610cec57610cec6136a9565b9050602002016020810190610d0191906136d8565b60405167ffffffffffffffff909116815260200160405180910390a1600101610b42565b5060005b81811015610ecf576000838383818110610d4557610d456136a9565b9050602002810190610d5791906136f3565b610d65906020810190613731565b610d6e906138e7565b90506000848484818110610d8457610d846136a9565b9050602002810190610d9691906136f3565b610da49060208101906136d8565b9050610db3826000015161114b565b816020015160ff16600003610df4576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600260209081526040909120835180518593610e24928492910190612d9c565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560408201516002820190610e719082613a0f565b50610e8b91506003905067ffffffffffffffff8316611297565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051610ebd929190613b29565b60405180910390a15050600101610d29565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f45576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f5c610f5786880188613c67565b6112a3565b8151919350915015610f7457610f74836000846114e0565b805115610f8757610f87836001836114e0565b5050505050505050565b60006102fc825490565b60606000610fa883611db9565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161080c565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036110b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161080c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515610fa8565b6000610fa88383611e15565b60005b81518110156112935760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe8484815181106111aa576111aa6136a9565b60200260200101516040518263ffffffff1660e01b81526004016111d091815260200190565b600060405180830381865afa1580156111ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112339190810190613e8b565b608001510361128b5781818151811061124e5761124e6136a9565b60200260200101516040517f8907a4fa00000000000000000000000000000000000000000000000000000000815260040161080c91815260200190565b60010161114e565b5050565b6000610fa88383611f0f565b606080600460ff16835111156112e5576040517f8854586400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028082526060820190925290816020015b61135b6040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816112fb57505060408051600280825260608201909252919350602082015b6113e56040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161138557905050905060008060005b85518110156114d357600086828151811061141d5761141d6136a9565b602002602001015160000151600181111561143a5761143a61302f565b0361148757858181518110611451576114516136a9565b602002602001015185848151811061146b5761146b6136a9565b60200260200101819052508261148090613f63565b92506114cb565b858181518110611499576114996136a9565b60200260200101518483815181106114b3576114b36136a9565b6020026020010181905250816114c890613f63565b91505b600101611400565b5090835281529092909150565b63ffffffff83166000908152600560205260408120818460018111156115085761150861302f565b60018111156115195761151961302f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561195f57600084815260209020604080516101608101909152600784029091018054829060608201908390829060ff16600181111561158c5761158c61302f565b600181111561159d5761159d61302f565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916115f5906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611621906135bb565b801561166e5780601f106116435761010080835404028352916020019161166e565b820191906000526020600020905b81548152906001019060200180831161165157829003601f168201915b50505050508152602001600282018054611687906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546116b3906135bb565b80156117005780601f106116d557610100808354040283529160200191611700565b820191906000526020600020905b8154815290600101906020018083116116e357829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561188e57838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461176b906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611797906135bb565b80156117e45780601f106117b9576101008083540402835291602001916117e4565b820191906000526020600020905b8154815290600101906020018083116117c757829003601f168201915b505050505081526020016002820180546117fd906135bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611829906135bb565b80156118765780601f1061184b57610100808354040283529160200191611876565b820191906000526020600020905b81548152906001019060200180831161185957829003601f168201915b5050505050815250508152602001906001019061172e565b5050505081526020016004820180546118a6906135bb565b80601f01602080910402602001604051908101604052809291908181526020018280546118d2906135bb565b801561191f5780601f106118f45761010080835404028352916020019161191f565b820191906000526020600020905b81548152906001019060200180831161190257829003601f168201915b505050919092525050508152600582015467ffffffffffffffff166020808301919091526006909201546040909101529082526001929092019101611547565b50505050905060006119718251611f5e565b9050600061197f8451611f5e565b905061198b8282611fb0565b600061199a878587868661206c565b90506119a68482612448565b63ffffffff87166000908152600560205260408120908760018111156119ce576119ce61302f565b60018111156119df576119df61302f565b815260200190815260200160002060006119f99190612de7565b60005b8151811015611d5c5763ffffffff8816600090815260056020526040812081896001811115611a2d57611a2d61302f565b6001811115611a3e57611a3e61302f565b81526020019081526020016000206001816001815401808255809150500390600052602060002090600702019050828281518110611a7e57611a7e6136a9565b6020026020010151604001518160060181905550828281518110611aa457611aa46136a9565b6020026020010151602001518160050160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008160000190506000848481518110611af657611af66136a9565b602090810291909101015151805183549192509083907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018381811115611b4157611b4161302f565b021790555060208101518254604083015160608401517fffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff90921661010067ffffffffffffffff948516027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000060ff90921691909102177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a0100000000000000000000929091169190910217825560808101516001830190611c109082613a0f565b5060a08101516002830190611c259082613a0f565b5060e08101516004830190611c3a9082613a0f565b505b60c08101515160038301541115611cbb5781600301805480611c6057611c60613f9b565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815590611ca46001830182612d62565b611cb2600283016000612d62565b50509055611c3c565b60005b8160c0015151811015611d4d5760038301548110611d4557826003018260c001518281518110611cf057611cf06136a9565b6020908102919091018101518254600181810185556000948552938390208251600390920201908155918101519092820190611d2c9082613a0f565b5060408201516002820190611d419082613a0f565b5050505b600101611cbe565b505050508060010190506119fc565b50856001811115611d6f57611d6f61302f565b60ff168763ffffffff167ff4095525e757e2fec7f3d3ffb3482db215dbbc7e7c4f63a11e04529ea827171f83604051611da8919061311e565b60405180910390a350505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611e0957602002820191906000526020600020905b815481526020019060010190808311611df5575b50505050509050919050565b60008181526001830160205260408120548015611efe576000611e39600183613696565b8554909150600090611e4d90600190613696565b9050808214611eb2576000866000018281548110611e6d57611e6d6136a9565b9060005260206000200154905080876000018481548110611e9057611e906136a9565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611ec357611ec3613f9b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506102fc565b60009150506102fc565b5092915050565b6000818152600183016020526040812054611f56575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556102fc565b5060006102fc565b60006002821115611f9e576040517f3e4785260000000000000000000000000000000000000000000000000000000081526004810183905260240161080c565b8160028111156102fc576102fc61302f565b6000826002811115611fc457611fc461302f565b826002811115611fd657611fd661302f565b611fe09190613fca565b9050806001148061202c5750807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14801561202c5750600283600281111561202a5761202a61302f565b145b1561203657505050565b82826040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161080c929190613ffa565b60606000845167ffffffffffffffff81111561208a5761208a613654565b6040519080825280602002602001820160405280156120b3578160200160208202803683370190505b50905060008460028111156120ca576120ca61302f565b1480156120e8575060018360028111156120e6576120e661302f565b145b1561212957600181600081518110612102576121026136a9565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050612291565b600184600281111561213d5761213d61302f565b14801561215b575060028360028111156121595761215961302f565b145b156121f25785600081518110612173576121736136a9565b60200260200101516020015181600081518110612192576121926136a9565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050856000815181106121c7576121c76136a9565b60200260200101516020015160016121df9190614015565b81600181518110612102576121026136a9565b60028460028111156122065761220661302f565b148015612224575060018360028111156122225761222261302f565b145b1561225b578560018151811061223c5761223c6136a9565b60200260200101516020015181600081518110612102576121026136a9565b83836040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161080c929190613ffa565b6000855167ffffffffffffffff8111156122ad576122ad613654565b60405190808252806020026020018201604052801561235357816020015b6040805161016081018252600060608083018281526080840183905260a0840183905260c0840183905260e0840182905261010084018290526101208401829052610140840191909152825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816122cb5790505b50905060005b825181101561243c57612384878281518110612377576123776136a9565b60200260200101516127c7565b60405180606001604052808883815181106123a1576123a16136a9565b602002602001015181526020018483815181106123c0576123c06136a9565b602002602001015167ffffffffffffffff1681526020016124148b8685815181106123ed576123ed6136a9565b60200260200101518b8681518110612407576124076136a9565b6020026020010151612c35565b815250828281518110612429576124296136a9565b6020908102919091010152600101612359565b50979650505050505050565b815181518115801561245a5750806001145b156124fc5782600081518110612472576124726136a9565b60200260200101516020015167ffffffffffffffff166001146124f657826000815181106124a2576124a26136a9565b60209081029190910181015101516040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001602482015260440161080c565b50505050565b81600114801561250c5750806002145b156126c25783600081518110612524576125246136a9565b60200260200101516040015183600081518110612543576125436136a9565b602002602001015160400151146125cf5782600081518110612567576125676136a9565b60200260200101516040015184600081518110612586576125866136a9565b6020026020010151604001516040517fc7ccdd7f00000000000000000000000000000000000000000000000000000000815260040161080c929190918252602082015260400190565b836000815181106125e2576125e26136a9565b60200260200101516020015160016125fa9190614015565b67ffffffffffffffff1683600181518110612617576126176136a9565b60200260200101516020015167ffffffffffffffff16146124f65782600181518110612645576126456136a9565b60200260200101516020015184600081518110612664576126646136a9565b602002602001015160200151600161267c9190614015565b6040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff92831660048201529116602482015260440161080c565b8160021480156126d25750806001145b1561279557836001815181106126ea576126ea6136a9565b60200260200101516040015183600081518110612709576127096136a9565b602002602001015160400151146124f6578260008151811061272d5761272d6136a9565b6020026020010151604001518460018151811061274c5761274c6136a9565b6020026020010151604001516040517f9e97567000000000000000000000000000000000000000000000000000000000815260040161080c929190918252602082015260400190565b6040517f1f1b2bb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff1660000361280f576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815160018111156128245761282461302f565b1415801561284557506001815160018111156128425761284261302f565b14155b1561287c576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60808101515115806128b9575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b156128f0576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a081015151158061292d5750604080516000602082015201604051602081830303815290604052805190602001208160a0015180519060200120145b15612964576040517fdee9857400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015161297f9060039067ffffffffffffffff16611127565b6129c75760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161080c565b60408082015160208084015167ffffffffffffffff1660009081526002909152919091206001015460ff918216911681811115612a3a576040517f2db22040000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161080c565b60c083015151610100811115612a7c576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a8783600361363d565b8111612abf576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808267ffffffffffffffff811115612adb57612adb613654565b604051908082528060200260200182016040528015612b04578160200160208202803683370190505b50905060005b83811015612bc45760008760c001518281518110612b2a57612b2a6136a9565b60200260200101519050806040015151600014612b4f5783612b4b81613f63565b9450505b6020810151511580612b6057508051155b15612b9957806040517f9fa4031400000000000000000000000000000000000000000000000000000000815260040161080c9190614036565b8060000151838381518110612bb057612bb06136a9565b602090810291909101015250600101612b0a565b506000612bd285600361363d565b612bdd906001613683565b905080831015612c23576040517f548dd21f000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b612c2c8261114b565b50505050505050565b600080826020015185846000015185608001518660a00151888860c0015189604001518a606001518b60e00151604051602001612c7b9a99989796959493929190614049565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0a000000000000000000000000000000000000000000000000000000000000179150509392505050565b6040518060400160405280600067ffffffffffffffff168152602001612d3f604051806060016040528060608152602001600060ff168152602001606081525090565b905290565b5080546000825590600052602060002090810190610b349190612e08565b508054612d6e906135bb565b6000825580601f10612d7e575050565b601f016020900490600052602060002090810190610b349190612e08565b828054828255906000526020600020908101928215612dd7579160200282015b82811115612dd7578251825591602001919060010190612dbc565b50612de3929150612e08565b5090565b5080546000825560070290600052602060002090810190610b349190612e1d565b5b80821115612de35760008155600101612e09565b80821115612de35780547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560008181612e5c6001830182612d62565b612e6a600283016000612d62565b612e78600383016000612ec2565b612e86600483016000612d62565b5050506005810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905560006006820155600701612e1d565b5080546000825560030290600052602060002090810190610b3491905b80821115612de3576000808255612ef96001830182612d62565b612f07600283016000612d62565b50600301612edf565b600060208284031215612f2257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610fa857600080fd5b6000815180845260005b81811015612f7857602081850181015186830182015201612f5c565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610fa86020830184612f52565b63ffffffff81168114610b3457600080fd5b8035612fe681612fc9565b919050565b803560028110612fe657600080fd5b6000806040838503121561300d57600080fd5b823561301881612fc9565b915061302660208401612feb565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061306e5761306e61302f565b9052565b8051825260006020820151606060208501526130916060850182612f52565b9050604083015184820360408601526130aa8282612f52565b95945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015610b16577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301895261310c838351613072565b988401989250908301906001016130d2565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156132ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc089840301855281516060815181865261318c828701825161305e565b8981015160806131a78189018367ffffffffffffffff169052565b8a830151915060a06131bd818a018460ff169052565b938301519360c092506131db8984018667ffffffffffffffff169052565b818401519450610100915060e082818b01526131fb6101608b0187612f52565b95508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0808b880301848c01526132378784612f52565b948601518b860382016101208d015294965061325387866130b3565b9650818601519550808b8803016101408c015250505050506132758282612f52565b915050888201516132918a87018267ffffffffffffffff169052565b5090870151938701939093529386019390860190600101613147565b509098975050505050505050565b6000602082840312156132cd57600080fd5b8135610fa881612fc9565b600080604083850312156132eb57600080fd5b50508035926020909101359150565b805160608084528151908401819052600091602091908201906080860190845b818110156133365783518352928401929184019160010161331a565b505060ff602086015116602087015260408501519250858103604087015261335e8184612f52565b9695505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156132ad578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff1684528701518784018790526133e5878501826132fa565b9588019593505090860190600101613391565b60006020828403121561340a57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610fa857600080fd5b60008083601f84011261344057600080fd5b50813567ffffffffffffffff81111561345857600080fd5b6020830191508360208260051b850101111561347357600080fd5b9250929050565b6000806000806040858703121561349057600080fd5b843567ffffffffffffffff808211156134a857600080fd5b6134b48883890161342e565b909650945060208701359150808211156134cd57600080fd5b506134da8782880161342e565b95989497509550505050565b803567ffffffffffffffff81168114612fe657600080fd5b6000806000806000806080878903121561351757600080fd5b863567ffffffffffffffff8082111561352f57600080fd5b61353b8a838b0161342e565b9098509650602089013591508082111561355457600080fd5b818901915089601f83011261356857600080fd5b81358181111561357757600080fd5b8a602082850101111561358957600080fd5b6020830196508095505050506135a1604088016134e6565b91506135af60608801612fdb565b90509295509295509295565b600181811c908216806135cf57607f821691505b602082108103613608577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176102fc576102fc61360e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b808201808211156102fc576102fc61360e565b818103818111156102fc576102fc61360e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156136ea57600080fd5b610fa8826134e6565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261372757600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261372757600080fd5b6040516060810167ffffffffffffffff8111828210171561378857613788613654565b60405290565b604051610100810167ffffffffffffffff8111828210171561378857613788613654565b60405160e0810167ffffffffffffffff8111828210171561378857613788613654565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561381c5761381c613654565b604052919050565b600067ffffffffffffffff82111561383e5761383e613654565b5060051b60200190565b803560ff81168114612fe657600080fd5b600082601f83011261386a57600080fd5b813567ffffffffffffffff81111561388457613884613654565b6138b560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016137d5565b8181528460208386010111156138ca57600080fd5b816020850160208301376000918101602001919091529392505050565b6000606082360312156138f957600080fd5b613901613765565b823567ffffffffffffffff8082111561391957600080fd5b9084019036601f83011261392c57600080fd5b8135602061394161393c83613824565b6137d5565b82815260059290921b8401810191818101903684111561396057600080fd5b948201945b8386101561397e57853582529482019490820190613965565b86525061398c878201613848565b908501525060408501359150808211156139a557600080fd5b506139b236828601613859565b60408301525092915050565b601f821115613a0a576000816000526020600020601f850160051c810160208610156139e75750805b601f850160051c820191505b81811015613a06578281556001016139f3565b5050505b505050565b815167ffffffffffffffff811115613a2957613a29613654565b613a3d81613a3784546135bb565b846139be565b602080601f831160018114613a905760008415613a5a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a06565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613add57888601518255948401946001909101908401613abe565b5085821015613b1957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83168152604060208201526000613b4c60408301846132fa565b949350505050565b600082601f830112613b6557600080fd5b81356020613b7561393c83613824565b82815260059290921b84018101918181019086841115613b9457600080fd5b8286015b84811015613c5c57803567ffffffffffffffff80821115613bb95760008081fd5b81890191506060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215613bf25760008081fd5b613bfa613765565b87840135815260408085013584811115613c145760008081fd5b613c228e8b83890101613859565b838b015250918401359183831115613c3a5760008081fd5b613c488d8a85880101613859565b908201528652505050918301918301613b98565b509695505050505050565b60006020808385031215613c7a57600080fd5b823567ffffffffffffffff80821115613c9257600080fd5b818501915085601f830112613ca657600080fd5b8135613cb461393c82613824565b81815260059190911b83018401908481019088831115613cd357600080fd5b8585015b83811015613e1457803585811115613cee57600080fd5b8601610100818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001811315613d2457600080fd5b613d2c61378e565b613d378a8401612feb565b8152613d45604084016134e6565b8a820152613d5560608401613848565b6040820152613d66608084016134e6565b606082015260a083013588811115613d7d57600080fd5b613d8b8e8c83870101613859565b60808301525060c083013588811115613da45760008081fd5b613db28e8c83870101613859565b60a08301525060e08084013589811115613dcc5760008081fd5b613dda8f8d83880101613b54565b60c084015250918301359188831115613df35760008081fd5b613e018e8c85870101613859565b9082015285525050918601918601613cd7565b5098975050505050505050565b8051612fe681612fc9565b600082601f830112613e3d57600080fd5b81516020613e4d61393c83613824565b8083825260208201915060208460051b870101935086841115613e6f57600080fd5b602086015b84811015613c5c5780518352918301918301613e74565b600060208284031215613e9d57600080fd5b815167ffffffffffffffff80821115613eb557600080fd5b9083019060e08286031215613ec957600080fd5b613ed16137b2565b613eda83613e21565b8152613ee860208401613e21565b6020820152613ef960408401613e21565b6040820152606083015160608201526080830151608082015260a083015182811115613f2457600080fd5b613f3087828601613e2c565b60a08301525060c083015182811115613f4857600080fd5b613f5487828601613e2c565b60c08301525095945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f9457613f9461360e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8181036000831280158383131683831282161715611f0857611f0861360e565b6003811061306e5761306e61302f565b604081016140088285613fea565b610fa86020830184613fea565b67ffffffffffffffff818116838216019080821115611f0857611f0861360e565b602081526000610fa86020830184613072565b600061014067ffffffffffffffff808e168452602063ffffffff8e1681860152614076604086018e61305e565b8260608601526140888386018d612f52565b9250848303608086015261409c838c612f52565b918a1660a086015284820360c0860152885180835291925080830191600581901b84018201828b0160005b83811015614113577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0878403018652614101838351613072565b958501959250908401906001016140c7565b505060ff8a1660e088015267ffffffffffffffff89166101008801528681036101208801526141428189612f52565b955050505050509b9a505050505050505050505056fea164736f6c6343000818000a",
-}
-
-var CCIPConfigABI = CCIPConfigMetaData.ABI
-
-var CCIPConfigBin = CCIPConfigMetaData.Bin
-
-func DeployCCIPConfig(auth *bind.TransactOpts, backend bind.ContractBackend, capabilitiesRegistry common.Address) (common.Address, *types.Transaction, *CCIPConfig, error) {
- parsed, err := CCIPConfigMetaData.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(CCIPConfigBin), backend, capabilitiesRegistry)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &CCIPConfig{address: address, abi: *parsed, CCIPConfigCaller: CCIPConfigCaller{contract: contract}, CCIPConfigTransactor: CCIPConfigTransactor{contract: contract}, CCIPConfigFilterer: CCIPConfigFilterer{contract: contract}}, nil
-}
-
-type CCIPConfig struct {
- address common.Address
- abi abi.ABI
- CCIPConfigCaller
- CCIPConfigTransactor
- CCIPConfigFilterer
-}
-
-type CCIPConfigCaller struct {
- contract *bind.BoundContract
-}
-
-type CCIPConfigTransactor struct {
- contract *bind.BoundContract
-}
-
-type CCIPConfigFilterer struct {
- contract *bind.BoundContract
-}
-
-type CCIPConfigSession struct {
- Contract *CCIPConfig
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type CCIPConfigCallerSession struct {
- Contract *CCIPConfigCaller
- CallOpts bind.CallOpts
-}
-
-type CCIPConfigTransactorSession struct {
- Contract *CCIPConfigTransactor
- TransactOpts bind.TransactOpts
-}
-
-type CCIPConfigRaw struct {
- Contract *CCIPConfig
-}
-
-type CCIPConfigCallerRaw struct {
- Contract *CCIPConfigCaller
-}
-
-type CCIPConfigTransactorRaw struct {
- Contract *CCIPConfigTransactor
-}
-
-func NewCCIPConfig(address common.Address, backend bind.ContractBackend) (*CCIPConfig, error) {
- abi, err := abi.JSON(strings.NewReader(CCIPConfigABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindCCIPConfig(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &CCIPConfig{address: address, abi: abi, CCIPConfigCaller: CCIPConfigCaller{contract: contract}, CCIPConfigTransactor: CCIPConfigTransactor{contract: contract}, CCIPConfigFilterer: CCIPConfigFilterer{contract: contract}}, nil
-}
-
-func NewCCIPConfigCaller(address common.Address, caller bind.ContractCaller) (*CCIPConfigCaller, error) {
- contract, err := bindCCIPConfig(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &CCIPConfigCaller{contract: contract}, nil
-}
-
-func NewCCIPConfigTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPConfigTransactor, error) {
- contract, err := bindCCIPConfig(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &CCIPConfigTransactor{contract: contract}, nil
-}
-
-func NewCCIPConfigFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPConfigFilterer, error) {
- contract, err := bindCCIPConfig(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &CCIPConfigFilterer{contract: contract}, nil
-}
-
-func bindCCIPConfig(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := CCIPConfigMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_CCIPConfig *CCIPConfigRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _CCIPConfig.Contract.CCIPConfigCaller.contract.Call(opts, result, method, params...)
-}
-
-func (_CCIPConfig *CCIPConfigRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _CCIPConfig.Contract.CCIPConfigTransactor.contract.Transfer(opts)
-}
-
-func (_CCIPConfig *CCIPConfigRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _CCIPConfig.Contract.CCIPConfigTransactor.contract.Transact(opts, method, params...)
-}
-
-func (_CCIPConfig *CCIPConfigCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _CCIPConfig.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_CCIPConfig *CCIPConfigTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _CCIPConfig.Contract.contract.Transfer(opts)
-}
-
-func (_CCIPConfig *CCIPConfigTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _CCIPConfig.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_CCIPConfig *CCIPConfigCaller) GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPConfigTypesChainConfigInfo, error) {
- var out []interface{}
- err := _CCIPConfig.contract.Call(opts, &out, "getAllChainConfigs", pageIndex, pageSize)
-
- if err != nil {
- return *new([]CCIPConfigTypesChainConfigInfo), err
- }
-
- out0 := *abi.ConvertType(out[0], new([]CCIPConfigTypesChainConfigInfo)).(*[]CCIPConfigTypesChainConfigInfo)
-
- return out0, err
-
-}
-
-func (_CCIPConfig *CCIPConfigSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPConfigTypesChainConfigInfo, error) {
- return _CCIPConfig.Contract.GetAllChainConfigs(&_CCIPConfig.CallOpts, pageIndex, pageSize)
-}
-
-func (_CCIPConfig *CCIPConfigCallerSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPConfigTypesChainConfigInfo, error) {
- return _CCIPConfig.Contract.GetAllChainConfigs(&_CCIPConfig.CallOpts, pageIndex, pageSize)
-}
-
-func (_CCIPConfig *CCIPConfigCaller) GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error) {
- var out []interface{}
- err := _CCIPConfig.contract.Call(opts, &out, "getCapabilityConfiguration", arg0)
-
- if err != nil {
- return *new([]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
-
- return out0, err
-
-}
-
-func (_CCIPConfig *CCIPConfigSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) {
- return _CCIPConfig.Contract.GetCapabilityConfiguration(&_CCIPConfig.CallOpts, arg0)
-}
-
-func (_CCIPConfig *CCIPConfigCallerSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) {
- return _CCIPConfig.Contract.GetCapabilityConfiguration(&_CCIPConfig.CallOpts, arg0)
-}
-
-func (_CCIPConfig *CCIPConfigCaller) GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) {
- var out []interface{}
- err := _CCIPConfig.contract.Call(opts, &out, "getCapabilityRegistry")
-
- if err != nil {
- return *new(common.Address), err
- }
-
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
- return out0, err
-
-}
-
-func (_CCIPConfig *CCIPConfigSession) GetCapabilityRegistry() (common.Address, error) {
- return _CCIPConfig.Contract.GetCapabilityRegistry(&_CCIPConfig.CallOpts)
-}
-
-func (_CCIPConfig *CCIPConfigCallerSession) GetCapabilityRegistry() (common.Address, error) {
- return _CCIPConfig.Contract.GetCapabilityRegistry(&_CCIPConfig.CallOpts)
-}
-
-func (_CCIPConfig *CCIPConfigCaller) GetNumChainConfigurations(opts *bind.CallOpts) (*big.Int, error) {
- var out []interface{}
- err := _CCIPConfig.contract.Call(opts, &out, "getNumChainConfigurations")
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_CCIPConfig *CCIPConfigSession) GetNumChainConfigurations() (*big.Int, error) {
- return _CCIPConfig.Contract.GetNumChainConfigurations(&_CCIPConfig.CallOpts)
-}
-
-func (_CCIPConfig *CCIPConfigCallerSession) GetNumChainConfigurations() (*big.Int, error) {
- return _CCIPConfig.Contract.GetNumChainConfigurations(&_CCIPConfig.CallOpts)
-}
-
-func (_CCIPConfig *CCIPConfigCaller) GetOCRConfig(opts *bind.CallOpts, donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error) {
- var out []interface{}
- err := _CCIPConfig.contract.Call(opts, &out, "getOCRConfig", donId, pluginType)
-
- if err != nil {
- return *new([]CCIPConfigTypesOCR3ConfigWithMeta), err
- }
-
- out0 := *abi.ConvertType(out[0], new([]CCIPConfigTypesOCR3ConfigWithMeta)).(*[]CCIPConfigTypesOCR3ConfigWithMeta)
-
- return out0, err
-
-}
-
-func (_CCIPConfig *CCIPConfigSession) GetOCRConfig(donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error) {
- return _CCIPConfig.Contract.GetOCRConfig(&_CCIPConfig.CallOpts, donId, pluginType)
-}
-
-func (_CCIPConfig *CCIPConfigCallerSession) GetOCRConfig(donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error) {
- return _CCIPConfig.Contract.GetOCRConfig(&_CCIPConfig.CallOpts, donId, pluginType)
-}
-
-func (_CCIPConfig *CCIPConfigCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
- var out []interface{}
- err := _CCIPConfig.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 (_CCIPConfig *CCIPConfigSession) Owner() (common.Address, error) {
- return _CCIPConfig.Contract.Owner(&_CCIPConfig.CallOpts)
-}
-
-func (_CCIPConfig *CCIPConfigCallerSession) Owner() (common.Address, error) {
- return _CCIPConfig.Contract.Owner(&_CCIPConfig.CallOpts)
-}
-
-func (_CCIPConfig *CCIPConfigCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
- var out []interface{}
- err := _CCIPConfig.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 (_CCIPConfig *CCIPConfigSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
- return _CCIPConfig.Contract.SupportsInterface(&_CCIPConfig.CallOpts, interfaceId)
-}
-
-func (_CCIPConfig *CCIPConfigCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
- return _CCIPConfig.Contract.SupportsInterface(&_CCIPConfig.CallOpts, interfaceId)
-}
-
-func (_CCIPConfig *CCIPConfigCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
- var out []interface{}
- err := _CCIPConfig.contract.Call(opts, &out, "typeAndVersion")
-
- if err != nil {
- return *new(string), err
- }
-
- out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
- return out0, err
-
-}
-
-func (_CCIPConfig *CCIPConfigSession) TypeAndVersion() (string, error) {
- return _CCIPConfig.Contract.TypeAndVersion(&_CCIPConfig.CallOpts)
-}
-
-func (_CCIPConfig *CCIPConfigCallerSession) TypeAndVersion() (string, error) {
- return _CCIPConfig.Contract.TypeAndVersion(&_CCIPConfig.CallOpts)
-}
-
-func (_CCIPConfig *CCIPConfigTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _CCIPConfig.contract.Transact(opts, "acceptOwnership")
-}
-
-func (_CCIPConfig *CCIPConfigSession) AcceptOwnership() (*types.Transaction, error) {
- return _CCIPConfig.Contract.AcceptOwnership(&_CCIPConfig.TransactOpts)
-}
-
-func (_CCIPConfig *CCIPConfigTransactorSession) AcceptOwnership() (*types.Transaction, error) {
- return _CCIPConfig.Contract.AcceptOwnership(&_CCIPConfig.TransactOpts)
-}
-
-func (_CCIPConfig *CCIPConfigTransactor) ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPConfigTypesChainConfigInfo) (*types.Transaction, error) {
- return _CCIPConfig.contract.Transact(opts, "applyChainConfigUpdates", chainSelectorRemoves, chainConfigAdds)
-}
-
-func (_CCIPConfig *CCIPConfigSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPConfigTypesChainConfigInfo) (*types.Transaction, error) {
- return _CCIPConfig.Contract.ApplyChainConfigUpdates(&_CCIPConfig.TransactOpts, chainSelectorRemoves, chainConfigAdds)
-}
-
-func (_CCIPConfig *CCIPConfigTransactorSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPConfigTypesChainConfigInfo) (*types.Transaction, error) {
- return _CCIPConfig.Contract.ApplyChainConfigUpdates(&_CCIPConfig.TransactOpts, chainSelectorRemoves, chainConfigAdds)
-}
-
-func (_CCIPConfig *CCIPConfigTransactor) BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, config []byte, arg2 uint64, donId uint32) (*types.Transaction, error) {
- return _CCIPConfig.contract.Transact(opts, "beforeCapabilityConfigSet", arg0, config, arg2, donId)
-}
-
-func (_CCIPConfig *CCIPConfigSession) BeforeCapabilityConfigSet(arg0 [][32]byte, config []byte, arg2 uint64, donId uint32) (*types.Transaction, error) {
- return _CCIPConfig.Contract.BeforeCapabilityConfigSet(&_CCIPConfig.TransactOpts, arg0, config, arg2, donId)
-}
-
-func (_CCIPConfig *CCIPConfigTransactorSession) BeforeCapabilityConfigSet(arg0 [][32]byte, config []byte, arg2 uint64, donId uint32) (*types.Transaction, error) {
- return _CCIPConfig.Contract.BeforeCapabilityConfigSet(&_CCIPConfig.TransactOpts, arg0, config, arg2, donId)
-}
-
-func (_CCIPConfig *CCIPConfigTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
- return _CCIPConfig.contract.Transact(opts, "transferOwnership", to)
-}
-
-func (_CCIPConfig *CCIPConfigSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
- return _CCIPConfig.Contract.TransferOwnership(&_CCIPConfig.TransactOpts, to)
-}
-
-func (_CCIPConfig *CCIPConfigTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
- return _CCIPConfig.Contract.TransferOwnership(&_CCIPConfig.TransactOpts, to)
-}
-
-type CCIPConfigCapabilityConfigurationSetIterator struct {
- Event *CCIPConfigCapabilityConfigurationSet
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *CCIPConfigCapabilityConfigurationSetIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(CCIPConfigCapabilityConfigurationSet)
- 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(CCIPConfigCapabilityConfigurationSet)
- 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 *CCIPConfigCapabilityConfigurationSetIterator) Error() error {
- return it.fail
-}
-
-func (it *CCIPConfigCapabilityConfigurationSetIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type CCIPConfigCapabilityConfigurationSet struct {
- Raw types.Log
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPConfigCapabilityConfigurationSetIterator, error) {
-
- logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "CapabilityConfigurationSet")
- if err != nil {
- return nil, err
- }
- return &CCIPConfigCapabilityConfigurationSetIterator{contract: _CCIPConfig.contract, event: "CapabilityConfigurationSet", logs: logs, sub: sub}, nil
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigCapabilityConfigurationSet) (event.Subscription, error) {
-
- logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "CapabilityConfigurationSet")
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(CCIPConfigCapabilityConfigurationSet)
- if err := _CCIPConfig.contract.UnpackLog(event, "CapabilityConfigurationSet", 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 (_CCIPConfig *CCIPConfigFilterer) ParseCapabilityConfigurationSet(log types.Log) (*CCIPConfigCapabilityConfigurationSet, error) {
- event := new(CCIPConfigCapabilityConfigurationSet)
- if err := _CCIPConfig.contract.UnpackLog(event, "CapabilityConfigurationSet", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type CCIPConfigChainConfigRemovedIterator struct {
- Event *CCIPConfigChainConfigRemoved
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *CCIPConfigChainConfigRemovedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(CCIPConfigChainConfigRemoved)
- 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(CCIPConfigChainConfigRemoved)
- 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 *CCIPConfigChainConfigRemovedIterator) Error() error {
- return it.fail
-}
-
-func (it *CCIPConfigChainConfigRemovedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type CCIPConfigChainConfigRemoved struct {
- ChainSelector uint64
- Raw types.Log
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPConfigChainConfigRemovedIterator, error) {
-
- logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "ChainConfigRemoved")
- if err != nil {
- return nil, err
- }
- return &CCIPConfigChainConfigRemovedIterator{contract: _CCIPConfig.contract, event: "ChainConfigRemoved", logs: logs, sub: sub}, nil
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPConfigChainConfigRemoved) (event.Subscription, error) {
-
- logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "ChainConfigRemoved")
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(CCIPConfigChainConfigRemoved)
- if err := _CCIPConfig.contract.UnpackLog(event, "ChainConfigRemoved", 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 (_CCIPConfig *CCIPConfigFilterer) ParseChainConfigRemoved(log types.Log) (*CCIPConfigChainConfigRemoved, error) {
- event := new(CCIPConfigChainConfigRemoved)
- if err := _CCIPConfig.contract.UnpackLog(event, "ChainConfigRemoved", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type CCIPConfigChainConfigSetIterator struct {
- Event *CCIPConfigChainConfigSet
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *CCIPConfigChainConfigSetIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(CCIPConfigChainConfigSet)
- 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(CCIPConfigChainConfigSet)
- 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 *CCIPConfigChainConfigSetIterator) Error() error {
- return it.fail
-}
-
-func (it *CCIPConfigChainConfigSetIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type CCIPConfigChainConfigSet struct {
- ChainSelector uint64
- ChainConfig CCIPConfigTypesChainConfig
- Raw types.Log
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPConfigChainConfigSetIterator, error) {
-
- logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "ChainConfigSet")
- if err != nil {
- return nil, err
- }
- return &CCIPConfigChainConfigSetIterator{contract: _CCIPConfig.contract, event: "ChainConfigSet", logs: logs, sub: sub}, nil
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigChainConfigSet) (event.Subscription, error) {
-
- logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "ChainConfigSet")
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(CCIPConfigChainConfigSet)
- if err := _CCIPConfig.contract.UnpackLog(event, "ChainConfigSet", 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 (_CCIPConfig *CCIPConfigFilterer) ParseChainConfigSet(log types.Log) (*CCIPConfigChainConfigSet, error) {
- event := new(CCIPConfigChainConfigSet)
- if err := _CCIPConfig.contract.UnpackLog(event, "ChainConfigSet", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type CCIPConfigConfigSetIterator struct {
- Event *CCIPConfigConfigSet
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *CCIPConfigConfigSetIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(CCIPConfigConfigSet)
- 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(CCIPConfigConfigSet)
- 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 *CCIPConfigConfigSetIterator) Error() error {
- return it.fail
-}
-
-func (it *CCIPConfigConfigSetIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type CCIPConfigConfigSet struct {
- DonId uint32
- PluginType uint8
- Config []CCIPConfigTypesOCR3ConfigWithMeta
- Raw types.Log
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) FilterConfigSet(opts *bind.FilterOpts, donId []uint32, pluginType []uint8) (*CCIPConfigConfigSetIterator, error) {
-
- var donIdRule []interface{}
- for _, donIdItem := range donId {
- donIdRule = append(donIdRule, donIdItem)
- }
- var pluginTypeRule []interface{}
- for _, pluginTypeItem := range pluginType {
- pluginTypeRule = append(pluginTypeRule, pluginTypeItem)
- }
-
- logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "ConfigSet", donIdRule, pluginTypeRule)
- if err != nil {
- return nil, err
- }
- return &CCIPConfigConfigSetIterator{contract: _CCIPConfig.contract, event: "ConfigSet", logs: logs, sub: sub}, nil
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigConfigSet, donId []uint32, pluginType []uint8) (event.Subscription, error) {
-
- var donIdRule []interface{}
- for _, donIdItem := range donId {
- donIdRule = append(donIdRule, donIdItem)
- }
- var pluginTypeRule []interface{}
- for _, pluginTypeItem := range pluginType {
- pluginTypeRule = append(pluginTypeRule, pluginTypeItem)
- }
-
- logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "ConfigSet", donIdRule, pluginTypeRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(CCIPConfigConfigSet)
- if err := _CCIPConfig.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 (_CCIPConfig *CCIPConfigFilterer) ParseConfigSet(log types.Log) (*CCIPConfigConfigSet, error) {
- event := new(CCIPConfigConfigSet)
- if err := _CCIPConfig.contract.UnpackLog(event, "ConfigSet", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type CCIPConfigOwnershipTransferRequestedIterator struct {
- Event *CCIPConfigOwnershipTransferRequested
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *CCIPConfigOwnershipTransferRequestedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(CCIPConfigOwnershipTransferRequested)
- 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(CCIPConfigOwnershipTransferRequested)
- 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 *CCIPConfigOwnershipTransferRequestedIterator) Error() error {
- return it.fail
-}
-
-func (it *CCIPConfigOwnershipTransferRequestedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type CCIPConfigOwnershipTransferRequested struct {
- From common.Address
- To common.Address
- Raw types.Log
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPConfigOwnershipTransferRequestedIterator, 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 := _CCIPConfig.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
- if err != nil {
- return nil, err
- }
- return &CCIPConfigOwnershipTransferRequestedIterator{contract: _CCIPConfig.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPConfigOwnershipTransferRequested, 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 := _CCIPConfig.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(CCIPConfigOwnershipTransferRequested)
- if err := _CCIPConfig.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 (_CCIPConfig *CCIPConfigFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPConfigOwnershipTransferRequested, error) {
- event := new(CCIPConfigOwnershipTransferRequested)
- if err := _CCIPConfig.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type CCIPConfigOwnershipTransferredIterator struct {
- Event *CCIPConfigOwnershipTransferred
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *CCIPConfigOwnershipTransferredIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(CCIPConfigOwnershipTransferred)
- 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(CCIPConfigOwnershipTransferred)
- 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 *CCIPConfigOwnershipTransferredIterator) Error() error {
- return it.fail
-}
-
-func (it *CCIPConfigOwnershipTransferredIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type CCIPConfigOwnershipTransferred struct {
- From common.Address
- To common.Address
- Raw types.Log
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPConfigOwnershipTransferredIterator, 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 := _CCIPConfig.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
- if err != nil {
- return nil, err
- }
- return &CCIPConfigOwnershipTransferredIterator{contract: _CCIPConfig.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
-}
-
-func (_CCIPConfig *CCIPConfigFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPConfigOwnershipTransferred, 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 := _CCIPConfig.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(CCIPConfigOwnershipTransferred)
- if err := _CCIPConfig.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 (_CCIPConfig *CCIPConfigFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPConfigOwnershipTransferred, error) {
- event := new(CCIPConfigOwnershipTransferred)
- if err := _CCIPConfig.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-func (_CCIPConfig *CCIPConfig) ParseLog(log types.Log) (generated.AbigenLog, error) {
- switch log.Topics[0] {
- case _CCIPConfig.abi.Events["CapabilityConfigurationSet"].ID:
- return _CCIPConfig.ParseCapabilityConfigurationSet(log)
- case _CCIPConfig.abi.Events["ChainConfigRemoved"].ID:
- return _CCIPConfig.ParseChainConfigRemoved(log)
- case _CCIPConfig.abi.Events["ChainConfigSet"].ID:
- return _CCIPConfig.ParseChainConfigSet(log)
- case _CCIPConfig.abi.Events["ConfigSet"].ID:
- return _CCIPConfig.ParseConfigSet(log)
- case _CCIPConfig.abi.Events["OwnershipTransferRequested"].ID:
- return _CCIPConfig.ParseOwnershipTransferRequested(log)
- case _CCIPConfig.abi.Events["OwnershipTransferred"].ID:
- return _CCIPConfig.ParseOwnershipTransferred(log)
-
- default:
- return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
- }
-}
-
-func (CCIPConfigCapabilityConfigurationSet) Topic() common.Hash {
- return common.HexToHash("0x84ad7751b744c9e2ee77da1d902b428aec7f0a343d67a24bbe2142e6f58a8d0f")
-}
-
-func (CCIPConfigChainConfigRemoved) Topic() common.Hash {
- return common.HexToHash("0x2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0")
-}
-
-func (CCIPConfigChainConfigSet) Topic() common.Hash {
- return common.HexToHash("0x05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e0")
-}
-
-func (CCIPConfigConfigSet) Topic() common.Hash {
- return common.HexToHash("0xf4095525e757e2fec7f3d3ffb3482db215dbbc7e7c4f63a11e04529ea827171f")
-}
-
-func (CCIPConfigOwnershipTransferRequested) Topic() common.Hash {
- return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
-}
-
-func (CCIPConfigOwnershipTransferred) Topic() common.Hash {
- return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
-}
-
-func (_CCIPConfig *CCIPConfig) Address() common.Address {
- return _CCIPConfig.address
-}
-
-type CCIPConfigInterface interface {
- GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPConfigTypesChainConfigInfo, error)
-
- GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error)
-
- GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error)
-
- GetNumChainConfigurations(opts *bind.CallOpts) (*big.Int, error)
-
- GetOCRConfig(opts *bind.CallOpts, donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error)
-
- Owner(opts *bind.CallOpts) (common.Address, error)
-
- SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
-
- TypeAndVersion(opts *bind.CallOpts) (string, error)
-
- AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
-
- ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPConfigTypesChainConfigInfo) (*types.Transaction, error)
-
- BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, config []byte, arg2 uint64, donId uint32) (*types.Transaction, error)
-
- TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
-
- FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPConfigCapabilityConfigurationSetIterator, error)
-
- WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigCapabilityConfigurationSet) (event.Subscription, error)
-
- ParseCapabilityConfigurationSet(log types.Log) (*CCIPConfigCapabilityConfigurationSet, error)
-
- FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPConfigChainConfigRemovedIterator, error)
-
- WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPConfigChainConfigRemoved) (event.Subscription, error)
-
- ParseChainConfigRemoved(log types.Log) (*CCIPConfigChainConfigRemoved, error)
-
- FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPConfigChainConfigSetIterator, error)
-
- WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigChainConfigSet) (event.Subscription, error)
-
- ParseChainConfigSet(log types.Log) (*CCIPConfigChainConfigSet, error)
-
- FilterConfigSet(opts *bind.FilterOpts, donId []uint32, pluginType []uint8) (*CCIPConfigConfigSetIterator, error)
-
- WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigConfigSet, donId []uint32, pluginType []uint8) (event.Subscription, error)
-
- ParseConfigSet(log types.Log) (*CCIPConfigConfigSet, error)
-
- FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPConfigOwnershipTransferRequestedIterator, error)
-
- WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPConfigOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
-
- ParseOwnershipTransferRequested(log types.Log) (*CCIPConfigOwnershipTransferRequested, error)
-
- FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPConfigOwnershipTransferredIterator, error)
-
- WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPConfigOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
-
- ParseOwnershipTransferred(log types.Log) (*CCIPConfigOwnershipTransferred, error)
-
- ParseLog(log types.Log) (generated.AbigenLog, error)
-
- Address() common.Address
-}
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 6331211b4b..9a89029e16 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
@@ -28,6 +28,23 @@ var (
_ = abi.ConvertType
)
+type CCIPHomeOCR3Config struct {
+ PluginType uint8
+ ChainSelector uint64
+ FRoleDON uint8
+ OffchainConfigVersion uint64
+ OfframpAddress []byte
+ RmnHomeAddress []byte
+ Nodes []CCIPHomeOCR3Node
+ OffchainConfig []byte
+}
+
+type CCIPHomeOCR3Node struct {
+ P2pId [32]byte
+ SignerKey []byte
+ TransmitterKey []byte
+}
+
type InternalMerkleRoot struct {
SourceChainSelector uint64
OnRampAddress []byte
@@ -46,30 +63,11 @@ type RMNRemoteReport struct {
}
var EncodingUtilsMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DoNotDeploy\",\"type\":\"error\"},{\"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\":\"_rmnReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b50604051636f1e4f5f60e01b815260040160405180910390fdfe",
+ ABI: "[{\"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\"}]",
}
var EncodingUtilsABI = EncodingUtilsMetaData.ABI
-var EncodingUtilsBin = EncodingUtilsMetaData.Bin
-
-func DeployEncodingUtils(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *EncodingUtils, error) {
- parsed, err := EncodingUtilsMetaData.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(EncodingUtilsBin), backend)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &EncodingUtils{address: address, abi: *parsed, EncodingUtilsCaller: EncodingUtilsCaller{contract: contract}, EncodingUtilsTransactor: EncodingUtilsTransactor{contract: contract}, EncodingUtilsFilterer: EncodingUtilsFilterer{contract: contract}}, nil
-}
-
type EncodingUtils struct {
address common.Address
abi abi.ABI
@@ -186,16 +184,38 @@ func (_EncodingUtils *EncodingUtilsTransactorRaw) Transact(opts *bind.TransactOp
return _EncodingUtils.Contract.contract.Transact(opts, method, params...)
}
-func (_EncodingUtils *EncodingUtilsTransactor) RmnReport(opts *bind.TransactOpts, rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) {
- return _EncodingUtils.contract.Transact(opts, "_rmnReport", rmnReportVersion, rmnReport)
+func (_EncodingUtils *EncodingUtilsCaller) ExposeOCR3Config(opts *bind.CallOpts, config []CCIPHomeOCR3Config) ([]byte, error) {
+ var out []interface{}
+ err := _EncodingUtils.contract.Call(opts, &out, "exposeOCR3Config", config)
+
+ if err != nil {
+ return *new([]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+ return out0, err
+
}
-func (_EncodingUtils *EncodingUtilsSession) RmnReport(rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) {
- return _EncodingUtils.Contract.RmnReport(&_EncodingUtils.TransactOpts, rmnReportVersion, rmnReport)
+func (_EncodingUtils *EncodingUtilsSession) ExposeOCR3Config(config []CCIPHomeOCR3Config) ([]byte, error) {
+ return _EncodingUtils.Contract.ExposeOCR3Config(&_EncodingUtils.CallOpts, config)
}
-func (_EncodingUtils *EncodingUtilsTransactorSession) RmnReport(rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) {
- return _EncodingUtils.Contract.RmnReport(&_EncodingUtils.TransactOpts, rmnReportVersion, rmnReport)
+func (_EncodingUtils *EncodingUtilsCallerSession) ExposeOCR3Config(config []CCIPHomeOCR3Config) ([]byte, error) {
+ return _EncodingUtils.Contract.ExposeOCR3Config(&_EncodingUtils.CallOpts, config)
+}
+
+func (_EncodingUtils *EncodingUtilsTransactor) ExposeRmnReport(opts *bind.TransactOpts, rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) {
+ return _EncodingUtils.contract.Transact(opts, "exposeRmnReport", rmnReportVersion, rmnReport)
+}
+
+func (_EncodingUtils *EncodingUtilsSession) ExposeRmnReport(rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) {
+ return _EncodingUtils.Contract.ExposeRmnReport(&_EncodingUtils.TransactOpts, rmnReportVersion, rmnReport)
+}
+
+func (_EncodingUtils *EncodingUtilsTransactorSession) ExposeRmnReport(rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) {
+ return _EncodingUtils.Contract.ExposeRmnReport(&_EncodingUtils.TransactOpts, rmnReportVersion, rmnReport)
}
func (_EncodingUtils *EncodingUtils) Address() common.Address {
@@ -203,7 +223,9 @@ func (_EncodingUtils *EncodingUtils) Address() common.Address {
}
type EncodingUtilsInterface interface {
- RmnReport(opts *bind.TransactOpts, rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error)
+ ExposeOCR3Config(opts *bind.CallOpts, config []CCIPHomeOCR3Config) ([]byte, error)
+
+ ExposeRmnReport(opts *bind.TransactOpts, rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error)
Address() common.Address
}
diff --git a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
new file mode 100644
index 0000000000..3f1246dbb4
--- /dev/null
+++ b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
@@ -0,0 +1,1894 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package ccip_home
+
+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 CCIPHomeChainConfig struct {
+ Readers [][32]byte
+ FChain uint8
+ Config []byte
+}
+
+type CCIPHomeChainConfigArgs struct {
+ ChainSelector uint64
+ ChainConfig CCIPHomeChainConfig
+}
+
+type CCIPHomeOCR3Config struct {
+ PluginType uint8
+ ChainSelector uint64
+ FRoleDON uint8
+ OffchainConfigVersion uint64
+ OfframpAddress []byte
+ RmnHomeAddress []byte
+ Nodes []CCIPHomeOCR3Node
+ OffchainConfig []byte
+}
+
+type CCIPHomeOCR3Node struct {
+ P2pId [32]byte
+ SignerKey []byte
+ TransmitterKey []byte
+}
+
+type CCIPHomeVersionedConfig struct {
+ Version uint32
+ ConfigDigest [32]byte
+ Config CCIPHomeOCR3Config
+}
+
+var CCIPHomeMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"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\":[{\"internalType\":\"bytes32\",\"name\":\"currentActiveDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"currentCandidateDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"proposedActiveDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"proposedCandidateDigest\",\"type\":\"bytes32\"}],\"name\":\"InvalidStateTransition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoOpStateTransitionNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[],\"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\":\"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: "0x60a0604052600680546001600160401b03191690553480156200002157600080fd5b5060405162004eb738038062004eb78339810160408190526200004491620001b6565b33806000816200009b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000ce57620000ce816200010b565b5050506001600160a01b038116620000f9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001e8565b336001600160a01b03821603620001655760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000092565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001c957600080fd5b81516001600160a01b0381168114620001e157600080fd5b9392505050565b608051614ca56200021260003960008181610180015281816122730152612c880152614ca56000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063b74b235611610081578063f2fde38b11610066578063f2fde38b14610356578063f442c89a14610369578063fba64a7c1461037c57600080fd5b8063b74b235614610323578063bae4e0fa1461034357600080fd5b80638318ed5d116100b25780638318ed5d146102d15780638da5cb5b146102f2578063922ea4061461031057600080fd5b806379ba5097146102c15780637ac0d41e146102c957600080fd5b80633df45a72116101245780635a837f97116101095780635a837f97146102785780635f1edd9c1461028d5780637524051a146102ae57600080fd5b80633df45a721461022f5780634851d5491461025057600080fd5b806301ffc9a714610156578063020330e61461017e578063181f5a77146101c557806333d9704a1461020e575b600080fd5b6101696101643660046130e2565b61038f565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6102016040518060400160405280601281526020017f43434950486f6d6520312e362e302d646576000000000000000000000000000081525081565b6040516101759190613192565b61022161021c3660046131df565b610428565b604051610175929190613437565b61024261023d36600461345b565b610922565b604051610175929190613494565b61026361025e36600461345b565b61123c565b60408051928352602083019190915201610175565b61028b6102863660046134b9565b61134c565b005b6102a061029b36600461345b565b611639565b604051908152602001610175565b61028b6102bc3660046131df565b6116be565b61028b6118ad565b6102a06119aa565b6102016102df3660046134ff565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff166101a0565b6102a061031e36600461345b565b6119bb565b61033661033136600461351c565b611a1d565b60405161017591906135ac565b6102a061035136600461364a565b611c9e565b61028b6103643660046136ba565b611ea8565b61028b610377366004613735565b611ebc565b61028b61038a3660046137c2565b61225b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea72100000000000000000000000000000000000000000000000000000000148061042257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610430612f6b565b6000805b60028110156109145763ffffffff86166000908152600560205260408120859187600181111561046657610466613220565b600181111561047757610477613220565b815260200190815260200160002082600281106104965761049661387f565b60070201600101541480156104aa57508315155b1561090c5763ffffffff86166000908152600560205260408120908660018111156104d7576104d7613220565b60018111156104e8576104e8613220565b815260200190815260200160002081600281106105075761050761387f565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054939592949386938501929190829060ff168781111561056057610560613220565b600181111561057157610571613220565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916105c9906138ae565b80601f01602080910402602001604051908101604052809291908181526020018280546105f5906138ae565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050815260200160028201805461065b906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610687906138ae565b80156106d45780601f106106a9576101008083540402835291602001916106d4565b820191906000526020600020905b8154815290600101906020018083116106b757829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561086257838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461073f906138ae565b80601f016020809104026020016040519081016040528092919081815260200182805461076b906138ae565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b505050505081526020016002820180546107d1906138ae565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd906138ae565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b50505050508152505081526020019060010190610702565b50505050815260200160048201805461087a906138ae565b80601f01602080910402602001604051908101604052809291908181526020018280546108a6906138ae565b80156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b505050505081525050815250509150925092505061091a565b600101610434565b50600090505b935093915050565b61092a612f6b565b610932612f6b565b63ffffffff841660009081526005602052604081208185600181111561095a5761095a613220565b600181111561096b5761096b613220565b815260200190815260200160002061099160065463ffffffff6401000000009091041690565b63ffffffff16600281106109a7576109a761387f565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff90911690811115610a0257610a02613220565b6001811115610a1357610a13613220565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610a6b906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610a97906138ae565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b50505050508152602001600282018054610afd906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610b29906138ae565b8015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015610d04578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054610be1906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d906138ae565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b50505050508152602001600282018054610c73906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f906138ae565b8015610cec5780601f10610cc157610100808354040283529160200191610cec565b820191906000526020600020905b815481529060010190602001808311610ccf57829003601f168201915b50505050508152505081526020019060010190610ba4565b505050508152602001600482018054610d1c906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610d48906138ae565b8015610d955780601f10610d6a57610100808354040283529160200191610d95565b820191906000526020600020905b815481529060010190602001808311610d7857829003601f168201915b50505091909252505050905250602081015190915015610db3578092505b63ffffffff8516600090815260056020526040812081866001811115610ddb57610ddb613220565b6001811115610dec57610dec613220565b81526020810191909152604001600020600654640100000000900463ffffffff1660011863ffffffff1660028110610e2657610e2661387f565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff90911690811115610e8157610e81613220565b6001811115610e9257610e92613220565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610eea906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610f16906138ae565b8015610f635780601f10610f3857610100808354040283529160200191610f63565b820191906000526020600020905b815481529060010190602001808311610f4657829003601f168201915b50505050508152602001600282018054610f7c906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa8906138ae565b8015610ff55780601f10610fca57610100808354040283529160200191610ff5565b820191906000526020600020905b815481529060010190602001808311610fd857829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015611183578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054611060906138ae565b80601f016020809104026020016040519081016040528092919081815260200182805461108c906138ae565b80156110d95780601f106110ae576101008083540402835291602001916110d9565b820191906000526020600020905b8154815290600101906020018083116110bc57829003601f168201915b505050505081526020016002820180546110f2906138ae565b80601f016020809104026020016040519081016040528092919081815260200182805461111e906138ae565b801561116b5780601f106111405761010080835404028352916020019161116b565b820191906000526020600020905b81548152906001019060200180831161114e57829003601f168201915b50505050508152505081526020019060010190611023565b50505050815260200160048201805461119b906138ae565b80601f01602080910402602001604051908101604052809291908181526020018280546111c7906138ae565b80156112145780601f106111e957610100808354040283529160200191611214565b820191906000526020600020905b8154815290600101906020018083116111f757829003601f168201915b50505091909252505050905250602081015190915015611232578092505b50505b9250929050565b63ffffffff8216600090815260056020526040812081908184600181111561126657611266613220565b600181111561127757611277613220565b815260200190815260200160002061129d60065463ffffffff6401000000009091041690565b63ffffffff16600281106112b3576112b361387f565b6007020160010154600560008663ffffffff1663ffffffff16815260200190815260200160002060008560018111156112ee576112ee613220565b60018111156112ff576112ff613220565b81526020810191909152604001600020600654640100000000900463ffffffff1660011863ffffffff16600281106113395761133961387f565b6007020160010154915091509250929050565b611354612518565b81158015611360575080155b15611397576040517f7b4d1e4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065463ffffffff8581166000908152600560205260408120600164010000000090940483168418909216928592919087908111156113d8576113d8613220565b60018111156113e9576113e9613220565b815260200190815260200160002082600281106114085761140861387f565b6007020160010154146114bc5763ffffffff851660009081526005602052604081209085600181111561143d5761143d613220565b600181111561144e5761144e613220565b8152602001908152602001600020816002811061146d5761146d61387f565b6007020160010154836040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016114b3929190918252602082015260400190565b60405180910390fd5b63ffffffff85166000908152600560205260408120818660018111156114e4576114e4613220565b60018111156114f5576114f5613220565b815260200190815260200160002061151b60065463ffffffff6401000000009091041690565b63ffffffff16600281106115315761153161387f565b600702019050828160010154146115845760018101546040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016114b3565b60006001808301919091556006805463ffffffff6401000000008083048216909418169092027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905582156116065760405183907f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b890600090a25b60405184907ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e90600090a2505050505050565b63ffffffff821660009081526005602052604081208183600181111561166157611661613220565b600181111561167257611672613220565b815260200190815260200160002061169860065463ffffffff6401000000009091041690565b63ffffffff16600281106116ae576116ae61387f565b6007020160010154905092915050565b6116c6612518565b806116fd576040517f0849d8cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065463ffffffff84811660009081526005602052604081206001640100000000909404831684189092169284929190869081111561173e5761173e613220565b600181111561174f5761174f613220565b8152602001908152602001600020826002811061176e5761176e61387f565b6007020160010154146118195763ffffffff84166000908152600560205260408120908460018111156117a3576117a3613220565b60018111156117b4576117b4613220565b815260200190815260200160002081600281106117d3576117d361387f565b6007020160010154826040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016114b3929190918252602082015260400190565b60405182907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a263ffffffff841660009081526005602052604081209084600181111561186c5761186c613220565b600181111561187d5761187d613220565b8152602001908152602001600020816002811061189c5761189c61387f565b600702016001016000905550505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016114b3565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006119b66003612553565b905090565b63ffffffff82166000908152600560205260408120818360018111156119e3576119e3613220565b60018111156119f4576119f4613220565b81526020810191909152604001600020600654640100000000900463ffffffff16600118611698565b60606000611a2b6003612553565b90506000611a398486613930565b9050831580611a485750818110155b15611a88576040805160008082526020820190925290611a7e565b611a6b612fe7565b815260200190600190039081611a635790505b5092505050610422565b6000611a948583613976565b905082811115611aa15750815b6000611aad8383613989565b67ffffffffffffffff811115611ac557611ac5613947565b604051908082528060200260200182016040528015611afe57816020015b611aeb612fe7565b815260200190600190039081611ae35790505b5090506000611b0d600361255d565b9050835b83811015611c91576000828281518110611b2d57611b2d61387f565b60209081029190910181015160408051808201825267ffffffffffffffff831680825260009081526002855282902082518154608081880283018101909552606082018181529597509295860194909391928492849190840182828015611bb357602002820191906000526020600020905b815481526020019060010190808311611b9f575b5050509183525050600182015460ff166020820152600282018054604090920191611bdd906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611c09906138ae565b8015611c565780601f10611c2b57610100808354040283529160200191611c56565b820191906000526020600020905b815481529060010190602001808311611c3957829003601f168201915b50505091909252505050905284611c6d8885613989565b81518110611c7d57611c7d61387f565b602090810291909101015250600101611b11565b5090979650505050505050565b6000611ca8612518565b611cb9611cb484613c3f565b612571565b6000611cc586866119bb565b9050828114611d0a576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018490526044016114b3565b8015611d3c5760405183907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a25b60068054600091908290611d559063ffffffff16613d3b565b91906101000a81548163ffffffff021916908363ffffffff16021790559050611d9f878787604051602001611d8a9190614049565b604051602081830303815290604052846129df565b63ffffffff881660009081526005602052604081209194509081886001811115611dcb57611dcb613220565b6001811115611ddc57611ddc613220565b81526020810191909152604001600020600654640100000000900463ffffffff1660011863ffffffff1660028110611e1657611e1661387f565b600702016001810185905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff841617815590508560028201611e60828261456b565b905050837f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c68388604051611e95929190614732565b60405180910390a2505050949350505050565b611eb0612adb565b611eb981612b5c565b50565b611ec4612adb565b60005b838110156120aa57611f0b858583818110611ee457611ee461387f565b9050602002016020810190611ef99190614759565b60039067ffffffffffffffff16612c51565b611f7557848482818110611f2157611f2161387f565b9050602002016020810190611f369190614759565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016114b3565b60026000868684818110611f8b57611f8b61387f565b9050602002016020810190611fa09190614759565b67ffffffffffffffff1681526020810191909152604001600090812090611fc7828261302a565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611fff600283016000613048565b505061203d8585838181106120165761201661387f565b905060200201602081019061202b9190614759565b60039067ffffffffffffffff16612c69565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f08585838181106120715761207161387f565b90506020020160208101906120869190614759565b60405167ffffffffffffffff909116815260200160405180910390a1600101611ec7565b5060005b818110156122545760008383838181106120ca576120ca61387f565b90506020028101906120dc9190614776565b6120ea9060208101906142b0565b6120f3906147aa565b905060008484848181106121095761210961387f565b905060200281019061211b9190614776565b612129906020810190614759565b90506121388260000151612c75565b816020015160ff16600003612179576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff811660009081526002602090815260409091208351805185936121a9928492910190613082565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055604082015160028201906121f6908261487c565b5061221091506003905067ffffffffffffffff8316612dc1565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051612242929190614996565b60405180910390a150506001016120ae565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146122ca576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006122d960048286886149b9565b6122e2916149e3565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa000000000000000000000000000000000000000000000000000000001480159061237857507fffffffff0000000000000000000000000000000000000000000000000000000081167f7524051a0000000000000000000000000000000000000000000000000000000014155b80156123c657507fffffffff0000000000000000000000000000000000000000000000000000000081167f5a837f970000000000000000000000000000000000000000000000000000000014155b15612421576040517f12ba286f0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016114b3565b60006124316024600487896149b9565b81019061243e9190614a2b565b90508263ffffffff16811461248f576040517f8a6e4ce800000000000000000000000000000000000000000000000000000000815263ffffffff8083166004830152841660248201526044016114b3565b6000803073ffffffffffffffffffffffffffffffffffffffff1688886040516124b9929190614a44565b6000604051808303816000865af19150503d80600081146124f6576040519150601f19603f3d011682016040523d82523d6000602084013e6124fb565b606091505b50915091508161250c573d60208201fd5b50505050505050505050565b333014612551576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000610422825490565b6060600061256a83612dcd565b9392505050565b806020015167ffffffffffffffff166000036125b9576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815160018111156125ce576125ce613220565b141580156125ef57506001815160018111156125ec576125ec613220565b14155b15612626576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080810151511580612663575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b1561269a576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a08101515115806126d75750604080516000602082015201604051602081830303815290604052805190602001208160a0015180519060200120145b1561270e576040517fdee9857400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516127299060039067ffffffffffffffff16612c51565b6127715760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016114b3565b60408082015160208084015167ffffffffffffffff1660009081526002909152919091206001015460ff9182169116818111156127e4576040517f2db2204000000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016114b3565b60c083015151610100811115612826576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612831836003613930565b8111612869576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808267ffffffffffffffff81111561288557612885613947565b6040519080825280602002602001820160405280156128ae578160200160208202803683370190505b50905060005b8381101561296e5760008760c0015182815181106128d4576128d461387f565b602002602001015190508060400151516000146128f957836128f581614a54565b9450505b602081015151158061290a57508051155b1561294357806040517f9fa403140000000000000000000000000000000000000000000000000000000081526004016114b39190614a8c565b806000015183838151811061295a5761295a61387f565b6020908102919091010152506001016128b4565b50600061297c856003613930565b612987906001613976565b9050808310156129cd576040517f548dd21f00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016114b3565b6129d682612c75565b50505050505050565b6040516000907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90612a3d907f45564d000000000000000000000000000000000000000000000000000000000090469030908a908a908990602001614a9f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612a7a918690602001614af8565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120167e0a0000000000000000000000000000000000000000000000000000000000001795945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016114b3565b3373ffffffffffffffffffffffffffffffffffffffff821603612bdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016114b3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600183016020526040812054151561256a565b600061256a8383612e29565b60005b8151811015612dbd5760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe848481518110612cd457612cd461387f565b60200260200101516040518263ffffffff1660e01b8152600401612cfa91815260200190565b600060405180830381865afa158015612d17573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612d5d9190810190614b91565b6080015103612db557818181518110612d7857612d7861387f565b60200260200101516040517f8907a4fa0000000000000000000000000000000000000000000000000000000081526004016114b391815260200190565b600101612c78565b5050565b600061256a8383612f1c565b606081600001805480602002602001604051908101604052809291908181526020018280548015612e1d57602002820191906000526020600020905b815481526020019060010190808311612e09575b50505050509050919050565b60008181526001830160205260408120548015612f12576000612e4d600183613989565b8554909150600090612e6190600190613989565b9050808214612ec6576000866000018281548110612e8157612e8161387f565b9060005260206000200154905080876000018481548110612ea457612ea461387f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ed757612ed7614c69565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610422565b6000915050610422565b6000818152600183016020526040812054612f6357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610422565b506000610422565b6040805160608101825260008082526020820152908101612fe26040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b905290565b6040518060400160405280600067ffffffffffffffff168152602001612fe2604051806060016040528060608152602001600060ff168152602001606081525090565b5080546000825590600052602060002090810190611eb991906130cd565b508054613054906138ae565b6000825580601f10613064575050565b601f016020900490600052602060002090810190611eb991906130cd565b8280548282559060005260206000209081019282156130bd579160200282015b828111156130bd5782518255916020019190600101906130a2565b506130c99291506130cd565b5090565b5b808211156130c957600081556001016130ce565b6000602082840312156130f457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461256a57600080fd5b60005b8381101561313f578181015183820152602001613127565b50506000910152565b60008151808452613160816020860160208601613124565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061256a6020830184613148565b63ffffffff81168114611eb957600080fd5b80356131c2816131a5565b919050565b60028110611eb957600080fd5b80356131c2816131c7565b6000806000606084860312156131f457600080fd5b83356131ff816131a5565b9250602084013561320f816131c7565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613286577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8051825260006020820151606060208501526132a96060850182613148565b9050604083015184820360408601526132c28282613148565b95945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015611c91577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301895261332483835161328a565b988401989250908301906001016132ea565b63ffffffff815116825260208101516020830152600060408201516060604085015261336660608501825161324f565b602081015167ffffffffffffffff8116608086015250604081015160ff811660a086015250606081015167ffffffffffffffff811660c08601525060808101516101008060e08701526133bd610160870183613148565b915060a08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08088850301838901526133f88483613148565b935060c08501519250808885030161012089015261341684846132cb565b935060e0850151945080888503016101408901525050506132c28183613148565b60408152600061344a6040830185613336565b905082151560208301529392505050565b6000806040838503121561346e57600080fd5b8235613479816131a5565b91506020830135613489816131c7565b809150509250929050565b6040815260006134a76040830185613336565b82810360208401526132c28185613336565b600080600080608085870312156134cf57600080fd5b84356134da816131a5565b935060208501356134ea816131c7565b93969395505050506040820135916060013590565b60006020828403121561351157600080fd5b813561256a816131a5565b6000806040838503121561352f57600080fd5b50508035926020909101359150565b805160608084528151908401819052600091602091908201906080860190845b8181101561357a5783518352928401929184019160010161355e565b505060ff60208601511660208701526040850151925085810360408701526135a28184613148565b9695505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101561363c578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff1684528701518784018790526136298785018261353e565b95880195935050908601906001016135d5565b509098975050505050505050565b6000806000806080858703121561366057600080fd5b843561366b816131a5565b9350602085013561367b816131c7565b9250604085013567ffffffffffffffff81111561369757600080fd5b850161010081880312156136aa57600080fd5b9396929550929360600135925050565b6000602082840312156136cc57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461256a57600080fd5b60008083601f84011261370257600080fd5b50813567ffffffffffffffff81111561371a57600080fd5b6020830191508360208260051b850101111561123557600080fd5b6000806000806040858703121561374b57600080fd5b843567ffffffffffffffff8082111561376357600080fd5b61376f888389016136f0565b9096509450602087013591508082111561378857600080fd5b50613795878288016136f0565b95989497509550505050565b67ffffffffffffffff81168114611eb957600080fd5b80356131c2816137a1565b600080600080600080608087890312156137db57600080fd5b863567ffffffffffffffff808211156137f357600080fd5b6137ff8a838b016136f0565b9098509650602089013591508082111561381857600080fd5b818901915089601f83011261382c57600080fd5b81358181111561383b57600080fd5b8a602082850101111561384d57600080fd5b602083019650809550505050613865604088016137b7565b9150613873606088016131b7565b90509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c908216806138c257607f821691505b6020821081036138fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761042257610422613901565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8082018082111561042257610422613901565b8181038181111561042257610422613901565b6040516060810167ffffffffffffffff811182821017156139bf576139bf613947565b60405290565b604051610100810167ffffffffffffffff811182821017156139bf576139bf613947565b60405160e0810167ffffffffffffffff811182821017156139bf576139bf613947565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5357613a53613947565b604052919050565b60ff81168114611eb957600080fd5b80356131c281613a5b565b600082601f830112613a8657600080fd5b813567ffffffffffffffff811115613aa057613aa0613947565b613ad160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613a0c565b818152846020838601011115613ae657600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115613b1d57613b1d613947565b5060051b60200190565b600082601f830112613b3857600080fd5b81356020613b4d613b4883613b03565b613a0c565b82815260059290921b84018101918181019086841115613b6c57600080fd5b8286015b84811015613c3457803567ffffffffffffffff80821115613b915760008081fd5b81890191506060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215613bca5760008081fd5b613bd261399c565b87840135815260408085013584811115613bec5760008081fd5b613bfa8e8b83890101613a75565b838b015250918401359183831115613c125760008081fd5b613c208d8a85880101613a75565b908201528652505050918301918301613b70565b509695505050505050565b60006101008236031215613c5257600080fd5b613c5a6139c5565b613c63836131d4565b8152613c71602084016137b7565b6020820152613c8260408401613a6a565b6040820152613c93606084016137b7565b6060820152608083013567ffffffffffffffff80821115613cb357600080fd5b613cbf36838701613a75565b608084015260a0850135915080821115613cd857600080fd5b613ce436838701613a75565b60a084015260c0850135915080821115613cfd57600080fd5b613d0936838701613b27565b60c084015260e0850135915080821115613d2257600080fd5b50613d2f36828601613a75565b60e08301525092915050565b600063ffffffff808316818103613d5457613d54613901565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d9357600080fd5b830160208101925035905067ffffffffffffffff811115613db357600080fd5b80360382131561123557600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e4057600080fd5b830160208101925035905067ffffffffffffffff811115613e6057600080fd5b8060051b360382131561123557600080fd5b60008383855260208086019550808560051b830101846000805b88811015613f4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868503018a5282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1893603018112613eec578283fd5b8801803585526060613f0087830183613d5e565b8289890152613f128389018284613dc2565b925050506040613f2481840184613d5e565b935087830382890152613f38838583613dc2565b9d89019d97505050938601935050600101613e8c565b509198975050505050505050565b6000610100613f7384613f6e856131d4565b61324f565b613f7f602084016137b7565b67ffffffffffffffff166020850152613f9a60408401613a6a565b60ff166040850152613fae606084016137b7565b67ffffffffffffffff166060850152613fca6080840184613d5e565b826080870152613fdd8387018284613dc2565b92505050613fee60a0840184613d5e565b85830360a0870152614001838284613dc2565b9250505061401260c0840184613e0b565b85830360c0870152614025838284613e72565b9250505061403660e0840184613d5e565b85830360e08701526135a2838284613dc2565b60208152600061256a6020830184613f5c565b60008135610422816137a1565b6000813561042281613a5b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140ab57600080fd5b83018035915067ffffffffffffffff8211156140c657600080fd5b60200191503681900382131561123557600080fd5b5b81811015612dbd57600081556001016140dc565b601f82111561412957806000526020600020601f840160051c810160208510156141175750805b612254601f850160051c8301826140db565b505050565b67ffffffffffffffff83111561414657614146613947565b61415a8361415483546138ae565b836140f0565b6000601f8411600181146141ac57600085156141765750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355612254565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156141fb57868501358255602094850194600190920191016141db565b5086821015614236577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261427d57600080fd5b83018035915067ffffffffffffffff82111561429857600080fd5b6020019150600581901b360382131561123557600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126142e457600080fd5b9190910192915050565b6142f881546138ae565b8015612dbd57601f81116001811461431257505060009055565b826000526020600020614330601f840160051c8201600183016140db565b60008085559055505050565b81358155600180820160206143546020860186614076565b67ffffffffffffffff81111561436c5761436c613947565b6143808161437a86546138ae565b866140f0565b6000601f8211600181146143d2576000831561439c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178655614465565b6000868152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841690835b8281101561441e5786850135825593870193908901908701614401565b5084821015614459577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19848701351681555b505060018360011b0186555b505050505050506144796040830183614076565b61448781836002860161412e565b50505050565b680100000000000000008311156144a6576144a6613947565b805483825580841015614525576003816003026003810483146144cb576144cb613901565b856003026003810487146144e1576144e1613901565b6000858152602081209283019291909101905b828210156145205780825561450b600183016142ee565b614517600283016142ee565b908301906144f4565b505050505b5060008181526020812083915b858110156145635761454d61454784876142b0565b8361433c565b6020929092019160039190910190600101614532565b505050505050565b8135614576816131c7565b600281106145ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541660ff82168117835550506146246145ea6020840161405c565b82547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178255565b61466e61463360408401614069565b82547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178255565b6146c061467d6060840161405c565b82547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178255565b6146cd6080830183614076565b6146db81836001860161412e565b50506146ea60a0830183614076565b6146f881836002860161412e565b505061470760c0830183614248565b61471581836003860161448d565b505061472460e0830183614076565b61448781836004860161412e565b63ffffffff831681526040602082015260006147516040830184613f5c565b949350505050565b60006020828403121561476b57600080fd5b813561256a816137a1565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126142e457600080fd5b6000606082360312156147bc57600080fd5b6147c461399c565b823567ffffffffffffffff808211156147dc57600080fd5b9084019036601f8301126147ef57600080fd5b813560206147ff613b4883613b03565b82815260059290921b8401810191818101903684111561481e57600080fd5b948201945b8386101561483c57853582529482019490820190614823565b86525061484a878201613a6a565b9085015250604085013591508082111561486357600080fd5b5061487036828601613a75565b60408301525092915050565b815167ffffffffffffffff81111561489657614896613947565b6148aa816148a484546138ae565b846140f0565b602080601f8311600181146148fd57600084156148c75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614563565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561494a5788860151825594840194600190910190840161492b565b508582101561498657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83168152604060208201526000614751604083018461353e565b600080858511156149c957600080fd5b838611156149d657600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614a235780818660040360031b1b83161692505b505092915050565b600060208284031215614a3d57600080fd5b5035919050565b8183823760009101908152919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a8557614a85613901565b5060010190565b60208152600061256a602083018461328a565b8681526020810186905273ffffffffffffffffffffffffffffffffffffffff8516604082015263ffffffff848116606083015260c0820190614ae4608084018661324f565b80841660a084015250979650505050505050565b60008351614b0a818460208801613124565b835190830190614b1e818360208801613124565b01949350505050565b80516131c2816131a5565b600082601f830112614b4357600080fd5b81516020614b53613b4883613b03565b8083825260208201915060208460051b870101935086841115614b7557600080fd5b602086015b84811015613c345780518352918301918301614b7a565b600060208284031215614ba357600080fd5b815167ffffffffffffffff80821115614bbb57600080fd5b9083019060e08286031215614bcf57600080fd5b614bd76139e9565b614be083614b27565b8152614bee60208401614b27565b6020820152614bff60408401614b27565b6040820152606083015160608201526080830151608082015260a083015182811115614c2a57600080fd5b614c3687828601614b32565b60a08301525060c083015182811115614c4e57600080fd5b614c5a87828601614b32565b60c08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+}
+
+var CCIPHomeABI = CCIPHomeMetaData.ABI
+
+var CCIPHomeBin = CCIPHomeMetaData.Bin
+
+func DeployCCIPHome(auth *bind.TransactOpts, backend bind.ContractBackend, capabilitiesRegistry common.Address) (common.Address, *types.Transaction, *CCIPHome, error) {
+ parsed, err := CCIPHomeMetaData.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(CCIPHomeBin), backend, capabilitiesRegistry)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &CCIPHome{address: address, abi: *parsed, CCIPHomeCaller: CCIPHomeCaller{contract: contract}, CCIPHomeTransactor: CCIPHomeTransactor{contract: contract}, CCIPHomeFilterer: CCIPHomeFilterer{contract: contract}}, nil
+}
+
+type CCIPHome struct {
+ address common.Address
+ abi abi.ABI
+ CCIPHomeCaller
+ CCIPHomeTransactor
+ CCIPHomeFilterer
+}
+
+type CCIPHomeCaller struct {
+ contract *bind.BoundContract
+}
+
+type CCIPHomeTransactor struct {
+ contract *bind.BoundContract
+}
+
+type CCIPHomeFilterer struct {
+ contract *bind.BoundContract
+}
+
+type CCIPHomeSession struct {
+ Contract *CCIPHome
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type CCIPHomeCallerSession struct {
+ Contract *CCIPHomeCaller
+ CallOpts bind.CallOpts
+}
+
+type CCIPHomeTransactorSession struct {
+ Contract *CCIPHomeTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type CCIPHomeRaw struct {
+ Contract *CCIPHome
+}
+
+type CCIPHomeCallerRaw struct {
+ Contract *CCIPHomeCaller
+}
+
+type CCIPHomeTransactorRaw struct {
+ Contract *CCIPHomeTransactor
+}
+
+func NewCCIPHome(address common.Address, backend bind.ContractBackend) (*CCIPHome, error) {
+ abi, err := abi.JSON(strings.NewReader(CCIPHomeABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindCCIPHome(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHome{address: address, abi: abi, CCIPHomeCaller: CCIPHomeCaller{contract: contract}, CCIPHomeTransactor: CCIPHomeTransactor{contract: contract}, CCIPHomeFilterer: CCIPHomeFilterer{contract: contract}}, nil
+}
+
+func NewCCIPHomeCaller(address common.Address, caller bind.ContractCaller) (*CCIPHomeCaller, error) {
+ contract, err := bindCCIPHome(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeCaller{contract: contract}, nil
+}
+
+func NewCCIPHomeTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPHomeTransactor, error) {
+ contract, err := bindCCIPHome(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeTransactor{contract: contract}, nil
+}
+
+func NewCCIPHomeFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPHomeFilterer, error) {
+ contract, err := bindCCIPHome(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeFilterer{contract: contract}, nil
+}
+
+func bindCCIPHome(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := CCIPHomeMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_CCIPHome *CCIPHomeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _CCIPHome.Contract.CCIPHomeCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_CCIPHome *CCIPHomeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _CCIPHome.Contract.CCIPHomeTransactor.contract.Transfer(opts)
+}
+
+func (_CCIPHome *CCIPHomeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _CCIPHome.Contract.CCIPHomeTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_CCIPHome *CCIPHomeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _CCIPHome.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_CCIPHome *CCIPHomeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _CCIPHome.Contract.contract.Transfer(opts)
+}
+
+func (_CCIPHome *CCIPHomeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _CCIPHome.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetActiveDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getActiveDigest", donId, pluginType)
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetActiveDigest(donId uint32, pluginType uint8) ([32]byte, error) {
+ return _CCIPHome.Contract.GetActiveDigest(&_CCIPHome.CallOpts, donId, pluginType)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetActiveDigest(donId uint32, pluginType uint8) ([32]byte, error) {
+ return _CCIPHome.Contract.GetActiveDigest(&_CCIPHome.CallOpts, donId, pluginType)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getAllChainConfigs", pageIndex, pageSize)
+
+ if err != nil {
+ return *new([]CCIPHomeChainConfigArgs), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]CCIPHomeChainConfigArgs)).(*[]CCIPHomeChainConfigArgs)
+
+ return out0, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) {
+ return _CCIPHome.Contract.GetAllChainConfigs(&_CCIPHome.CallOpts, pageIndex, pageSize)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) {
+ return _CCIPHome.Contract.GetAllChainConfigs(&_CCIPHome.CallOpts, pageIndex, pageSize)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetAllConfigs(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetAllConfigs,
+
+ error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getAllConfigs", donId, pluginType)
+
+ outstruct := new(GetAllConfigs)
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.ActiveConfig = *abi.ConvertType(out[0], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig)
+ outstruct.CandidateConfig = *abi.ConvertType(out[1], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig)
+
+ return *outstruct, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetAllConfigs(donId uint32, pluginType uint8) (GetAllConfigs,
+
+ error) {
+ return _CCIPHome.Contract.GetAllConfigs(&_CCIPHome.CallOpts, donId, pluginType)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetAllConfigs(donId uint32, pluginType uint8) (GetAllConfigs,
+
+ error) {
+ return _CCIPHome.Contract.GetAllConfigs(&_CCIPHome.CallOpts, donId, pluginType)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetCandidateDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getCandidateDigest", donId, pluginType)
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetCandidateDigest(donId uint32, pluginType uint8) ([32]byte, error) {
+ return _CCIPHome.Contract.GetCandidateDigest(&_CCIPHome.CallOpts, donId, pluginType)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetCandidateDigest(donId uint32, pluginType uint8) ([32]byte, error) {
+ return _CCIPHome.Contract.GetCandidateDigest(&_CCIPHome.CallOpts, donId, pluginType)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getCapabilityConfiguration", arg0)
+
+ if err != nil {
+ return *new([]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+ return out0, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) {
+ return _CCIPHome.Contract.GetCapabilityConfiguration(&_CCIPHome.CallOpts, arg0)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) {
+ return _CCIPHome.Contract.GetCapabilityConfiguration(&_CCIPHome.CallOpts, arg0)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getCapabilityRegistry")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetCapabilityRegistry() (common.Address, error) {
+ return _CCIPHome.Contract.GetCapabilityRegistry(&_CCIPHome.CallOpts)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetCapabilityRegistry() (common.Address, error) {
+ return _CCIPHome.Contract.GetCapabilityRegistry(&_CCIPHome.CallOpts)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetConfig(opts *bind.CallOpts, donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig,
+
+ error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getConfig", donId, pluginType, configDigest)
+
+ outstruct := new(GetConfig)
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.VersionedConfig = *abi.ConvertType(out[0], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig)
+ outstruct.Ok = *abi.ConvertType(out[1], new(bool)).(*bool)
+
+ return *outstruct, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetConfig(donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig,
+
+ error) {
+ return _CCIPHome.Contract.GetConfig(&_CCIPHome.CallOpts, donId, pluginType, configDigest)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetConfig(donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig,
+
+ error) {
+ return _CCIPHome.Contract.GetConfig(&_CCIPHome.CallOpts, donId, pluginType, configDigest)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetConfigDigests(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetConfigDigests,
+
+ error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getConfigDigests", donId, pluginType)
+
+ outstruct := new(GetConfigDigests)
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.ActiveConfigDigest = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+ outstruct.CandidateConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte)
+
+ return *outstruct, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetConfigDigests(donId uint32, pluginType uint8) (GetConfigDigests,
+
+ error) {
+ return _CCIPHome.Contract.GetConfigDigests(&_CCIPHome.CallOpts, donId, pluginType)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetConfigDigests(donId uint32, pluginType uint8) (GetConfigDigests,
+
+ error) {
+ return _CCIPHome.Contract.GetConfigDigests(&_CCIPHome.CallOpts, donId, pluginType)
+}
+
+func (_CCIPHome *CCIPHomeCaller) GetNumChainConfigurations(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "getNumChainConfigurations")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) GetNumChainConfigurations() (*big.Int, error) {
+ return _CCIPHome.Contract.GetNumChainConfigurations(&_CCIPHome.CallOpts)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) GetNumChainConfigurations() (*big.Int, error) {
+ return _CCIPHome.Contract.GetNumChainConfigurations(&_CCIPHome.CallOpts)
+}
+
+func (_CCIPHome *CCIPHomeCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _CCIPHome.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 (_CCIPHome *CCIPHomeSession) Owner() (common.Address, error) {
+ return _CCIPHome.Contract.Owner(&_CCIPHome.CallOpts)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) Owner() (common.Address, error) {
+ return _CCIPHome.Contract.Owner(&_CCIPHome.CallOpts)
+}
+
+func (_CCIPHome *CCIPHomeCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
+ var out []interface{}
+ err := _CCIPHome.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 (_CCIPHome *CCIPHomeSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _CCIPHome.Contract.SupportsInterface(&_CCIPHome.CallOpts, interfaceId)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _CCIPHome.Contract.SupportsInterface(&_CCIPHome.CallOpts, interfaceId)
+}
+
+func (_CCIPHome *CCIPHomeCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _CCIPHome.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_CCIPHome *CCIPHomeSession) TypeAndVersion() (string, error) {
+ return _CCIPHome.Contract.TypeAndVersion(&_CCIPHome.CallOpts)
+}
+
+func (_CCIPHome *CCIPHomeCallerSession) TypeAndVersion() (string, error) {
+ return _CCIPHome.Contract.TypeAndVersion(&_CCIPHome.CallOpts)
+}
+
+func (_CCIPHome *CCIPHomeTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _CCIPHome.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_CCIPHome *CCIPHomeSession) AcceptOwnership() (*types.Transaction, error) {
+ return _CCIPHome.Contract.AcceptOwnership(&_CCIPHome.TransactOpts)
+}
+
+func (_CCIPHome *CCIPHomeTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _CCIPHome.Contract.AcceptOwnership(&_CCIPHome.TransactOpts)
+}
+
+func (_CCIPHome *CCIPHomeTransactor) ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) {
+ return _CCIPHome.contract.Transact(opts, "applyChainConfigUpdates", chainSelectorRemoves, chainConfigAdds)
+}
+
+func (_CCIPHome *CCIPHomeSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) {
+ return _CCIPHome.Contract.ApplyChainConfigUpdates(&_CCIPHome.TransactOpts, chainSelectorRemoves, chainConfigAdds)
+}
+
+func (_CCIPHome *CCIPHomeTransactorSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) {
+ return _CCIPHome.Contract.ApplyChainConfigUpdates(&_CCIPHome.TransactOpts, chainSelectorRemoves, chainConfigAdds)
+}
+
+func (_CCIPHome *CCIPHomeTransactor) BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) {
+ return _CCIPHome.contract.Transact(opts, "beforeCapabilityConfigSet", arg0, update, arg2, donId)
+}
+
+func (_CCIPHome *CCIPHomeSession) BeforeCapabilityConfigSet(arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) {
+ return _CCIPHome.Contract.BeforeCapabilityConfigSet(&_CCIPHome.TransactOpts, arg0, update, arg2, donId)
+}
+
+func (_CCIPHome *CCIPHomeTransactorSession) BeforeCapabilityConfigSet(arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) {
+ return _CCIPHome.Contract.BeforeCapabilityConfigSet(&_CCIPHome.TransactOpts, arg0, update, arg2, donId)
+}
+
+func (_CCIPHome *CCIPHomeTransactor) PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.contract.Transact(opts, "promoteCandidateAndRevokeActive", donId, pluginType, digestToPromote, digestToRevoke)
+}
+
+func (_CCIPHome *CCIPHomeSession) PromoteCandidateAndRevokeActive(donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.Contract.PromoteCandidateAndRevokeActive(&_CCIPHome.TransactOpts, donId, pluginType, digestToPromote, digestToRevoke)
+}
+
+func (_CCIPHome *CCIPHomeTransactorSession) PromoteCandidateAndRevokeActive(donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.Contract.PromoteCandidateAndRevokeActive(&_CCIPHome.TransactOpts, donId, pluginType, digestToPromote, digestToRevoke)
+}
+
+func (_CCIPHome *CCIPHomeTransactor) RevokeCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.contract.Transact(opts, "revokeCandidate", donId, pluginType, configDigest)
+}
+
+func (_CCIPHome *CCIPHomeSession) RevokeCandidate(donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.Contract.RevokeCandidate(&_CCIPHome.TransactOpts, donId, pluginType, configDigest)
+}
+
+func (_CCIPHome *CCIPHomeTransactorSession) RevokeCandidate(donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.Contract.RevokeCandidate(&_CCIPHome.TransactOpts, donId, pluginType, configDigest)
+}
+
+func (_CCIPHome *CCIPHomeTransactor) SetCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.contract.Transact(opts, "setCandidate", donId, pluginType, config, digestToOverwrite)
+}
+
+func (_CCIPHome *CCIPHomeSession) SetCandidate(donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.Contract.SetCandidate(&_CCIPHome.TransactOpts, donId, pluginType, config, digestToOverwrite)
+}
+
+func (_CCIPHome *CCIPHomeTransactorSession) SetCandidate(donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) {
+ return _CCIPHome.Contract.SetCandidate(&_CCIPHome.TransactOpts, donId, pluginType, config, digestToOverwrite)
+}
+
+func (_CCIPHome *CCIPHomeTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _CCIPHome.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_CCIPHome *CCIPHomeSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _CCIPHome.Contract.TransferOwnership(&_CCIPHome.TransactOpts, to)
+}
+
+func (_CCIPHome *CCIPHomeTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _CCIPHome.Contract.TransferOwnership(&_CCIPHome.TransactOpts, to)
+}
+
+type CCIPHomeActiveConfigRevokedIterator struct {
+ Event *CCIPHomeActiveConfigRevoked
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeActiveConfigRevokedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeActiveConfigRevoked)
+ 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(CCIPHomeActiveConfigRevoked)
+ 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 *CCIPHomeActiveConfigRevokedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeActiveConfigRevokedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeActiveConfigRevoked struct {
+ ConfigDigest [32]byte
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeActiveConfigRevokedIterator, error) {
+
+ var configDigestRule []interface{}
+ for _, configDigestItem := range configDigest {
+ configDigestRule = append(configDigestRule, configDigestItem)
+ }
+
+ logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ActiveConfigRevoked", configDigestRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeActiveConfigRevokedIterator{contract: _CCIPHome.contract, event: "ActiveConfigRevoked", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) {
+
+ var configDigestRule []interface{}
+ for _, configDigestItem := range configDigest {
+ configDigestRule = append(configDigestRule, configDigestItem)
+ }
+
+ logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ActiveConfigRevoked", configDigestRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CCIPHomeActiveConfigRevoked)
+ if err := _CCIPHome.contract.UnpackLog(event, "ActiveConfigRevoked", 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 (_CCIPHome *CCIPHomeFilterer) ParseActiveConfigRevoked(log types.Log) (*CCIPHomeActiveConfigRevoked, error) {
+ event := new(CCIPHomeActiveConfigRevoked)
+ if err := _CCIPHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CCIPHomeCandidateConfigRevokedIterator struct {
+ Event *CCIPHomeCandidateConfigRevoked
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeCandidateConfigRevokedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeCandidateConfigRevoked)
+ 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(CCIPHomeCandidateConfigRevoked)
+ 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 *CCIPHomeCandidateConfigRevokedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeCandidateConfigRevokedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeCandidateConfigRevoked struct {
+ ConfigDigest [32]byte
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeCandidateConfigRevokedIterator, error) {
+
+ var configDigestRule []interface{}
+ for _, configDigestItem := range configDigest {
+ configDigestRule = append(configDigestRule, configDigestItem)
+ }
+
+ logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "CandidateConfigRevoked", configDigestRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeCandidateConfigRevokedIterator{contract: _CCIPHome.contract, event: "CandidateConfigRevoked", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) {
+
+ var configDigestRule []interface{}
+ for _, configDigestItem := range configDigest {
+ configDigestRule = append(configDigestRule, configDigestItem)
+ }
+
+ logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "CandidateConfigRevoked", configDigestRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CCIPHomeCandidateConfigRevoked)
+ if err := _CCIPHome.contract.UnpackLog(event, "CandidateConfigRevoked", 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 (_CCIPHome *CCIPHomeFilterer) ParseCandidateConfigRevoked(log types.Log) (*CCIPHomeCandidateConfigRevoked, error) {
+ event := new(CCIPHomeCandidateConfigRevoked)
+ if err := _CCIPHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CCIPHomeCapabilityConfigurationSetIterator struct {
+ Event *CCIPHomeCapabilityConfigurationSet
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeCapabilityConfigurationSetIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeCapabilityConfigurationSet)
+ 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(CCIPHomeCapabilityConfigurationSet)
+ 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 *CCIPHomeCapabilityConfigurationSetIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeCapabilityConfigurationSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeCapabilityConfigurationSet struct {
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPHomeCapabilityConfigurationSetIterator, error) {
+
+ logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "CapabilityConfigurationSet")
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeCapabilityConfigurationSetIterator{contract: _CCIPHome.contract, event: "CapabilityConfigurationSet", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeCapabilityConfigurationSet) (event.Subscription, error) {
+
+ logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "CapabilityConfigurationSet")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CCIPHomeCapabilityConfigurationSet)
+ if err := _CCIPHome.contract.UnpackLog(event, "CapabilityConfigurationSet", 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 (_CCIPHome *CCIPHomeFilterer) ParseCapabilityConfigurationSet(log types.Log) (*CCIPHomeCapabilityConfigurationSet, error) {
+ event := new(CCIPHomeCapabilityConfigurationSet)
+ if err := _CCIPHome.contract.UnpackLog(event, "CapabilityConfigurationSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CCIPHomeChainConfigRemovedIterator struct {
+ Event *CCIPHomeChainConfigRemoved
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeChainConfigRemovedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeChainConfigRemoved)
+ 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(CCIPHomeChainConfigRemoved)
+ 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 *CCIPHomeChainConfigRemovedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeChainConfigRemovedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeChainConfigRemoved struct {
+ ChainSelector uint64
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPHomeChainConfigRemovedIterator, error) {
+
+ logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ChainConfigRemoved")
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeChainConfigRemovedIterator{contract: _CCIPHome.contract, event: "ChainConfigRemoved", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigRemoved) (event.Subscription, error) {
+
+ logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ChainConfigRemoved")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CCIPHomeChainConfigRemoved)
+ if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigRemoved", 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 (_CCIPHome *CCIPHomeFilterer) ParseChainConfigRemoved(log types.Log) (*CCIPHomeChainConfigRemoved, error) {
+ event := new(CCIPHomeChainConfigRemoved)
+ if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigRemoved", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CCIPHomeChainConfigSetIterator struct {
+ Event *CCIPHomeChainConfigSet
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeChainConfigSetIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeChainConfigSet)
+ 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(CCIPHomeChainConfigSet)
+ 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 *CCIPHomeChainConfigSetIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeChainConfigSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeChainConfigSet struct {
+ ChainSelector uint64
+ ChainConfig CCIPHomeChainConfig
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPHomeChainConfigSetIterator, error) {
+
+ logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ChainConfigSet")
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeChainConfigSetIterator{contract: _CCIPHome.contract, event: "ChainConfigSet", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigSet) (event.Subscription, error) {
+
+ logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ChainConfigSet")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CCIPHomeChainConfigSet)
+ if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigSet", 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 (_CCIPHome *CCIPHomeFilterer) ParseChainConfigSet(log types.Log) (*CCIPHomeChainConfigSet, error) {
+ event := new(CCIPHomeChainConfigSet)
+ if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CCIPHomeConfigPromotedIterator struct {
+ Event *CCIPHomeConfigPromoted
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeConfigPromotedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeConfigPromoted)
+ 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(CCIPHomeConfigPromoted)
+ 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 *CCIPHomeConfigPromotedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeConfigPromotedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeConfigPromoted struct {
+ ConfigDigest [32]byte
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigPromotedIterator, error) {
+
+ var configDigestRule []interface{}
+ for _, configDigestItem := range configDigest {
+ configDigestRule = append(configDigestRule, configDigestItem)
+ }
+
+ logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ConfigPromoted", configDigestRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeConfigPromotedIterator{contract: _CCIPHome.contract, event: "ConfigPromoted", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) {
+
+ var configDigestRule []interface{}
+ for _, configDigestItem := range configDigest {
+ configDigestRule = append(configDigestRule, configDigestItem)
+ }
+
+ logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ConfigPromoted", configDigestRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CCIPHomeConfigPromoted)
+ if err := _CCIPHome.contract.UnpackLog(event, "ConfigPromoted", 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 (_CCIPHome *CCIPHomeFilterer) ParseConfigPromoted(log types.Log) (*CCIPHomeConfigPromoted, error) {
+ event := new(CCIPHomeConfigPromoted)
+ if err := _CCIPHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CCIPHomeConfigSetIterator struct {
+ Event *CCIPHomeConfigSet
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeConfigSetIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeConfigSet)
+ 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(CCIPHomeConfigSet)
+ 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 *CCIPHomeConfigSetIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeConfigSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeConfigSet struct {
+ ConfigDigest [32]byte
+ Version uint32
+ Config CCIPHomeOCR3Config
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigSetIterator, error) {
+
+ var configDigestRule []interface{}
+ for _, configDigestItem := range configDigest {
+ configDigestRule = append(configDigestRule, configDigestItem)
+ }
+
+ logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ConfigSet", configDigestRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeConfigSetIterator{contract: _CCIPHome.contract, event: "ConfigSet", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) {
+
+ var configDigestRule []interface{}
+ for _, configDigestItem := range configDigest {
+ configDigestRule = append(configDigestRule, configDigestItem)
+ }
+
+ logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ConfigSet", configDigestRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CCIPHomeConfigSet)
+ if err := _CCIPHome.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 (_CCIPHome *CCIPHomeFilterer) ParseConfigSet(log types.Log) (*CCIPHomeConfigSet, error) {
+ event := new(CCIPHomeConfigSet)
+ if err := _CCIPHome.contract.UnpackLog(event, "ConfigSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CCIPHomeOwnershipTransferRequestedIterator struct {
+ Event *CCIPHomeOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeOwnershipTransferRequested)
+ 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(CCIPHomeOwnershipTransferRequested)
+ 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 *CCIPHomeOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferRequestedIterator, 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 := _CCIPHome.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeOwnershipTransferRequestedIterator{contract: _CCIPHome.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferRequested, 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 := _CCIPHome.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(CCIPHomeOwnershipTransferRequested)
+ if err := _CCIPHome.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 (_CCIPHome *CCIPHomeFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPHomeOwnershipTransferRequested, error) {
+ event := new(CCIPHomeOwnershipTransferRequested)
+ if err := _CCIPHome.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CCIPHomeOwnershipTransferredIterator struct {
+ Event *CCIPHomeOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CCIPHomeOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CCIPHomeOwnershipTransferred)
+ 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(CCIPHomeOwnershipTransferred)
+ 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 *CCIPHomeOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *CCIPHomeOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CCIPHomeOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_CCIPHome *CCIPHomeFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferredIterator, 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 := _CCIPHome.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CCIPHomeOwnershipTransferredIterator{contract: _CCIPHome.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_CCIPHome *CCIPHomeFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferred, 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 := _CCIPHome.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(CCIPHomeOwnershipTransferred)
+ if err := _CCIPHome.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 (_CCIPHome *CCIPHomeFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPHomeOwnershipTransferred, error) {
+ event := new(CCIPHomeOwnershipTransferred)
+ if err := _CCIPHome.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type GetAllConfigs struct {
+ ActiveConfig CCIPHomeVersionedConfig
+ CandidateConfig CCIPHomeVersionedConfig
+}
+type GetConfig struct {
+ VersionedConfig CCIPHomeVersionedConfig
+ Ok bool
+}
+type GetConfigDigests struct {
+ ActiveConfigDigest [32]byte
+ CandidateConfigDigest [32]byte
+}
+
+func (_CCIPHome *CCIPHome) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _CCIPHome.abi.Events["ActiveConfigRevoked"].ID:
+ return _CCIPHome.ParseActiveConfigRevoked(log)
+ case _CCIPHome.abi.Events["CandidateConfigRevoked"].ID:
+ return _CCIPHome.ParseCandidateConfigRevoked(log)
+ case _CCIPHome.abi.Events["CapabilityConfigurationSet"].ID:
+ return _CCIPHome.ParseCapabilityConfigurationSet(log)
+ case _CCIPHome.abi.Events["ChainConfigRemoved"].ID:
+ return _CCIPHome.ParseChainConfigRemoved(log)
+ case _CCIPHome.abi.Events["ChainConfigSet"].ID:
+ return _CCIPHome.ParseChainConfigSet(log)
+ case _CCIPHome.abi.Events["ConfigPromoted"].ID:
+ return _CCIPHome.ParseConfigPromoted(log)
+ case _CCIPHome.abi.Events["ConfigSet"].ID:
+ return _CCIPHome.ParseConfigSet(log)
+ case _CCIPHome.abi.Events["OwnershipTransferRequested"].ID:
+ return _CCIPHome.ParseOwnershipTransferRequested(log)
+ case _CCIPHome.abi.Events["OwnershipTransferred"].ID:
+ return _CCIPHome.ParseOwnershipTransferred(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (CCIPHomeActiveConfigRevoked) Topic() common.Hash {
+ return common.HexToHash("0x0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8")
+}
+
+func (CCIPHomeCandidateConfigRevoked) Topic() common.Hash {
+ return common.HexToHash("0x53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b")
+}
+
+func (CCIPHomeCapabilityConfigurationSet) Topic() common.Hash {
+ return common.HexToHash("0x84ad7751b744c9e2ee77da1d902b428aec7f0a343d67a24bbe2142e6f58a8d0f")
+}
+
+func (CCIPHomeChainConfigRemoved) Topic() common.Hash {
+ return common.HexToHash("0x2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0")
+}
+
+func (CCIPHomeChainConfigSet) Topic() common.Hash {
+ return common.HexToHash("0x05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e0")
+}
+
+func (CCIPHomeConfigPromoted) Topic() common.Hash {
+ return common.HexToHash("0xfc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e")
+}
+
+func (CCIPHomeConfigSet) Topic() common.Hash {
+ return common.HexToHash("0x94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c6")
+}
+
+func (CCIPHomeOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (CCIPHomeOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (_CCIPHome *CCIPHome) Address() common.Address {
+ return _CCIPHome.address
+}
+
+type CCIPHomeInterface interface {
+ GetActiveDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error)
+
+ GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error)
+
+ GetAllConfigs(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetAllConfigs,
+
+ error)
+
+ GetCandidateDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error)
+
+ GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error)
+
+ GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error)
+
+ GetConfig(opts *bind.CallOpts, donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig,
+
+ error)
+
+ GetConfigDigests(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetConfigDigests,
+
+ error)
+
+ GetNumChainConfigurations(opts *bind.CallOpts) (*big.Int, error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
+
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error)
+
+ BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error)
+
+ PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error)
+
+ RevokeCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error)
+
+ SetCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeActiveConfigRevokedIterator, error)
+
+ WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error)
+
+ ParseActiveConfigRevoked(log types.Log) (*CCIPHomeActiveConfigRevoked, error)
+
+ FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeCandidateConfigRevokedIterator, error)
+
+ WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error)
+
+ ParseCandidateConfigRevoked(log types.Log) (*CCIPHomeCandidateConfigRevoked, error)
+
+ FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPHomeCapabilityConfigurationSetIterator, error)
+
+ WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeCapabilityConfigurationSet) (event.Subscription, error)
+
+ ParseCapabilityConfigurationSet(log types.Log) (*CCIPHomeCapabilityConfigurationSet, error)
+
+ FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPHomeChainConfigRemovedIterator, error)
+
+ WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigRemoved) (event.Subscription, error)
+
+ ParseChainConfigRemoved(log types.Log) (*CCIPHomeChainConfigRemoved, error)
+
+ FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPHomeChainConfigSetIterator, error)
+
+ WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigSet) (event.Subscription, error)
+
+ ParseChainConfigSet(log types.Log) (*CCIPHomeChainConfigSet, error)
+
+ FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigPromotedIterator, error)
+
+ WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error)
+
+ ParseConfigPromoted(log types.Log) (*CCIPHomeConfigPromoted, error)
+
+ FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigSetIterator, error)
+
+ WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigSet, configDigest [][32]byte) (event.Subscription, error)
+
+ ParseConfigSet(log types.Log) (*CCIPHomeConfigSet, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*CCIPHomeOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*CCIPHomeOwnershipTransferred, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go b/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go
deleted file mode 100644
index 7dfa6869e7..0000000000
--- a/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go
+++ /dev/null
@@ -1,200 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package ocr3_config_encoder
-
-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 CCIPConfigTypesOCR3Config struct {
- PluginType uint8
- ChainSelector uint64
- FRoleDON uint8
- OffchainConfigVersion uint64
- OfframpAddress []byte
- RmnHomeAddress []byte
- Nodes []CCIPConfigTypesOCR3Node
- OffchainConfig []byte
-}
-
-type CCIPConfigTypesOCR3Node struct {
- P2pId [32]byte
- SignerKey []byte
- TransmitterKey []byte
-}
-
-var IOCR3ConfigEncoderMetaData = &bind.MetaData{
- ABI: "[{\"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\":\"structCCIPConfigTypes.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config[]\",\"name\":\"config\",\"type\":\"tuple[]\"}],\"name\":\"exposeOCR3Config\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
-}
-
-var IOCR3ConfigEncoderABI = IOCR3ConfigEncoderMetaData.ABI
-
-type IOCR3ConfigEncoder struct {
- address common.Address
- abi abi.ABI
- IOCR3ConfigEncoderCaller
- IOCR3ConfigEncoderTransactor
- IOCR3ConfigEncoderFilterer
-}
-
-type IOCR3ConfigEncoderCaller struct {
- contract *bind.BoundContract
-}
-
-type IOCR3ConfigEncoderTransactor struct {
- contract *bind.BoundContract
-}
-
-type IOCR3ConfigEncoderFilterer struct {
- contract *bind.BoundContract
-}
-
-type IOCR3ConfigEncoderSession struct {
- Contract *IOCR3ConfigEncoder
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type IOCR3ConfigEncoderCallerSession struct {
- Contract *IOCR3ConfigEncoderCaller
- CallOpts bind.CallOpts
-}
-
-type IOCR3ConfigEncoderTransactorSession struct {
- Contract *IOCR3ConfigEncoderTransactor
- TransactOpts bind.TransactOpts
-}
-
-type IOCR3ConfigEncoderRaw struct {
- Contract *IOCR3ConfigEncoder
-}
-
-type IOCR3ConfigEncoderCallerRaw struct {
- Contract *IOCR3ConfigEncoderCaller
-}
-
-type IOCR3ConfigEncoderTransactorRaw struct {
- Contract *IOCR3ConfigEncoderTransactor
-}
-
-func NewIOCR3ConfigEncoder(address common.Address, backend bind.ContractBackend) (*IOCR3ConfigEncoder, error) {
- abi, err := abi.JSON(strings.NewReader(IOCR3ConfigEncoderABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindIOCR3ConfigEncoder(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &IOCR3ConfigEncoder{address: address, abi: abi, IOCR3ConfigEncoderCaller: IOCR3ConfigEncoderCaller{contract: contract}, IOCR3ConfigEncoderTransactor: IOCR3ConfigEncoderTransactor{contract: contract}, IOCR3ConfigEncoderFilterer: IOCR3ConfigEncoderFilterer{contract: contract}}, nil
-}
-
-func NewIOCR3ConfigEncoderCaller(address common.Address, caller bind.ContractCaller) (*IOCR3ConfigEncoderCaller, error) {
- contract, err := bindIOCR3ConfigEncoder(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &IOCR3ConfigEncoderCaller{contract: contract}, nil
-}
-
-func NewIOCR3ConfigEncoderTransactor(address common.Address, transactor bind.ContractTransactor) (*IOCR3ConfigEncoderTransactor, error) {
- contract, err := bindIOCR3ConfigEncoder(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &IOCR3ConfigEncoderTransactor{contract: contract}, nil
-}
-
-func NewIOCR3ConfigEncoderFilterer(address common.Address, filterer bind.ContractFilterer) (*IOCR3ConfigEncoderFilterer, error) {
- contract, err := bindIOCR3ConfigEncoder(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &IOCR3ConfigEncoderFilterer{contract: contract}, nil
-}
-
-func bindIOCR3ConfigEncoder(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := IOCR3ConfigEncoderMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _IOCR3ConfigEncoder.Contract.IOCR3ConfigEncoderCaller.contract.Call(opts, result, method, params...)
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _IOCR3ConfigEncoder.Contract.IOCR3ConfigEncoderTransactor.contract.Transfer(opts)
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _IOCR3ConfigEncoder.Contract.IOCR3ConfigEncoderTransactor.contract.Transact(opts, method, params...)
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _IOCR3ConfigEncoder.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _IOCR3ConfigEncoder.Contract.contract.Transfer(opts)
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _IOCR3ConfigEncoder.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderCaller) ExposeOCR3Config(opts *bind.CallOpts, config []CCIPConfigTypesOCR3Config) ([]byte, error) {
- var out []interface{}
- err := _IOCR3ConfigEncoder.contract.Call(opts, &out, "exposeOCR3Config", config)
-
- if err != nil {
- return *new([]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
-
- return out0, err
-
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderSession) ExposeOCR3Config(config []CCIPConfigTypesOCR3Config) ([]byte, error) {
- return _IOCR3ConfigEncoder.Contract.ExposeOCR3Config(&_IOCR3ConfigEncoder.CallOpts, config)
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderCallerSession) ExposeOCR3Config(config []CCIPConfigTypesOCR3Config) ([]byte, error) {
- return _IOCR3ConfigEncoder.Contract.ExposeOCR3Config(&_IOCR3ConfigEncoder.CallOpts, config)
-}
-
-func (_IOCR3ConfigEncoder *IOCR3ConfigEncoder) Address() common.Address {
- return _IOCR3ConfigEncoder.address
-}
-
-type IOCR3ConfigEncoderInterface interface {
- ExposeOCR3Config(opts *bind.CallOpts, config []CCIPConfigTypesOCR3Config) ([]byte, error)
-
- Address() common.Address
-}
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 215ac3988f..8b9f869a71 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -4,8 +4,8 @@ burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMint
burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 717c079d5d13300cf3c3ee871c6e5bf9af904411f204fb081a9f3b263cca1391
burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6333d0314d0bd29e75ea5e05fe62a4516ade0c6db91c30b6f93645035db52ed8
burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 08ed1235dda921ce8841b26aa18d0c0f36db4884779dd7670857159801b6d597
-ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin a63406386676963a292fa6ef41bf6302fbf0421599a3fc83c786fa5d3adb063a
-ccip_encoding_utils: ../../../contracts/solc/v0.8.24/CCIPEncodingUtils/CCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/CCIPEncodingUtils/CCIPEncodingUtils.bin ebabd5311ad4374df0f2f5cd5640bb58d938d92f5a82962ac4df7b6e5af2c197
+ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin 2e6fa009821d30a24efdc9f9d14b2269fb9a51cb7d536ea8b2d29d97dd8b591c
+ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin 87de30d71a511f936bdeecb01a88a70ad3f323117202ebb17cdbdc84d65a3857
ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 32916b41e0070cb6853d558bbff06ab367324fa52cac59893065e8f616ff14f0
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin 274d87db70b643e00ab0a7e7845bb4b791f3b613bfc87708d33fc5a8369e2a41
commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin f7128dcc2ee6dbcbc976288abcc16970ffb19b59412c5202ef6b259d2007f801
@@ -23,7 +23,6 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo
multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin 0b541232e49727e947dc164eadf35963c66e67576f21baa0ecaa06a8833148ed
multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 04b6b261dd71925670bf4d904aaf7bf08543452009feefb88e07d4c49d12e969
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
-ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin eaec75ca5276a95f934f4da6ea7351520541813628ed1450ef5e6cf7005b2724
offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 941b18b4e2aef977195fefba514e17c9475667e6f8513b18cabfb07ff90136ce
onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 4f29f05261bdaf9b99e675c1169c0d5cba841b6dd7ca3a8997cc0d3cae7ba850
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b
diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go
index 8f3102525a..e6f76fb8bc 100644
--- a/core/gethwrappers/ccip/go_generate.go
+++ b/core/gethwrappers/ccip/go_generate.go
@@ -16,7 +16,7 @@ package ccip
//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/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin CCIPConfig ccip_config
+//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
// Pools
@@ -41,12 +41,11 @@ package ccip
//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/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin IOCR3ConfigEncoder ocr3_config_encoder
//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
// EncodingUtils
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPEncodingUtils/CCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/CCIPEncodingUtils/CCIPEncodingUtils.bin EncodingUtils ccip_encoding_utils
+//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:
From 7d4f8e56e27faba2007edff7b6623ac7c29ec94a Mon Sep 17 00:00:00 2001
From: Balamurali Gopalswami <167726375+b-gopalswami@users.noreply.github.com>
Date: Tue, 1 Oct 2024 01:31:53 -0400
Subject: [PATCH 15/32] CCIP-3547: Fix wallet key and add slack notifcations
(#1475)
## Motivation
BSC_MAINNET wallet key was missing in the workflow and slack
notification is not configured for smoke test.
## Solution
Add the required wallet keys and enabled custom slack notification with
threads and post the results.
---
.github/workflows/ccip-live-network-tests.yml | 93 ++++++++++++++++++-
1 file changed, 89 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/ccip-live-network-tests.yml b/.github/workflows/ccip-live-network-tests.yml
index 089fcf739b..d1789fca74 100644
--- a/.github/workflows/ccip-live-network-tests.yml
+++ b/.github/workflows/ccip-live-network-tests.yml
@@ -43,18 +43,20 @@ env:
E2E_TEST_AVALANCHE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_BASE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_BLAST_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BSC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_CELO_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_ETHEREUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_GNOSIS_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_KROMA_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_LINEA_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_METIS_ANDROMEDA_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_MODE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_OPTIMISM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_POLYGON_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_SCROLL_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_WEMIX_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
E2E_TEST_ZKSYNC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
-
jobs:
build-chainlink:
environment: integration
@@ -232,7 +234,7 @@ jobs:
should_cleanup: false
ccip-smoke-test:
- name: CCIP smoke Test ${{ matrix.lanes.name }}
+ name: 'CCIP Smoke - Source: ${{ matrix.lanes.name }}'
environment: integration
runs-on: ubuntu-latest
needs: [ build-chainlink ]
@@ -320,7 +322,7 @@ jobs:
org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
- this-job-name: CCIP Smoke Test
+ this-job-name: 'CCIP Smoke - Source: ${{ matrix.lanes.name }}'
continue-on-error: true
- name: Checkout the repo
if: ${{ matrix.lanes.enabled == true }}
@@ -392,4 +394,87 @@ jobs:
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
cache_key_id: ccip-smoke-${{ env.MOD_CACHE_VERSION }}
cache_restore_only: "true"
- should_cleanup: false
\ No newline at end of file
+ should_cleanup: false
+
+ # Custom reporting Jobs
+ start-slack-thread:
+ name: Start Slack Thread
+ if: ${{ always() && needs.ccip-smoke-test.result != 'skipped' && needs.ccip-smoke-test.result != 'cancelled' }}
+ environment: integration
+ outputs:
+ thread_ts: ${{ steps.slack.outputs.thread_ts }}
+ permissions:
+ checks: write
+ pull-requests: write
+ id-token: write
+ contents: read
+ runs-on: ubuntu-latest
+ needs: [ ccip-smoke-test ]
+ steps:
+ - name: Debug Result
+ run: echo ${{ join(needs.*.result, ',') }}
+ - name: Main Slack Notification
+ uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0
+ id: slack
+ with:
+ channel-id: "#test-run-notifications"
+ payload: |
+ {
+ "attachments": [
+ {
+ "color": "${{ contains(join(needs.*.result, ','), 'failure') && '#C62828' || '#2E7D32' }}",
+ "blocks": [
+ {
+ "type": "header",
+ "text": {
+ "type": "plain_text",
+ "text": "CCIP Mainnet Smoke tests ${{ contains(join(needs.*.result, ','), 'failure') && ':x:' || ':white_check_mark:'}}",
+ "emoji": true
+ }
+ },
+ {
+ "type": "divider"
+ },
+ {
+ "type": "section",
+ "text": {
+ "type": "mrkdwn",
+ "text": "<${{ github.server_url }}/${{ github.repository }}/${{contains(github.ref_name, 'release') && 'releases/tag' || 'tree'}}/${{ github.ref_name }}|${{ github.ref_name }}> | <${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}|${{ github.sha }}> | <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Run>"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ env:
+ SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
+
+ post-test-results-to-slack:
+ name: Post Test Results
+ if: ${{ always() && needs.start-slack-thread.result != 'skipped' && needs.start-slack-thread.result != 'cancelled' }}
+ environment: integration
+ permissions:
+ checks: write
+ pull-requests: write
+ id-token: write
+ contents: read
+ runs-on: ubuntu-latest
+ needs: start-slack-thread
+ steps:
+ - name: Checkout the repo
+ uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
+ with:
+ ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }}
+ - name: Post Test Results
+ uses: ./.github/actions/notify-slack-jobs-result
+ with:
+ github_token: ${{ github.token }}
+ github_repository: ${{ github.repository }}
+ workflow_run_id: ${{ github.run_id }}
+ github_job_name_regex: ^CCIP Smoke (.*)$
+ message_title: CCIP Mainnet Smoke test
+ slack_channel_id: "#test-run-notifications"
+ slack_bot_token: ${{ secrets.QA_SLACK_API_KEY }}
+ slack_thread_ts: ${{ needs.start-slack-thread.outputs.thread_ts }}
+
+ # End Reporting Jobs
\ No newline at end of file
From dfa420bb101d09ae80c4fc4389142c9eb5939c0e Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Wed, 2 Oct 2024 12:38:51 +0200
Subject: [PATCH 16/32] fix typeAndVersion (#1479)
---
contracts/gas-snapshots/ccip.gas-snapshot | 2 +-
.../src/v0.8/ccip/pools/BurnWithFromMintTokenPoolAndProxy.sol | 2 +-
.../burn_with_from_mint_token_pool_and_proxy.go | 2 +-
.../generated-wrapper-dependency-versions-do-not-edit.txt | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index a984ecd919..b714458080 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -978,7 +978,7 @@ TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 3
TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18103)
TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49438)
TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586499)
-TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5617969)
+TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5618769)
TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246)
TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731)
TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801)
diff --git a/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPoolAndProxy.sol b/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPoolAndProxy.sol
index 324fd484a7..d9c4df0a6c 100644
--- a/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPoolAndProxy.sol
+++ b/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPoolAndProxy.sol
@@ -12,7 +12,7 @@ import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok
contract BurnWithFromMintTokenPoolAndProxy is ITypeAndVersion, LegacyPoolWrapper {
using SafeERC20 for IBurnMintERC20;
- string public constant override typeAndVersion = "BurnFromMintTokenPoolAndProxy 1.5.0";
+ string public constant override typeAndVersion = "BurnWithFromMintTokenPoolAndProxy 1.5.0";
constructor(
IBurnMintERC20 token,
diff --git a/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go b/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go
index 60de3dcdac..c0c6857c73 100644
--- a/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go
+++ b/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go
@@ -83,7 +83,7 @@ type TokenPoolChainUpdate struct {
var BurnWithFromMintTokenPoolAndProxyMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"oldPool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"newPool\",\"type\":\"address\"}],\"name\":\"LegacyPoolChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRampAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPreviousPool\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"prevPool\",\"type\":\"address\"}],\"name\":\"setPreviousPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b5060405162004dda38038062004dda8339810160408190526200003491620008cc565b83838383838383833380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200019b565b5050506001600160a01b0384161580620000e757506001600160a01b038116155b80620000fa57506001600160a01b038216155b1562000119576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016c576040805160008152602081019091526200016c908462000246565b50620001919650506001600160a01b038a169450309350600019925050620003a39050565b5050505062000b08565b336001600160a01b03821603620001f55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c05162000267576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002f25760008382815181106200028b576200028b620009dc565b60209081029190910101519050620002a560028262000489565b15620002e8576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200026a565b5060005b81518110156200039e576000828281518110620003175762000317620009dc565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000343575062000395565b62000350600282620004a9565b1562000393576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002f6565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041b9190620009f2565b62000427919062000a22565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200048391869190620004c016565b50505050565b6000620004a0836001600160a01b03841662000591565b90505b92915050565b6000620004a0836001600160a01b03841662000695565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200050f906001600160a01b038516908490620006e7565b8051909150156200039e578080602001905181019062000530919062000a38565b6200039e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b600081815260018301602052604081205480156200068a576000620005b860018362000a63565b8554909150600090620005ce9060019062000a63565b90508082146200063a576000866000018281548110620005f257620005f2620009dc565b9060005260206000200154905080876000018481548110620006185762000618620009dc565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200064e576200064e62000a79565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620004a3565b6000915050620004a3565b6000818152600183016020526040812054620006de57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004a3565b506000620004a3565b6060620006f8848460008562000700565b949350505050565b606082471015620007635760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b0316858760405162000781919062000ab5565b60006040518083038185875af1925050503d8060008114620007c0576040519150601f19603f3d011682016040523d82523d6000602084013e620007c5565b606091505b509092509050620007d987838387620007e4565b979650505050505050565b606083156200085857825160000362000850576001600160a01b0385163b620008505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620006f8565b620006f883838151156200086f5781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000ad3565b6001600160a01b0381168114620008a157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008c7816200088b565b919050565b60008060008060808587031215620008e357600080fd5b8451620008f0816200088b565b602086810151919550906001600160401b03808211156200091057600080fd5b818801915088601f8301126200092557600080fd5b8151818111156200093a576200093a620008a4565b8060051b604051601f19603f83011681018181108582111715620009625762000962620008a4565b60405291825284820192508381018501918b8311156200098157600080fd5b938501935b82851015620009aa576200099a85620008ba565b8452938501939285019262000986565b809850505050505050620009c160408601620008ba565b9150620009d160608601620008ba565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115620004a357620004a362000a0c565b60006020828403121562000a4b57600080fd5b8151801515811462000a5c57600080fd5b9392505050565b81810381811115620004a357620004a362000a0c565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aac57818101518382015260200162000a92565b50506000910152565b6000825162000ac981846020870162000a8f565b9190910192915050565b602081526000825180602084015262000af481604085016020870162000a8f565b601f01601f19169190910160400192915050565b60805160a05160c05161424e62000b8c6000396000818161052c01528181611ad60152612528015260008181610506015281816118690152611d89015260008181610231015281816102860152818161076801528181610df40152818161178901528181611ca901528181611e8f015281816124be0152612713015261424e6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a4575b911610104578063c0d78655116100a2578063db6327dc11610071578063db6327dc146104f1578063dc0bd97114610504578063e0351e131461052a578063f2fde38b1461055057600080fd5b8063c0d78655146104a3578063c4bffe2b146104b6578063c75eea9c146104cb578063cf7401f3146104de57600080fd5b8063a8d87a3b116100de578063a8d87a3b146103f0578063af58d59f14610403578063b0f479a114610472578063b79465801461049057600080fd5b80639a4575b91461039d578063a2b261d8146103bd578063a7cd63b7146103db57600080fd5b80636d3d1a581161017c57806383826b2b1161014b57806383826b2b146103465780638926f54f146103595780638da5cb5b1461036c5780639766b9321461038a57600080fd5b80636d3d1a58146102fa57806378a010b21461031857806379ba50971461032b5780637d54534e1461033357600080fd5b806321df0da7116101b857806321df0da71461022f578063240028e81461027657806339077537146102c357806354c8a4f3146102e557600080fd5b806301ffc9a7146101df5780630a2fd49314610207578063181f5a7714610227575b600080fd5b6101f26101ed3660046131c0565b610563565b60405190151581526020015b60405180910390f35b61021a61021536600461321f565b610648565b6040516101fe91906132a8565b61021a6106f8565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b6101f26102843660046132e8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102d66102d1366004613305565b610714565b604051905181526020016101fe565b6102f86102f336600461338d565b6108cc565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610251565b6102f86103263660046133f9565b610947565b6102f8610abb565b6102f86103413660046132e8565b610bb8565b6101f261035436600461347c565b610c07565b6101f261036736600461321f565b610cd4565b60005473ffffffffffffffffffffffffffffffffffffffff16610251565b6102f86103983660046132e8565b610ceb565b6103b06103ab3660046134b3565b610d7a565b6040516101fe91906134ee565b60095473ffffffffffffffffffffffffffffffffffffffff16610251565b6103e3610ef0565b6040516101fe919061354e565b6102516103fe36600461321f565b503090565b61041661041136600461321f565b610f01565b6040516101fe919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610251565b61021a61049e36600461321f565b610fd6565b6102f86104b13660046132e8565b611001565b6104be6110d5565b6040516101fe91906135a8565b6104166104d936600461321f565b61118d565b6102f86104ec36600461375f565b61125f565b6102f86104ff3660046137a4565b6112e8565b7f0000000000000000000000000000000000000000000000000000000000000000610251565b7f00000000000000000000000000000000000000000000000000000000000000006101f2565b6102f861055e3660046132e8565b61176e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806105f657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061064257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff81166000908152600760205260409020600401805460609190610673906137e6565b80601f016020809104026020016040519081016040528092919081815260200182805461069f906137e6565b80156106ec5780601f106106c1576101008083540402835291602001916106ec565b820191906000526020600020905b8154815290600101906020018083116106cf57829003601f168201915b50505050509050919050565b60405180606001604052806023815260200161421f6023913981565b60408051602081019091526000815261073461072f836138d5565b611782565b60095473ffffffffffffffffffffffffffffffffffffffff1661082a5773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166340c10f1961079d60608501604086016132e8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608501356024820152604401600060405180830381600087803b15801561080d57600080fd5b505af1158015610821573d6000803e3d6000fd5b5050505061083b565b61083b610836836138d5565b6119b3565b61084b60608301604084016132e8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f084606001356040516108ad91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6108d4611a51565b61094184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611ad492505050565b50505050565b61094f611a51565b61095883610cd4565b61099f576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546109c6906137e6565b80601f01602080910402602001604051908101604052809291908181526020018280546109f2906137e6565b8015610a3f5780601f10610a1457610100808354040283529160200191610a3f565b820191906000526020600020905b815481529060010190602001808311610a2257829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610a6e838583613a1a565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610aad93929190613b34565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610996565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610bc0611a51565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600073ffffffffffffffffffffffffffffffffffffffff8216301480610ccd5750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169281019290925273ffffffffffffffffffffffffffffffffffffffff848116602484015216906383826b2b90604401602060405180830381865afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd9190613b98565b9392505050565b6000610642600567ffffffffffffffff8416611c8a565b610cf3611a51565b6009805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f81accd0a7023865eaa51b3399dd0eafc488bf3ba238402911e1659cfe860f22891015b60405180910390a15050565b6040805180820190915260608082526020820152610d9f610d9a83613bb5565b611ca2565b60095473ffffffffffffffffffffffffffffffffffffffff16610e6a576040517f79cc6790000000000000000000000000000000000000000000000000000000008152306004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b50505050610e7b565b610e7b610e7683613bb5565b611e6c565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610ed584602001602081019061049e919061321f565b81526040805160208181019092526000815291015292915050565b6060610efc6002611f86565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261064290611f93565b67ffffffffffffffff81166000908152600760205260409020600501805460609190610673906137e6565b611009611a51565b73ffffffffffffffffffffffffffffffffffffffff8116611056576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849101610d6e565b606060006110e36005611f86565b90506000815167ffffffffffffffff811115611101576111016135ea565b60405190808252806020026020018201604052801561112a578160200160208202803683370190505b50905060005b82518110156111865782818151811061114b5761114b613c57565b602002602001015182828151811061116557611165613c57565b67ffffffffffffffff90921660209283029190910190910152600101611130565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261064290611f93565b60085473ffffffffffffffffffffffffffffffffffffffff16331480159061129f575060005473ffffffffffffffffffffffffffffffffffffffff163314155b156112d8576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610996565b6112e3838383612045565b505050565b6112f0611a51565b60005b818110156112e357600083838381811061130f5761130f613c57565b90506020028101906113219190613c86565b61132a90613cc4565b905061133f816080015182602001511561212f565b6113528160a0015182602001511561212f565b80602001511561164e5780516113749060059067ffffffffffffffff16612268565b6113b95780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610996565b60408101515115806113ce5750606081015151155b15611405576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906115e69082613d78565b50606082015160058201906115fb9082613d78565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506116419493929190613e92565b60405180910390a1611765565b80516116669060059067ffffffffffffffff16612274565b6116ab5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610996565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906117146004830182613172565b611722600583016000613172565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b506001016112f3565b611776611a51565b61177f81612280565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146118175760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610996565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190613b98565b15611920576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61192d8160200151612375565b600061193c8260200151610648565b9050805160001480611960575080805190602001208260a001518051906020012014155b1561199d578160a001516040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161099691906132a8565b6119af8260200151836060015161249b565b5050565b60095481516040808401516060850151602086015192517f8627fad600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90951694638627fad694611a1c9490939291600401613f2b565b600060405180830381600087803b158015611a3657600080fd5b505af1158015611a4a573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610996565b565b7f0000000000000000000000000000000000000000000000000000000000000000611b2b576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611bc1576000838281518110611b4b57611b4b613c57565b60200260200101519050611b698160026124e290919063ffffffff16565b15611bb85760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611b2e565b5060005b81518110156112e3576000828281518110611be257611be2613c57565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c265750611c82565b611c31600282612504565b15611c805760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611bc5565b60008181526001830160205260408120541515610ccd565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611d375760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610996565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e099190613b98565b15611e40576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e4d8160400151612526565b611e5a81602001516125a5565b61177f816020015182606001516126f3565b6009546060820151611eb99173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692911690612737565b60095460408083015183516060850151602086015193517f9687544500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90951694639687544594611f2194939291600401613f8c565b6000604051808303816000875af1158015611f40573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119af9190810190613fec565b60606000610ccd836127c4565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261202182606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426120059190614089565b85608001516fffffffffffffffffffffffffffffffff1661281f565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b61204e83610cd4565b612090576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610996565b61209b82600061212f565b67ffffffffffffffff831660009081526007602052604090206120be9083612849565b6120c981600061212f565b67ffffffffffffffff831660009081526007602052604090206120ef9060020182612849565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516121229392919061409c565b60405180910390a1505050565b8151156121f65781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580612185575060408201516fffffffffffffffffffffffffffffffff16155b156121be57816040517f8020d124000000000000000000000000000000000000000000000000000000008152600401610996919061411f565b80156119af576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff1615158061222f575060208201516fffffffffffffffffffffffffffffffff1615155b156119af57816040517fd68af9cc000000000000000000000000000000000000000000000000000000008152600401610996919061411f565b6000610ccd83836129eb565b6000610ccd8383612a3a565b3373ffffffffffffffffffffffffffffffffffffffff8216036122ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610996565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61237e81610cd4565b6123c0576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610996565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa15801561243f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124639190613b98565b61177f576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610996565b67ffffffffffffffff821660009081526007602052604090206119af90600201827f0000000000000000000000000000000000000000000000000000000000000000612b2d565b6000610ccd8373ffffffffffffffffffffffffffffffffffffffff8416612a3a565b6000610ccd8373ffffffffffffffffffffffffffffffffffffffff84166129eb565b7f00000000000000000000000000000000000000000000000000000000000000001561177f57612557600282612eb0565b61177f576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610996565b6125ae81610cd4565b6125f0576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610996565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268d919061415b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461177f576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610996565b67ffffffffffffffff821660009081526007602052604090206119af90827f0000000000000000000000000000000000000000000000000000000000000000612b2d565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526112e3908490612edf565b6060816000018054806020026020016040519081016040528092919081815260200182805480156106ec57602002820191906000526020600020905b8154815260200190600101908083116128005750505050509050919050565b600061283e8561282f8486614178565b612839908761418f565b612feb565b90505b949350505050565b815460009061287290700100000000000000000000000000000000900463ffffffff1642614089565b9050801561291457600183015483546128ba916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661281f565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461293a916fffffffffffffffffffffffffffffffff9081169116612feb565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061212290849061411f565b6000818152600183016020526040812054612a3257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610642565b506000610642565b60008181526001830160205260408120548015612b23576000612a5e600183614089565b8554909150600090612a7290600190614089565b9050808214612ad7576000866000018281548110612a9257612a92613c57565b9060005260206000200154905080876000018481548110612ab557612ab5613c57565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ae857612ae86141a2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610642565b6000915050610642565b825474010000000000000000000000000000000000000000900460ff161580612b54575081155b15612b5e57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612ba490700100000000000000000000000000000000900463ffffffff1642614089565b90508015612c645781831115612be6576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612c209083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661281f565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612d1b5773ffffffffffffffffffffffffffffffffffffffff8416612cc3576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610996565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610996565b84831015612e2e5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612d5f9082614089565b612d69878a614089565b612d73919061418f565b612d7d91906141d1565b905073ffffffffffffffffffffffffffffffffffffffff8616612dd6576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610996565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610996565b612e388584614089565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610ccd565b6000612f41826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130019092919063ffffffff16565b8051909150156112e35780806020019051810190612f5f9190613b98565b6112e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610996565b6000818310612ffa5781610ccd565b5090919050565b60606128418484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613035919061420c565b60006040518083038185875af1925050503d8060008114613072576040519150601f19603f3d011682016040523d82523d6000602084013e613077565b606091505b509150915061308887838387613093565b979650505050505050565b606083156131295782516000036131225773ffffffffffffffffffffffffffffffffffffffff85163b613122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610996565b5081612841565b612841838381511561313e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099691906132a8565b50805461317e906137e6565b6000825580601f1061318e575050565b601f01602090049060005260206000209081019061177f91905b808211156131bc57600081556001016131a8565b5090565b6000602082840312156131d257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ccd57600080fd5b803567ffffffffffffffff8116811461321a57600080fd5b919050565b60006020828403121561323157600080fd5b610ccd82613202565b60005b8381101561325557818101518382015260200161323d565b50506000910152565b6000815180845261327681602086016020860161323a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ccd602083018461325e565b73ffffffffffffffffffffffffffffffffffffffff8116811461177f57600080fd5b803561321a816132bb565b6000602082840312156132fa57600080fd5b8135610ccd816132bb565b60006020828403121561331757600080fd5b813567ffffffffffffffff81111561332e57600080fd5b82016101008185031215610ccd57600080fd5b60008083601f84011261335357600080fd5b50813567ffffffffffffffff81111561336b57600080fd5b6020830191508360208260051b850101111561338657600080fd5b9250929050565b600080600080604085870312156133a357600080fd5b843567ffffffffffffffff808211156133bb57600080fd5b6133c788838901613341565b909650945060208701359150808211156133e057600080fd5b506133ed87828801613341565b95989497509550505050565b60008060006040848603121561340e57600080fd5b61341784613202565b9250602084013567ffffffffffffffff8082111561343457600080fd5b818601915086601f83011261344857600080fd5b81358181111561345757600080fd5b87602082850101111561346957600080fd5b6020830194508093505050509250925092565b6000806040838503121561348f57600080fd5b61349883613202565b915060208301356134a8816132bb565b809150509250929050565b6000602082840312156134c557600080fd5b813567ffffffffffffffff8111156134dc57600080fd5b820160a08185031215610ccd57600080fd5b60208152600082516040602084015261350a606084018261325e565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152613545828261325e565b95945050505050565b6020808252825182820181905260009190848201906040850190845b8181101561359c57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161356a565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561359c57835167ffffffffffffffff16835292840192918401916001016135c4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff8111828210171561363d5761363d6135ea565b60405290565b60405160c0810167ffffffffffffffff8111828210171561363d5761363d6135ea565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136ad576136ad6135ea565b604052919050565b801515811461177f57600080fd5b803561321a816136b5565b80356fffffffffffffffffffffffffffffffff8116811461321a57600080fd5b60006060828403121561370057600080fd5b6040516060810181811067ffffffffffffffff82111715613723576137236135ea565b6040529050808235613734816136b5565b8152613742602084016136ce565b6020820152613753604084016136ce565b60408201525092915050565b600080600060e0848603121561377457600080fd5b61377d84613202565b925061378c85602086016136ee565b915061379b85608086016136ee565b90509250925092565b600080602083850312156137b757600080fd5b823567ffffffffffffffff8111156137ce57600080fd5b6137da85828601613341565b90969095509350505050565b600181811c908216806137fa57607f821691505b602082108103613833577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600067ffffffffffffffff821115613853576138536135ea565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261389057600080fd5b81356138a361389e82613839565b613666565b8181528460208386010111156138b857600080fd5b816020850160208301376000918101602001919091529392505050565b600061010082360312156138e857600080fd5b6138f0613619565b823567ffffffffffffffff8082111561390857600080fd5b6139143683870161387f565b835261392260208601613202565b6020840152613933604086016132dd565b60408401526060850135606084015261394e608086016132dd565b608084015260a085013591508082111561396757600080fd5b6139733683870161387f565b60a084015260c085013591508082111561398c57600080fd5b6139983683870161387f565b60c084015260e08501359150808211156139b157600080fd5b506139be3682860161387f565b60e08301525092915050565b601f8211156112e3576000816000526020600020601f850160051c810160208610156139f35750805b601f850160051c820191505b81811015613a12578281556001016139ff565b505050505050565b67ffffffffffffffff831115613a3257613a326135ea565b613a4683613a4083546137e6565b836139ca565b6000601f841160018114613a985760008515613a625750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611a4a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613ae75786850135825560209485019460019092019101613ac7565b5086821015613b22577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b604081526000613b47604083018661325e565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060208284031215613baa57600080fd5b8151610ccd816136b5565b600060a08236031215613bc757600080fd5b60405160a0810167ffffffffffffffff8282108183111715613beb57613beb6135ea565b816040528435915080821115613c0057600080fd5b50613c0d3682860161387f565b825250613c1c60208401613202565b60208201526040830135613c2f816132bb565b6040820152606083810135908201526080830135613c4c816132bb565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1833603018112613cba57600080fd5b9190910192915050565b60006101408236031215613cd757600080fd5b613cdf613643565b613ce883613202565b8152613cf6602084016136c3565b6020820152604083013567ffffffffffffffff80821115613d1657600080fd5b613d223683870161387f565b60408401526060850135915080821115613d3b57600080fd5b50613d483682860161387f565b606083015250613d5b36608085016136ee565b6080820152613d6d3660e085016136ee565b60a082015292915050565b815167ffffffffffffffff811115613d9257613d926135ea565b613da681613da084546137e6565b846139ca565b602080601f831160018114613df95760008415613dc35750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a12565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e4657888601518255948401946001909101908401613e27565b5085821015613e8257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613eb68184018761325e565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613ef49050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152613545565b60a081526000613f3e60a083018761325e565b73ffffffffffffffffffffffffffffffffffffffff8616602084015284604084015267ffffffffffffffff841660608401528281036080840152600081526020810191505095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8516815260a060208201526000613fbb60a083018661325e565b60408301949094525067ffffffffffffffff9190911660608201528082036080909101526000815260200192915050565b600060208284031215613ffe57600080fd5b815167ffffffffffffffff81111561401557600080fd5b8201601f8101841361402657600080fd5b805161403461389e82613839565b81815285602083850101111561404957600080fd5b61354582602083016020860161323a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106425761064261405a565b67ffffffffffffffff8416815260e081016140e860208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152612841565b6060810161064282848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561416d57600080fd5b8151610ccd816132bb565b80820281158282048414176106425761064261405a565b808201808211156106425761064261405a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082614207577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008251613cba81846020870161323a56fe4275726e46726f6d4d696e74546f6b656e506f6f6c416e6450726f787920312e352e30a164736f6c6343000818000a",
+ Bin: "0x60e06040523480156200001157600080fd5b5060405162004dde38038062004dde8339810160408190526200003491620008cc565b83838383838383833380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200019b565b5050506001600160a01b0384161580620000e757506001600160a01b038116155b80620000fa57506001600160a01b038216155b1562000119576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016c576040805160008152602081019091526200016c908462000246565b50620001919650506001600160a01b038a169450309350600019925050620003a39050565b5050505062000b08565b336001600160a01b03821603620001f55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c05162000267576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002f25760008382815181106200028b576200028b620009dc565b60209081029190910101519050620002a560028262000489565b15620002e8576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200026a565b5060005b81518110156200039e576000828281518110620003175762000317620009dc565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000343575062000395565b62000350600282620004a9565b1562000393576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002f6565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041b9190620009f2565b62000427919062000a22565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200048391869190620004c016565b50505050565b6000620004a0836001600160a01b03841662000591565b90505b92915050565b6000620004a0836001600160a01b03841662000695565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200050f906001600160a01b038516908490620006e7565b8051909150156200039e578080602001905181019062000530919062000a38565b6200039e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b600081815260018301602052604081205480156200068a576000620005b860018362000a63565b8554909150600090620005ce9060019062000a63565b90508082146200063a576000866000018281548110620005f257620005f2620009dc565b9060005260206000200154905080876000018481548110620006185762000618620009dc565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200064e576200064e62000a79565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620004a3565b6000915050620004a3565b6000818152600183016020526040812054620006de57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004a3565b506000620004a3565b6060620006f8848460008562000700565b949350505050565b606082471015620007635760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b0316858760405162000781919062000ab5565b60006040518083038185875af1925050503d8060008114620007c0576040519150601f19603f3d011682016040523d82523d6000602084013e620007c5565b606091505b509092509050620007d987838387620007e4565b979650505050505050565b606083156200085857825160000362000850576001600160a01b0385163b620008505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620006f8565b620006f883838151156200086f5781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000ad3565b6001600160a01b0381168114620008a157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008c7816200088b565b919050565b60008060008060808587031215620008e357600080fd5b8451620008f0816200088b565b602086810151919550906001600160401b03808211156200091057600080fd5b818801915088601f8301126200092557600080fd5b8151818111156200093a576200093a620008a4565b8060051b604051601f19603f83011681018181108582111715620009625762000962620008a4565b60405291825284820192508381018501918b8311156200098157600080fd5b938501935b82851015620009aa576200099a85620008ba565b8452938501939285019262000986565b809850505050505050620009c160408601620008ba565b9150620009d160608601620008ba565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115620004a357620004a362000a0c565b60006020828403121562000a4b57600080fd5b8151801515811462000a5c57600080fd5b9392505050565b81810381811115620004a357620004a362000a0c565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aac57818101518382015260200162000a92565b50506000910152565b6000825162000ac981846020870162000a8f565b9190910192915050565b602081526000825180602084015262000af481604085016020870162000a8f565b601f01601f19169190910160400192915050565b60805160a05160c05161425262000b8c6000396000818161052c01528181611ad60152612528015260008181610506015281816118690152611d89015260008181610231015281816102860152818161076801528181610df40152818161178901528181611ca901528181611e8f015281816124be015261271301526142526000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a4575b911610104578063c0d78655116100a2578063db6327dc11610071578063db6327dc146104f1578063dc0bd97114610504578063e0351e131461052a578063f2fde38b1461055057600080fd5b8063c0d78655146104a3578063c4bffe2b146104b6578063c75eea9c146104cb578063cf7401f3146104de57600080fd5b8063a8d87a3b116100de578063a8d87a3b146103f0578063af58d59f14610403578063b0f479a114610472578063b79465801461049057600080fd5b80639a4575b91461039d578063a2b261d8146103bd578063a7cd63b7146103db57600080fd5b80636d3d1a581161017c57806383826b2b1161014b57806383826b2b146103465780638926f54f146103595780638da5cb5b1461036c5780639766b9321461038a57600080fd5b80636d3d1a58146102fa57806378a010b21461031857806379ba50971461032b5780637d54534e1461033357600080fd5b806321df0da7116101b857806321df0da71461022f578063240028e81461027657806339077537146102c357806354c8a4f3146102e557600080fd5b806301ffc9a7146101df5780630a2fd49314610207578063181f5a7714610227575b600080fd5b6101f26101ed3660046131c0565b610563565b60405190151581526020015b60405180910390f35b61021a61021536600461321f565b610648565b6040516101fe91906132a8565b61021a6106f8565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b6101f26102843660046132e8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102d66102d1366004613305565b610714565b604051905181526020016101fe565b6102f86102f336600461338d565b6108cc565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610251565b6102f86103263660046133f9565b610947565b6102f8610abb565b6102f86103413660046132e8565b610bb8565b6101f261035436600461347c565b610c07565b6101f261036736600461321f565b610cd4565b60005473ffffffffffffffffffffffffffffffffffffffff16610251565b6102f86103983660046132e8565b610ceb565b6103b06103ab3660046134b3565b610d7a565b6040516101fe91906134ee565b60095473ffffffffffffffffffffffffffffffffffffffff16610251565b6103e3610ef0565b6040516101fe919061354e565b6102516103fe36600461321f565b503090565b61041661041136600461321f565b610f01565b6040516101fe919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610251565b61021a61049e36600461321f565b610fd6565b6102f86104b13660046132e8565b611001565b6104be6110d5565b6040516101fe91906135a8565b6104166104d936600461321f565b61118d565b6102f86104ec36600461375f565b61125f565b6102f86104ff3660046137a4565b6112e8565b7f0000000000000000000000000000000000000000000000000000000000000000610251565b7f00000000000000000000000000000000000000000000000000000000000000006101f2565b6102f861055e3660046132e8565b61176e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806105f657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061064257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff81166000908152600760205260409020600401805460609190610673906137e6565b80601f016020809104026020016040519081016040528092919081815260200182805461069f906137e6565b80156106ec5780601f106106c1576101008083540402835291602001916106ec565b820191906000526020600020905b8154815290600101906020018083116106cf57829003601f168201915b50505050509050919050565b60405180606001604052806027815260200161421f6027913981565b60408051602081019091526000815261073461072f836138d5565b611782565b60095473ffffffffffffffffffffffffffffffffffffffff1661082a5773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166340c10f1961079d60608501604086016132e8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608501356024820152604401600060405180830381600087803b15801561080d57600080fd5b505af1158015610821573d6000803e3d6000fd5b5050505061083b565b61083b610836836138d5565b6119b3565b61084b60608301604084016132e8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f084606001356040516108ad91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6108d4611a51565b61094184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611ad492505050565b50505050565b61094f611a51565b61095883610cd4565b61099f576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546109c6906137e6565b80601f01602080910402602001604051908101604052809291908181526020018280546109f2906137e6565b8015610a3f5780601f10610a1457610100808354040283529160200191610a3f565b820191906000526020600020905b815481529060010190602001808311610a2257829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610a6e838583613a1a565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610aad93929190613b34565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610996565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610bc0611a51565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600073ffffffffffffffffffffffffffffffffffffffff8216301480610ccd5750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169281019290925273ffffffffffffffffffffffffffffffffffffffff848116602484015216906383826b2b90604401602060405180830381865afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd9190613b98565b9392505050565b6000610642600567ffffffffffffffff8416611c8a565b610cf3611a51565b6009805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f81accd0a7023865eaa51b3399dd0eafc488bf3ba238402911e1659cfe860f22891015b60405180910390a15050565b6040805180820190915260608082526020820152610d9f610d9a83613bb5565b611ca2565b60095473ffffffffffffffffffffffffffffffffffffffff16610e6a576040517f79cc6790000000000000000000000000000000000000000000000000000000008152306004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b50505050610e7b565b610e7b610e7683613bb5565b611e6c565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610ed584602001602081019061049e919061321f565b81526040805160208181019092526000815291015292915050565b6060610efc6002611f86565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261064290611f93565b67ffffffffffffffff81166000908152600760205260409020600501805460609190610673906137e6565b611009611a51565b73ffffffffffffffffffffffffffffffffffffffff8116611056576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849101610d6e565b606060006110e36005611f86565b90506000815167ffffffffffffffff811115611101576111016135ea565b60405190808252806020026020018201604052801561112a578160200160208202803683370190505b50905060005b82518110156111865782818151811061114b5761114b613c57565b602002602001015182828151811061116557611165613c57565b67ffffffffffffffff90921660209283029190910190910152600101611130565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261064290611f93565b60085473ffffffffffffffffffffffffffffffffffffffff16331480159061129f575060005473ffffffffffffffffffffffffffffffffffffffff163314155b156112d8576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610996565b6112e3838383612045565b505050565b6112f0611a51565b60005b818110156112e357600083838381811061130f5761130f613c57565b90506020028101906113219190613c86565b61132a90613cc4565b905061133f816080015182602001511561212f565b6113528160a0015182602001511561212f565b80602001511561164e5780516113749060059067ffffffffffffffff16612268565b6113b95780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610996565b60408101515115806113ce5750606081015151155b15611405576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906115e69082613d78565b50606082015160058201906115fb9082613d78565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506116419493929190613e92565b60405180910390a1611765565b80516116669060059067ffffffffffffffff16612274565b6116ab5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610996565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906117146004830182613172565b611722600583016000613172565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b506001016112f3565b611776611a51565b61177f81612280565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146118175760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610996565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190613b98565b15611920576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61192d8160200151612375565b600061193c8260200151610648565b9050805160001480611960575080805190602001208260a001518051906020012014155b1561199d578160a001516040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161099691906132a8565b6119af8260200151836060015161249b565b5050565b60095481516040808401516060850151602086015192517f8627fad600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90951694638627fad694611a1c9490939291600401613f2b565b600060405180830381600087803b158015611a3657600080fd5b505af1158015611a4a573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610996565b565b7f0000000000000000000000000000000000000000000000000000000000000000611b2b576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611bc1576000838281518110611b4b57611b4b613c57565b60200260200101519050611b698160026124e290919063ffffffff16565b15611bb85760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611b2e565b5060005b81518110156112e3576000828281518110611be257611be2613c57565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c265750611c82565b611c31600282612504565b15611c805760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611bc5565b60008181526001830160205260408120541515610ccd565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611d375760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610996565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e099190613b98565b15611e40576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e4d8160400151612526565b611e5a81602001516125a5565b61177f816020015182606001516126f3565b6009546060820151611eb99173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692911690612737565b60095460408083015183516060850151602086015193517f9687544500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90951694639687544594611f2194939291600401613f8c565b6000604051808303816000875af1158015611f40573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119af9190810190613fec565b60606000610ccd836127c4565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261202182606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426120059190614089565b85608001516fffffffffffffffffffffffffffffffff1661281f565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b61204e83610cd4565b612090576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610996565b61209b82600061212f565b67ffffffffffffffff831660009081526007602052604090206120be9083612849565b6120c981600061212f565b67ffffffffffffffff831660009081526007602052604090206120ef9060020182612849565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516121229392919061409c565b60405180910390a1505050565b8151156121f65781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580612185575060408201516fffffffffffffffffffffffffffffffff16155b156121be57816040517f8020d124000000000000000000000000000000000000000000000000000000008152600401610996919061411f565b80156119af576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff1615158061222f575060208201516fffffffffffffffffffffffffffffffff1615155b156119af57816040517fd68af9cc000000000000000000000000000000000000000000000000000000008152600401610996919061411f565b6000610ccd83836129eb565b6000610ccd8383612a3a565b3373ffffffffffffffffffffffffffffffffffffffff8216036122ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610996565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61237e81610cd4565b6123c0576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610996565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa15801561243f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124639190613b98565b61177f576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610996565b67ffffffffffffffff821660009081526007602052604090206119af90600201827f0000000000000000000000000000000000000000000000000000000000000000612b2d565b6000610ccd8373ffffffffffffffffffffffffffffffffffffffff8416612a3a565b6000610ccd8373ffffffffffffffffffffffffffffffffffffffff84166129eb565b7f00000000000000000000000000000000000000000000000000000000000000001561177f57612557600282612eb0565b61177f576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610996565b6125ae81610cd4565b6125f0576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610996565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268d919061415b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461177f576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610996565b67ffffffffffffffff821660009081526007602052604090206119af90827f0000000000000000000000000000000000000000000000000000000000000000612b2d565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526112e3908490612edf565b6060816000018054806020026020016040519081016040528092919081815260200182805480156106ec57602002820191906000526020600020905b8154815260200190600101908083116128005750505050509050919050565b600061283e8561282f8486614178565b612839908761418f565b612feb565b90505b949350505050565b815460009061287290700100000000000000000000000000000000900463ffffffff1642614089565b9050801561291457600183015483546128ba916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661281f565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461293a916fffffffffffffffffffffffffffffffff9081169116612feb565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061212290849061411f565b6000818152600183016020526040812054612a3257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610642565b506000610642565b60008181526001830160205260408120548015612b23576000612a5e600183614089565b8554909150600090612a7290600190614089565b9050808214612ad7576000866000018281548110612a9257612a92613c57565b9060005260206000200154905080876000018481548110612ab557612ab5613c57565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ae857612ae86141a2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610642565b6000915050610642565b825474010000000000000000000000000000000000000000900460ff161580612b54575081155b15612b5e57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612ba490700100000000000000000000000000000000900463ffffffff1642614089565b90508015612c645781831115612be6576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612c209083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661281f565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612d1b5773ffffffffffffffffffffffffffffffffffffffff8416612cc3576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610996565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610996565b84831015612e2e5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612d5f9082614089565b612d69878a614089565b612d73919061418f565b612d7d91906141d1565b905073ffffffffffffffffffffffffffffffffffffffff8616612dd6576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610996565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610996565b612e388584614089565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610ccd565b6000612f41826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130019092919063ffffffff16565b8051909150156112e35780806020019051810190612f5f9190613b98565b6112e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610996565b6000818310612ffa5781610ccd565b5090919050565b60606128418484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613035919061420c565b60006040518083038185875af1925050503d8060008114613072576040519150601f19603f3d011682016040523d82523d6000602084013e613077565b606091505b509150915061308887838387613093565b979650505050505050565b606083156131295782516000036131225773ffffffffffffffffffffffffffffffffffffffff85163b613122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610996565b5081612841565b612841838381511561313e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099691906132a8565b50805461317e906137e6565b6000825580601f1061318e575050565b601f01602090049060005260206000209081019061177f91905b808211156131bc57600081556001016131a8565b5090565b6000602082840312156131d257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ccd57600080fd5b803567ffffffffffffffff8116811461321a57600080fd5b919050565b60006020828403121561323157600080fd5b610ccd82613202565b60005b8381101561325557818101518382015260200161323d565b50506000910152565b6000815180845261327681602086016020860161323a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ccd602083018461325e565b73ffffffffffffffffffffffffffffffffffffffff8116811461177f57600080fd5b803561321a816132bb565b6000602082840312156132fa57600080fd5b8135610ccd816132bb565b60006020828403121561331757600080fd5b813567ffffffffffffffff81111561332e57600080fd5b82016101008185031215610ccd57600080fd5b60008083601f84011261335357600080fd5b50813567ffffffffffffffff81111561336b57600080fd5b6020830191508360208260051b850101111561338657600080fd5b9250929050565b600080600080604085870312156133a357600080fd5b843567ffffffffffffffff808211156133bb57600080fd5b6133c788838901613341565b909650945060208701359150808211156133e057600080fd5b506133ed87828801613341565b95989497509550505050565b60008060006040848603121561340e57600080fd5b61341784613202565b9250602084013567ffffffffffffffff8082111561343457600080fd5b818601915086601f83011261344857600080fd5b81358181111561345757600080fd5b87602082850101111561346957600080fd5b6020830194508093505050509250925092565b6000806040838503121561348f57600080fd5b61349883613202565b915060208301356134a8816132bb565b809150509250929050565b6000602082840312156134c557600080fd5b813567ffffffffffffffff8111156134dc57600080fd5b820160a08185031215610ccd57600080fd5b60208152600082516040602084015261350a606084018261325e565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152613545828261325e565b95945050505050565b6020808252825182820181905260009190848201906040850190845b8181101561359c57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161356a565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561359c57835167ffffffffffffffff16835292840192918401916001016135c4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff8111828210171561363d5761363d6135ea565b60405290565b60405160c0810167ffffffffffffffff8111828210171561363d5761363d6135ea565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136ad576136ad6135ea565b604052919050565b801515811461177f57600080fd5b803561321a816136b5565b80356fffffffffffffffffffffffffffffffff8116811461321a57600080fd5b60006060828403121561370057600080fd5b6040516060810181811067ffffffffffffffff82111715613723576137236135ea565b6040529050808235613734816136b5565b8152613742602084016136ce565b6020820152613753604084016136ce565b60408201525092915050565b600080600060e0848603121561377457600080fd5b61377d84613202565b925061378c85602086016136ee565b915061379b85608086016136ee565b90509250925092565b600080602083850312156137b757600080fd5b823567ffffffffffffffff8111156137ce57600080fd5b6137da85828601613341565b90969095509350505050565b600181811c908216806137fa57607f821691505b602082108103613833577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600067ffffffffffffffff821115613853576138536135ea565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261389057600080fd5b81356138a361389e82613839565b613666565b8181528460208386010111156138b857600080fd5b816020850160208301376000918101602001919091529392505050565b600061010082360312156138e857600080fd5b6138f0613619565b823567ffffffffffffffff8082111561390857600080fd5b6139143683870161387f565b835261392260208601613202565b6020840152613933604086016132dd565b60408401526060850135606084015261394e608086016132dd565b608084015260a085013591508082111561396757600080fd5b6139733683870161387f565b60a084015260c085013591508082111561398c57600080fd5b6139983683870161387f565b60c084015260e08501359150808211156139b157600080fd5b506139be3682860161387f565b60e08301525092915050565b601f8211156112e3576000816000526020600020601f850160051c810160208610156139f35750805b601f850160051c820191505b81811015613a12578281556001016139ff565b505050505050565b67ffffffffffffffff831115613a3257613a326135ea565b613a4683613a4083546137e6565b836139ca565b6000601f841160018114613a985760008515613a625750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611a4a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613ae75786850135825560209485019460019092019101613ac7565b5086821015613b22577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b604081526000613b47604083018661325e565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060208284031215613baa57600080fd5b8151610ccd816136b5565b600060a08236031215613bc757600080fd5b60405160a0810167ffffffffffffffff8282108183111715613beb57613beb6135ea565b816040528435915080821115613c0057600080fd5b50613c0d3682860161387f565b825250613c1c60208401613202565b60208201526040830135613c2f816132bb565b6040820152606083810135908201526080830135613c4c816132bb565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1833603018112613cba57600080fd5b9190910192915050565b60006101408236031215613cd757600080fd5b613cdf613643565b613ce883613202565b8152613cf6602084016136c3565b6020820152604083013567ffffffffffffffff80821115613d1657600080fd5b613d223683870161387f565b60408401526060850135915080821115613d3b57600080fd5b50613d483682860161387f565b606083015250613d5b36608085016136ee565b6080820152613d6d3660e085016136ee565b60a082015292915050565b815167ffffffffffffffff811115613d9257613d926135ea565b613da681613da084546137e6565b846139ca565b602080601f831160018114613df95760008415613dc35750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a12565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e4657888601518255948401946001909101908401613e27565b5085821015613e8257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613eb68184018761325e565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613ef49050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152613545565b60a081526000613f3e60a083018761325e565b73ffffffffffffffffffffffffffffffffffffffff8616602084015284604084015267ffffffffffffffff841660608401528281036080840152600081526020810191505095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8516815260a060208201526000613fbb60a083018661325e565b60408301949094525067ffffffffffffffff9190911660608201528082036080909101526000815260200192915050565b600060208284031215613ffe57600080fd5b815167ffffffffffffffff81111561401557600080fd5b8201601f8101841361402657600080fd5b805161403461389e82613839565b81815285602083850101111561404957600080fd5b61354582602083016020860161323a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106425761064261405a565b67ffffffffffffffff8416815260e081016140e860208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152612841565b6060810161064282848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561416d57600080fd5b8151610ccd816132bb565b80820281158282048414176106425761064261405a565b808201808211156106425761064261405a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082614207577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008251613cba81846020870161323a56fe4275726e5769746846726f6d4d696e74546f6b656e506f6f6c416e6450726f787920312e352e30a164736f6c6343000818000a",
}
var BurnWithFromMintTokenPoolAndProxyABI = BurnWithFromMintTokenPoolAndProxyMetaData.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 8b9f869a71..b4c5c52e82 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
@@ -3,7 +3,7 @@ burn_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool
burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin 3e8e3358f0bb520af069a7d37ea625940a88461a54418b1d5925eabced8c74df
burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 717c079d5d13300cf3c3ee871c6e5bf9af904411f204fb081a9f3b263cca1391
burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6333d0314d0bd29e75ea5e05fe62a4516ade0c6db91c30b6f93645035db52ed8
-burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 08ed1235dda921ce8841b26aa18d0c0f36db4884779dd7670857159801b6d597
+burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 1ed5c299f928529081dc01b7a46db2b5e6728001767863495a7675d8db99a9e2
ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin 2e6fa009821d30a24efdc9f9d14b2269fb9a51cb7d536ea8b2d29d97dd8b591c
ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin 87de30d71a511f936bdeecb01a88a70ad3f323117202ebb17cdbdc84d65a3857
ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 32916b41e0070cb6853d558bbff06ab367324fa52cac59893065e8f616ff14f0
From bd22732e2502b042e5e94a0634a2ab397aadff5d Mon Sep 17 00:00:00 2001
From: Patrick
Date: Wed, 2 Oct 2024 12:12:18 -0400
Subject: [PATCH 17/32] fix when contract reader fails on latestRoundData call
(#1476)
## Motivation
https://github.com/smartcontractkit/ccip/blob/b71329d41b803ca16dc9a1f9d5247c87fd6fbc32/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go#L209
will panic with
```
panic: runtime error: index out of range [1] with length 1
goroutine 3683 [running]:
github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/pricegetter.(*DynamicPriceGetter).performBatchCall(0x8?, {0x46d85c0, 0x67ae360}, 0xa77ab4f8?, 0xc0174776d0, 0xc017475aa0)
/chainlink/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go:209 +0x1998
```
This can happen when the contract reader fails on a LatestRoundData call
when only one aggregator contract is requested in the batch call.
## Solution
Use `read.ReadName`
---
.../ocr2/plugins/ccip/internal/pricegetter/evm.go | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
index 48ad9f3298..4e8b5fbd77 100644
--- a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
+++ b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
@@ -203,23 +203,23 @@ func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint6
contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, j)
offchainAggregatorRespSlice := result[contractName]
- for i, read := range offchainAggregatorRespSlice {
+ for _, read := range offchainAggregatorRespSlice {
val, readErr := read.GetResult()
if readErr != nil {
- respErr = multierr.Append(respErr, fmt.Errorf("error with method call %v: %w", batchCalls.decimalCalls[i].MethodName(), readErr))
+ respErr = multierr.Append(respErr, fmt.Errorf("error with contract reader readName %v: %w", read.ReadName, readErr))
continue
}
if read.ReadName == DECIMALS_METHOD_NAME {
decimal, ok := val.(*uint8)
if !ok {
- return fmt.Errorf("expected type uint8 for method call %v on contract %v: %w", batchCalls.decimalCalls[i].MethodName(), batchCalls.decimalCalls[i].ContractAddress(), readErr)
+ return fmt.Errorf("expected type uint8 for method call %v on contract %v: %w", batchCalls.decimalCalls[j].MethodName(), batchCalls.decimalCalls[j].ContractAddress(), readErr)
}
decimalsCR = append(decimalsCR, *decimal)
} else if read.ReadName == LATEST_ROUND_DATA_METHOD_NAME {
latestRoundDataRes, ok := val.(*aggregator_v3_interface.LatestRoundData)
if !ok {
- return fmt.Errorf("expected type latestRoundDataConfig for method call %v on contract %v: %w", batchCalls.latestRoundDataCalls[i/2].MethodName(), batchCalls.latestRoundDataCalls[i/2].ContractAddress(), readErr)
+ return fmt.Errorf("expected type latestRoundDataConfig for method call %v on contract %v: %w", batchCalls.latestRoundDataCalls[j].MethodName(), batchCalls.latestRoundDataCalls[j].ContractAddress(), readErr)
}
latestRoundCR = append(latestRoundCR, *latestRoundDataRes)
From 5aee339ad458ee4c3fa8644735c8b90a2a236524 Mon Sep 17 00:00:00 2001
From: Patrick
Date: Wed, 2 Oct 2024 12:39:31 -0400
Subject: [PATCH 18/32] Feature/commit init no evm followups (#1472)
## Motivation
Quick follow ups to https://github.com/smartcontractkit/ccip/pull/1361
---
core/services/ocr2/delegate.go | 13 ++-
.../plugins/ccip/internal/pricegetter/evm.go | 26 ++---
.../ccip/internal/pricegetter/evm_test.go | 101 +-----------------
3 files changed, 28 insertions(+), 112 deletions(-)
diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go
index 699c552030..03c1bc971f 100644
--- a/core/services/ocr2/delegate.go
+++ b/core/services/ocr2/delegate.go
@@ -1616,7 +1616,15 @@ func (d *Delegate) newServicesCCIPCommit(ctx context.Context, lggr logger.Sugare
MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"job_name": jb.Name.ValueOrZero()}, prometheus.DefaultRegisterer),
}
- var priceGetter ccip.AllTokensPriceGetter
+ priceGetter, err := d.ccipCommitPriceGetter(ctx, lggr, pluginJobSpecConfig, jb)
+ if err != nil {
+ return nil, fmt.Errorf("failed to create price getter: %w", err)
+ }
+ return ccipcommit.NewCommitServices(ctx, d.ds, srcProvider, dstProvider, priceGetter, jb, lggr, d.pipelineRunner, oracleArgsNoPlugin, d.isNewlyCreatedJob, int64(srcChainID), dstChainID, logError)
+}
+
+func (d *Delegate) ccipCommitPriceGetter(ctx context.Context, lggr logger.SugaredLogger, pluginJobSpecConfig ccipconfig.CommitPluginJobSpecConfig, jb job.Job) (priceGetter ccip.AllTokensPriceGetter, err error) {
+ spec := jb.OCR2OracleSpec
withPipeline := strings.Trim(pluginJobSpecConfig.TokenPricesUSDPipeline, "\n\t ") != ""
if withPipeline {
priceGetter, err = ccip.NewPipelineGetter(pluginJobSpecConfig.TokenPricesUSDPipeline, d.pipelineRunner, jb.ID, jb.ExternalJobID, jb.Name.ValueOrZero(), lggr)
@@ -1685,8 +1693,7 @@ func (d *Delegate) newServicesCCIPCommit(ctx context.Context, lggr logger.Sugare
return nil, fmt.Errorf("creating dynamic price getter: %w", err)
}
}
-
- return ccipcommit.NewCommitServices(ctx, d.ds, srcProvider, dstProvider, priceGetter, jb, lggr, d.pipelineRunner, oracleArgsNoPlugin, d.isNewlyCreatedJob, int64(srcChainID), dstChainID, logError)
+ return priceGetter, nil
}
func newCCIPCommitPluginBytes(isSourceProvider bool, sourceStartBlock uint64, destStartBlock uint64) config.CommitPluginConfig {
diff --git a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
index 4e8b5fbd77..532ca4bee0 100644
--- a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
+++ b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
@@ -20,9 +20,9 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib"
)
-const OFFCHAIN_AGGREGATOR = "OffchainAggregator"
-const DECIMALS_METHOD_NAME = "decimals"
-const LATEST_ROUND_DATA_METHOD_NAME = "latestRoundData"
+const OffchainAggregator = "OffchainAggregator"
+const DecimalsMethodName = "decimals"
+const LatestRoundDataMethodName = "latestRoundData"
func init() {
// Ensure existence of latestRoundData method on the Aggregator contract.
@@ -30,8 +30,8 @@ func init() {
if err != nil {
panic(err)
}
- ensureMethodOnContract(aggregatorABI, DECIMALS_METHOD_NAME)
- ensureMethodOnContract(aggregatorABI, LATEST_ROUND_DATA_METHOD_NAME)
+ ensureMethodOnContract(aggregatorABI, DecimalsMethodName)
+ ensureMethodOnContract(aggregatorABI, LatestRoundDataMethodName)
}
func ensureMethodOnContract(abi abi.ABI, methodName string) {
@@ -159,7 +159,7 @@ func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint6
for i, call := range batchCalls.decimalCalls {
bindings = append(bindings, types.BoundContract{
Address: string(ccipcalc.EvmAddrToGeneric(call.ContractAddress())),
- Name: fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i),
+ Name: fmt.Sprintf("%v_%v", OffchainAggregator, i),
})
}
@@ -172,7 +172,7 @@ func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint6
var decimalsReq uint8
batchGetLatestValuesRequest := make(map[string]types.ContractBatch)
for i, call := range batchCalls.decimalCalls {
- contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)
+ contractName := fmt.Sprintf("%v_%v", OffchainAggregator, i)
batchGetLatestValuesRequest[contractName] = append(batchGetLatestValuesRequest[contractName], types.BatchRead{
ReadName: call.MethodName(),
ReturnVal: &decimalsReq,
@@ -180,7 +180,7 @@ func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint6
}
for i, call := range batchCalls.latestRoundDataCalls {
- contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)
+ contractName := fmt.Sprintf("%v_%v", OffchainAggregator, i)
batchGetLatestValuesRequest[contractName] = append(batchGetLatestValuesRequest[contractName], types.BatchRead{
ReadName: call.MethodName(),
ReturnVal: &aggregator_v3_interface.LatestRoundData{},
@@ -200,7 +200,7 @@ func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint6
latestRoundCR := make([]aggregator_v3_interface.LatestRoundData, 0, nbDecimalCalls)
var respErr error
for j := range nbCalls {
- contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, j)
+ contractName := fmt.Sprintf("%v_%v", OffchainAggregator, j)
offchainAggregatorRespSlice := result[contractName]
for _, read := range offchainAggregatorRespSlice {
@@ -209,14 +209,14 @@ func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint6
respErr = multierr.Append(respErr, fmt.Errorf("error with contract reader readName %v: %w", read.ReadName, readErr))
continue
}
- if read.ReadName == DECIMALS_METHOD_NAME {
+ if read.ReadName == DecimalsMethodName {
decimal, ok := val.(*uint8)
if !ok {
return fmt.Errorf("expected type uint8 for method call %v on contract %v: %w", batchCalls.decimalCalls[j].MethodName(), batchCalls.decimalCalls[j].ContractAddress(), readErr)
}
decimalsCR = append(decimalsCR, *decimal)
- } else if read.ReadName == LATEST_ROUND_DATA_METHOD_NAME {
+ } else if read.ReadName == LatestRoundDataMethodName {
latestRoundDataRes, ok := val.(*aggregator_v3_interface.LatestRoundData)
if !ok {
return fmt.Errorf("expected type latestRoundDataConfig for method call %v on contract %v: %w", batchCalls.latestRoundDataCalls[j].MethodName(), batchCalls.latestRoundDataCalls[j].ContractAddress(), readErr)
@@ -271,12 +271,12 @@ func (d *DynamicPriceGetter) preparePricesAndBatchCallsPerChain(tokens []cciptyp
chainCalls := batchCallsPerChain[aggCfg.ChainID]
chainCalls.decimalCalls = append(chainCalls.decimalCalls, rpclib.NewEvmCall(
d.aggregatorAbi,
- DECIMALS_METHOD_NAME,
+ DecimalsMethodName,
aggCfg.AggregatorContractAddress,
))
chainCalls.latestRoundDataCalls = append(chainCalls.latestRoundDataCalls, rpclib.NewEvmCall(
d.aggregatorAbi,
- LATEST_ROUND_DATA_METHOD_NAME,
+ LatestRoundDataMethodName,
aggCfg.AggregatorContractAddress,
))
chainCalls.tokenOrder = append(chainCalls.tokenOrder, tk)
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 755bcb84eb..8ab2ce2bc4 100644
--- a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm_test.go
@@ -21,13 +21,10 @@ import (
"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"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib/rpclibmocks"
)
type testParameters struct {
cfg config.DynamicPriceGetterConfig
- evmClients map[uint64]DynamicPriceGetterClient
contractReaders map[uint64]types.ContractReader
tokens []common.Address
expectedTokenPrices map[common.Address]big.Int
@@ -200,12 +197,6 @@ func testParamAggregatorOnly(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1715753907),
AnsweredInRound: big.NewInt(4000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
- uint64(103): mockClient(t, []uint8{18}, []aggregator_v3_interface.LatestRoundData{round3}),
- uint64(104): mockClient(t, []uint8{20}, []aggregator_v3_interface.LatestRoundData{round4}),
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
@@ -220,7 +211,6 @@ func testParamAggregatorOnly(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3, TK4},
expectedTokenPrices: expectedTokenPrices,
@@ -270,10 +260,6 @@ func testParamAggregatorOnlyMulti(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1704897198),
AnsweredInRound: big.NewInt(3000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): mockClient(t, []uint8{8, 8}, []aggregator_v3_interface.LatestRoundData{round2, round3}),
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockCR(t, []uint8{8, 8}, []aggregator_v3_interface.LatestRoundData{round2, round3}),
@@ -285,7 +271,6 @@ func testParamAggregatorOnlyMulti(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
invalidConfigErrorExpected: false,
tokens: []common.Address{TK1, TK2, TK3},
@@ -312,7 +297,6 @@ func testParamStaticOnly() testParameters {
},
}
// Real LINK/USD example from OP.
- evmClients := map[uint64]DynamicPriceGetterClient{}
contractReaders := map[uint64]types.ContractReader{}
expectedTokenPrices := map[common.Address]big.Int{
TK1: *cfg.StaticPrices[TK1].Price,
@@ -321,7 +305,6 @@ func testParamStaticOnly() testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
expectedTokenPrices: expectedTokenPrices,
@@ -363,10 +346,6 @@ func testParamNoAggregatorForToken(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1704897197),
AnsweredInRound: big.NewInt(2000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
@@ -379,7 +358,6 @@ func testParamNoAggregatorForToken(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3, TK4},
expectedTokenPrices: expectedTokenPrices,
@@ -422,10 +400,6 @@ func testParamAggregatorAndStaticValid(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1704897197),
AnsweredInRound: big.NewInt(2000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
@@ -437,7 +411,6 @@ func testParamAggregatorAndStaticValid(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
expectedTokenPrices: expectedTokenPrices,
@@ -490,11 +463,6 @@ func testParamAggregatorAndStaticTokenCollision(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1704897198),
AnsweredInRound: big.NewInt(3000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
- uint64(103): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
@@ -502,7 +470,6 @@ func testParamAggregatorAndStaticTokenCollision(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
invalidConfigErrorExpected: true,
@@ -536,19 +503,12 @@ func testParamBatchCallReturnsErr(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1704896575),
AnsweredInRound: big.NewInt(1000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): {
- BatchCaller: mockErrCaller(t),
- },
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockErrCR(t),
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
evmCallErr: true,
@@ -602,11 +562,6 @@ func testLessInputsThanDefinedPrices(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1715743907),
AnsweredInRound: big.NewInt(3000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
- uint64(103): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
@@ -619,7 +574,6 @@ func testLessInputsThanDefinedPrices(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
tokens: []common.Address{TK1, TK2, TK3},
expectedTokenPrices: expectedTokenPrices,
@@ -673,11 +627,6 @@ func testGetAllTokensAggregatorAndStatic(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1715743907),
AnsweredInRound: big.NewInt(3000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
- uint64(103): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
@@ -691,7 +640,6 @@ func testGetAllTokensAggregatorAndStatic(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
expectedTokenPricesForAll: expectedTokenPricesForAll,
contractReaders: contractReaders,
}
@@ -739,11 +687,6 @@ func testGetAllTokensAggregatorOnly(t *testing.T) testParameters {
UpdatedAt: big.NewInt(1715743907),
AnsweredInRound: big.NewInt(3000),
}
- evmClients := map[uint64]DynamicPriceGetterClient{
- uint64(101): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
- uint64(102): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
- uint64(103): mockClient(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round3}),
- }
contractReaders := map[uint64]types.ContractReader{
uint64(101): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round1}),
uint64(102): mockCR(t, []uint8{8}, []aggregator_v3_interface.LatestRoundData{round2}),
@@ -757,7 +700,6 @@ func testGetAllTokensAggregatorOnly(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
expectedTokenPricesForAll: expectedTokenPricesForAll,
contractReaders: contractReaders,
}
@@ -782,7 +724,6 @@ func testGetAllTokensStaticOnly(t *testing.T) testParameters {
},
}
- evmClients := map[uint64]DynamicPriceGetterClient{}
contractReaders := map[uint64]types.ContractReader{}
expectedTokenPricesForAll := map[common.Address]big.Int{
TK1: *cfg.StaticPrices[TK1].Price,
@@ -791,37 +732,11 @@ func testGetAllTokensStaticOnly(t *testing.T) testParameters {
}
return testParameters{
cfg: cfg,
- evmClients: evmClients,
contractReaders: contractReaders,
expectedTokenPricesForAll: expectedTokenPricesForAll,
}
}
-func mockClient(t *testing.T, decimals []uint8, rounds []aggregator_v3_interface.LatestRoundData) DynamicPriceGetterClient {
- return DynamicPriceGetterClient{
- BatchCaller: mockCaller(t, decimals, rounds),
- }
-}
-
-func mockCaller(t *testing.T, decimals []uint8, rounds []aggregator_v3_interface.LatestRoundData) *rpclibmocks.EvmBatchCaller {
- caller := rpclibmocks.NewEvmBatchCaller(t)
-
- // Mock batch calls per chain: all decimals calls then all latestRoundData calls.
- dataAndErrs := make([]rpclib.DataAndErr, 0, len(decimals)+len(rounds))
- for _, d := range decimals {
- dataAndErrs = append(dataAndErrs, rpclib.DataAndErr{
- Outputs: []any{d},
- })
- }
- for _, round := range rounds {
- dataAndErrs = append(dataAndErrs, rpclib.DataAndErr{
- Outputs: []any{round.RoundId, round.Answer, round.StartedAt, round.UpdatedAt, round.AnsweredInRound},
- })
- }
- caller.On("BatchCall", mock.Anything, uint64(0), mock.Anything).Return(dataAndErrs, nil).Maybe()
- return caller
-}
-
func mockCR(t *testing.T, decimals []uint8, rounds []aggregator_v3_interface.LatestRoundData) *mocks.ChainReader {
caller := mocks.NewChainReader(t)
@@ -832,21 +747,21 @@ func mockCR(t *testing.T, decimals []uint8, rounds []aggregator_v3_interface.Lat
bGLVR = make(map[string]types.ContractBatchResults, 1)
for i := range len(decimals) {
- bGLVR[fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)] = make([]types.BatchReadResult, 0, 2)
+ bGLVR[fmt.Sprintf("%v_%v", OffchainAggregator, i)] = make([]types.BatchReadResult, 0, 2)
}
for i, d := range decimals {
- contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)
+ contractName := fmt.Sprintf("%v_%v", OffchainAggregator, i)
readRes := types.BatchReadResult{
- ReadName: DECIMALS_METHOD_NAME,
+ ReadName: DecimalsMethodName,
}
readRes.SetResult(&d, nil)
bGLVR[contractName] = append(bGLVR[contractName], readRes)
}
for i, r := range rounds {
- contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, i)
+ contractName := fmt.Sprintf("%v_%v", OffchainAggregator, i)
readRes := types.BatchReadResult{
- ReadName: LATEST_ROUND_DATA_METHOD_NAME,
+ ReadName: LatestRoundDataMethodName,
}
readRes.SetResult(&r, nil)
bGLVR[contractName] = append(bGLVR[contractName], readRes)
@@ -857,12 +772,6 @@ func mockCR(t *testing.T, decimals []uint8, rounds []aggregator_v3_interface.Lat
return caller
}
-func mockErrCaller(t *testing.T) *rpclibmocks.EvmBatchCaller {
- caller := rpclibmocks.NewEvmBatchCaller(t)
- caller.On("BatchCall", mock.Anything, uint64(0), mock.Anything).Return(nil, assert.AnError).Maybe()
- return caller
-}
-
func mockErrCR(t *testing.T) *mocks.ChainReader {
caller := mocks.NewChainReader(t)
caller.On("Bind", mock.Anything, mock.Anything).Return(nil).Maybe()
From ce11b9f42387565effc4e347cdc6c4065f8c9f8e Mon Sep 17 00:00:00 2001
From: Ryan Hall
Date: Thu, 3 Oct 2024 10:15:07 -0400
Subject: [PATCH 19/32] Add seq number to CCIPMessageSent event (#1481)
## Motivation
Easily retrieve `CCIPMessageSent` events in the absence of Atlas /
another event indexer
## Solution
Add sequenceNumber as an indexed field to `CCIPMessageSent` event
---
contracts/gas-snapshots/ccip.gas-snapshot | 36 +++++++++----------
contracts/src/v0.8/ccip/onRamp/OnRamp.sol | 6 ++--
.../src/v0.8/ccip/test/NonceManager.t.sol | 8 ++---
.../ccip/test/e2e/MultiRampsEnd2End.t.sol | 2 +-
.../src/v0.8/ccip/test/onRamp/OnRamp.t.sol | 24 ++++++-------
.../ccip/generated/onramp/onramp.go | 27 +++++++++-----
...rapper-dependency-versions-do-not-edit.txt | 2 +-
7 files changed, 58 insertions(+), 47 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index b714458080..19f3d0f512 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -562,7 +562,7 @@ MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275)
MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933)
MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049)
MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233701)
-MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1500580)
+MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501786)
NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778)
@@ -574,10 +574,10 @@ NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success(
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249120)
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237027)
NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153748)
-NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168256)
-NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 219631)
+NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 169036)
+NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 221191)
NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126745)
-NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 106975)
+NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107755)
NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123102)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 43079)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64408)
@@ -754,14 +754,14 @@ OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (g
OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92938)
OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97971)
OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92972)
-OnRamp_constructor:test_Constructor_Success() (gas: 2734391)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114527)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 145328)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 144925)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143086)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145122)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 144520)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 144604)
+OnRamp_constructor:test_Constructor_Success() (gas: 2736399)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115307)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146108)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145705)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143866)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145902)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145300)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 145006)
OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38554)
OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143051)
OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36596)
@@ -769,15 +769,15 @@ OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36527)
OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 18291)
OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38431)
OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23640)
-OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 183954)
-OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 210338)
-OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146154)
-OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 160259)
-OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3613942)
+OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186348)
+OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212732)
+OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146934)
+OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161039)
+OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615148)
OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010)
OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866)
OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599)
-OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 279390)
+OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280170)
OnRamp_getFee:test_EmptyMessage_Success() (gas: 98513)
OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64645)
OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86177)
diff --git a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
index 959d831a39..00a7bbeeb5 100644
--- a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
+++ b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
@@ -48,7 +48,9 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
);
event FeeTokenWithdrawn(address indexed feeAggregator, address indexed feeToken, uint256 amount);
/// RMN depends on this event, if changing, please notify the RMN maintainers.
- event CCIPMessageSent(uint64 indexed destChainSelector, Internal.EVM2AnyRampMessage message);
+ event CCIPMessageSent(
+ uint64 indexed destChainSelector, uint64 indexed sequenceNumber, Internal.EVM2AnyRampMessage message
+ );
event AllowListAdminSet(address indexed allowListAdmin);
event AllowListSendersAdded(uint64 indexed destChainSelector, address[] senders);
event AllowListSendersRemoved(uint64 indexed destChainSelector, address[] senders);
@@ -253,7 +255,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
// Emit message request
// This must happen after any pool events as some tokens (e.g. USDC) emit events that we expect to precede this
// event in the offchain code.
- emit CCIPMessageSent(destChainSelector, newMessage);
+ emit CCIPMessageSent(destChainSelector, newMessage.header.sequenceNumber, newMessage);
s_dynamicConfig.reentrancyGuardEntered = false;
diff --git a/contracts/src/v0.8/ccip/test/NonceManager.t.sol b/contracts/src/v0.8/ccip/test/NonceManager.t.sol
index f25bdaa5d4..051cf68333 100644
--- a/contracts/src/v0.8/ccip/test/NonceManager.t.sol
+++ b/contracts/src/v0.8/ccip/test/NonceManager.t.sol
@@ -265,7 +265,7 @@ contract NonceManager_OnRampUpgrade is OnRampSetup {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, FEE_AMOUNT, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, FEE_AMOUNT, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, FEE_AMOUNT, OWNER);
}
@@ -292,14 +292,14 @@ contract NonceManager_OnRampUpgrade is OnRampSetup {
// new onramp nonce should start from 2, while sequence number start from 1
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, startNonce + 2, FEE_AMOUNT, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, startNonce + 2, FEE_AMOUNT, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, FEE_AMOUNT, OWNER);
assertEq(startNonce + 2, s_outboundNonceManager.getOutboundNonce(DEST_CHAIN_SELECTOR, OWNER));
// after another send, nonce should be 3, and sequence number be 2
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 2, startNonce + 3, FEE_AMOUNT, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 2, _messageToEvent(message, 2, startNonce + 3, FEE_AMOUNT, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, FEE_AMOUNT, OWNER);
assertEq(startNonce + 3, s_outboundNonceManager.getOutboundNonce(DEST_CHAIN_SELECTOR, OWNER));
@@ -314,7 +314,7 @@ contract NonceManager_OnRampUpgrade is OnRampSetup {
address newSender = address(1234567);
// new onramp nonce should start from 1 for new sender
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, FEE_AMOUNT, newSender));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, FEE_AMOUNT, newSender));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, FEE_AMOUNT, newSender);
}
}
diff --git a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
index 59f727c251..8614f03d8d 100644
--- a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
+++ b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
@@ -268,7 +268,7 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup {
);
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, msgEvent);
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, expectedSeqNum, msgEvent);
vm.resumeGasMetering();
router.ccipSend(DEST_CHAIN_SELECTOR, message);
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
index 2a7fac892c..90e704cf55 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
@@ -145,7 +145,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount);
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
@@ -181,7 +181,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
vm.expectEmit();
// We expect the message to be emitted with strict = false.
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
@@ -194,7 +194,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
vm.expectEmit();
// We expect the message to be emitted with strict = false.
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
@@ -206,7 +206,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount);
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
@@ -220,7 +220,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount);
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
@@ -234,7 +234,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount);
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
@@ -247,7 +247,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
uint64 sequenceNumberBefore = s_onRamp.getExpectedNextSequenceNumber(DEST_CHAIN_SELECTOR) - 1;
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, i, i, 0, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, i, _messageToEvent(message, i, i, 0, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
@@ -269,7 +269,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
uint64 sequenceNumberBefore = s_onRamp.getExpectedNextSequenceNumber(DEST_CHAIN_SELECTOR) - 1;
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, i, i, 0, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, i, _messageToEvent(message, i, i, 0, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
@@ -287,7 +287,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount);
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
@@ -308,7 +308,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
uint256 expectedJuels = (feeAmount * conversionRate) / 1e18;
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, expectedJuels, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, expectedJuels, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
@@ -354,7 +354,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
Internal.EVM2AnyRampMessage memory expectedEvent = _messageToEvent(message, 1, 1, feeTokenAmount, originalSender);
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, expectedEvent);
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, expectedEvent.header.sequenceNumber, expectedEvent);
// Assert the message Id is correct
assertEq(
@@ -376,7 +376,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_outboundmessageInterceptor.setMessageIdValidationState(keccak256(abi.encode(message)), false);
vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER));
+ emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/onramp/onramp.go
index 71d25dec61..fae9793648 100644
--- a/core/gethwrappers/ccip/generated/onramp/onramp.go
+++ b/core/gethwrappers/ccip/generated/onramp/onramp.go
@@ -99,8 +99,8 @@ type OnRampStaticConfig struct {
}
var OnRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\"},{\"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\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b506040516200422f3803806200422f83398101604081905262000035916200073f565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d81620003e0565b50505062000840565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060608101516001600160a01b0316155b8062000261575080602001515b1562000280576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191620003d591849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b81518110156200051f5760008282815181106200040457620004046200082a565b6020026020010151905060008383815181106200042557620004256200082a565b6020026020010151600001519050806001600160401b03166000036200046a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050620003e3565b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200055e576200055e62000523565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200058f576200058f62000523565b604052919050565b80516001600160401b0381168114620005af57600080fd5b919050565b6001600160a01b0381168114620005ca57600080fd5b50565b600060a08284031215620005e057600080fd5b60405160a081016001600160401b038111828210171562000605576200060562000523565b806040525080915082516200061a81620005b4565b8152602083015180151581146200063057600080fd5b602082015260408301516200064581620005b4565b604082015260608301516200065a81620005b4565b606082015260808301516200066f81620005b4565b6080919091015292915050565b600082601f8301126200068e57600080fd5b815160206001600160401b03821115620006ac57620006ac62000523565b620006bc818360051b0162000564565b82815260069290921b84018101918181019086841115620006dc57600080fd5b8286015b84811015620007345760408189031215620006fb5760008081fd5b6200070562000539565b620007108262000597565b8152848201516200072181620005b4565b81860152835291830191604001620006e0565b509695505050505050565b60008060008385036101408112156200075757600080fd5b60808112156200076657600080fd5b50604051608081016001600160401b0380821183831017156200078d576200078d62000523565b816040526200079c8762000597565b835260208701519150620007b082620005b4565b81602084015260408701519150620007c882620005b4565b81604084015260608701519150620007e082620005b4565b816060840152829550620007f88860808901620005cd565b94506101208701519250808311156200081057600080fd5b505062000820868287016200067c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051613976620008b96000396000818161022c01528181610cfd0152611bc90152600081816101f0015281816115c40152611ba20152600081816101b4015281816106080152611b780152600081816101840152818161114b015281816116e10152611b5401526139766000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e914610557578063f2fde38b1461056a578063fbca3b741461057d57600080fd5b8063972b4612146104ea578063d77d5ed01461050a57600080fd5b80637437ff9f146103ee57806379ba5097146104985780638da5cb5b146104a05780639041be3d146104be57600080fd5b806327e936f1116101095780633a019940116100ee5780633a0199401461030f57806348a98aa4146103175780636def4ce71461034f57600080fd5b806327e936f1146102e957806334adf494146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e6101493660046127c2565b610590565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102769190612885565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b604051610276919061294a565b6102db6102d6366004612975565b6105a4565b604051908152602001610276565b61014e6102f73660046129e3565b61075d565b61014e61030a366004612a7b565b61076e565b61014e610a8a565b61032a610325366004612af0565b610cb5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b6103b261035d366004612b29565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61048b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102769190612b46565b61014e610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff1661032a565b6104d16104cc366004612b29565b610e67565b60405167ffffffffffffffff9091168152602001610276565b6104fd6104f8366004612b29565b610e90565b6040516102769190612b9f565b61032a610518366004612b29565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db610565366004612bf9565b610eb8565b61014e610578366004612c65565b6117bc565b6104fd61058b366004612b29565b6117cd565b610598611801565b6105a181611884565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612c82565b156106bb576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906107139086908690600401612db3565b602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612efc565b90505b92915050565b610765611801565b6105a1816119fb565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107de5760055473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a855760008383838181106107fd576107fd612f15565b905060200281019061080f9190612f44565b61081890612ff5565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909116178155908201515191925090156109d8578160200151156109975760005b826040015151811015610947576000836040015182815181106108b1576108b1612f15565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109305783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b61093d6001840182611c2b565b505060010161088c565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161098a9190612b9f565b60405180910390a26109d8565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b60005b826060015151811015610a2457610a1b83606001518281518110610a0157610a01612f15565b602002602001015183600101611c4d90919063ffffffff16565b506001016109db565b5060608201515115610a7b57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610a729190612b9f565b60405180910390a25b50506001016107e1565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f91908101906130a6565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a85576000838281518110610b7b57610b7b612f15565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612efc565b90508015610cab57610c4373ffffffffffffffffffffffffffffffffffffffff83168583611c6f565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610ca291815260200190565b60405180910390a35b5050600101610b5e565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190613135565b60015473ffffffffffffffffffffffffffffffffffffffff163314610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106b2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff808216600090815260066020526040812054909161075791166001613181565b67ffffffffffffffff8116600090815260066020526040902060609061075790600101611cfc565b60025460009074010000000000000000000000000000000000000000900460ff1615610f10576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610fb5576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff161561102657610fd86001820184611d10565b611026576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016106b2565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611083576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff168015611129576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e506906110f6908a908a90600401612db3565b600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050505b50604080516101c081019091526000610120820181815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811661014085015289811661016085015284549293928392916101808401918791879161119791166131a2565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187806020019061120b91906131c9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161124f88806131c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016112ab6080890160608a01612c65565b73ffffffffffffffffffffffffffffffffffffffff168152602001868152602001600081526020018780604001906112e3919061322e565b905067ffffffffffffffff8111156112fd576112fd6126bf565b60405190808252806020026020018201604052801561137657816020015b6113636040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b81526020019060019003908161131b5790505b5090529050600061138a604088018861322e565b808060200260200160405190810160405280939291908181526020016000905b828210156113d6576113c760408302860136819003810190613296565b815260200190600101906113aa565b5050505050905060005b6113ed604089018961322e565b90508110156114875761145d82828151811061140b5761140b612f15565b60209081029190910101518a6114218b806131c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611d3f915050565b836101000151828151811061147457611474612f15565b60209081029190910101526001016113e0565b50600254600090606090819073ffffffffffffffffffffffffffffffffffffffff1663430d138c8c6114be60808e018e8601612c65565b8c8e80608001906114cf91906131c9565b8b61010001518b6040518863ffffffff1660e01b81526004016114f897969594939291906133b3565b600060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155b91908101906134e5565b60e08901939093529094509250905082611636576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163191906135d8565b611639565b60005b855167ffffffffffffffff909116608091820152850182905260005b856101000151518110156116ab5781818151811061167557611675612f15565b6020026020010151866101000151828151811061169457611694612f15565b602090810291909101015160800152600101611655565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c16606082015230608082015261173b90869060a00160405160208183030381529060405280519060200120612056565b85515260405167ffffffffffffffff8c16907f8cd775d4a25bd349439a70817fd110144d6ab229ae1b9f54a1e5777d2041bfed9061177a9088906135f5565b60405180910390a25050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505051519150505b949350505050565b6117c4611801565b6105a1816121a8565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106b2565b565b60005b81518110156119f75760008282815181106118a4576118a4612f15565b6020026020010151905060008383815181106118c2576118c2612f15565b60200260200101516000015190508067ffffffffffffffff16600003611920576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106b2565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611887565b5050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a375750606081015173ffffffffffffffffffffffffffffffffffffffff16155b80611a43575080602001515b15611a7a576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611c2091849061374d565b60405180910390a150565b60006107548373ffffffffffffffffffffffffffffffffffffffff841661229d565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122ec565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a859084906123e6565b60606000611d09836124f2565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610754565b611d876040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611dc5576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dd5858760000151610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81161580611ea557506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea39190612c82565b155b15611ef75785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016106b2565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611f9691906137fb565b6000604051808303816000875af1158015611fb5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ffb9190810190613871565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c001516040516020016120d495949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b604051602081830303815290604052805190602001208560600151805190602001208660400151805190602001208761010001516040516020016121189190613902565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff821603612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546122e457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610757565b506000610757565b600081815260018301602052604081205480156123d5576000612310600183613915565b855490915060009061232490600190613915565b905080821461238957600086600001828154811061234457612344612f15565b906000526020600020015490508087600001848154811061236757612367612f15565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061239a5761239a613928565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610757565b6000915050610757565b5092915050565b6000612448826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661254e9092919063ffffffff16565b805190915015610a8557808060200190518101906124669190612c82565b610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106b2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561254257602002820191906000526020600020905b81548152602001906001019080831161252e575b50505050509050919050565b60606117b48484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125829190613957565b60006040518083038185875af1925050503d80600081146125bf576040519150601f19603f3d011682016040523d82523d6000602084013e6125c4565b606091505b50915091506125d5878383876125e0565b979650505050505050565b6060831561267657825160000361266f5773ffffffffffffffffffffffffffffffffffffffff85163b61266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b2565b50816117b4565b6117b4838381511561268b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b2919061294a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612711576127116126bf565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561275e5761275e6126bf565b604052919050565b600067ffffffffffffffff821115612780576127806126bf565b5060051b60200190565b67ffffffffffffffff811681146105a157600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105a157600080fd5b600060208083850312156127d557600080fd5b823567ffffffffffffffff8111156127ec57600080fd5b8301601f810185136127fd57600080fd5b803561281061280b82612766565b612717565b81815260069190911b8201830190838101908783111561282f57600080fd5b928401925b828410156125d5576040848903121561284d5760008081fd5b6128556126ee565b84356128608161278a565b81528486013561286f816127a0565b8187015282526040939093019290840190612834565b60808101610757828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156128f75781810151838201526020016128df565b50506000910152565b600081518084526129188160208601602086016128dc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107546020830184612900565b600060a0828403121561296f57600080fd5b50919050565b6000806040838503121561298857600080fd5b82356129938161278a565b9150602083013567ffffffffffffffff8111156129af57600080fd5b6129bb8582860161295d565b9150509250929050565b80356129d0816127a0565b919050565b80151581146105a157600080fd5b600060a082840312156129f557600080fd5b60405160a0810181811067ffffffffffffffff82111715612a1857612a186126bf565b6040528235612a26816127a0565b81526020830135612a36816129d5565b60208201526040830135612a49816127a0565b60408201526060830135612a5c816127a0565b60608201526080830135612a6f816127a0565b60808201529392505050565b60008060208385031215612a8e57600080fd5b823567ffffffffffffffff80821115612aa657600080fd5b818501915085601f830112612aba57600080fd5b813581811115612ac957600080fd5b8660208260051b8501011115612ade57600080fd5b60209290920196919550909350505050565b60008060408385031215612b0357600080fd5b8235612b0e8161278a565b91506020830135612b1e816127a0565b809150509250929050565b600060208284031215612b3b57600080fd5b8135611d098161278a565b60a08101610757828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b6020808252825182820181905260009190848201906040850190845b81811015612bed57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bbb565b50909695505050505050565b60008060008060808587031215612c0f57600080fd5b8435612c1a8161278a565b9350602085013567ffffffffffffffff811115612c3657600080fd5b612c428782880161295d565b935050604085013591506060850135612c5a816127a0565b939692955090935050565b600060208284031215612c7757600080fd5b8135611d09816127a0565b600060208284031215612c9457600080fd5b8151611d09816129d5565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612cd457600080fd5b830160208101925035905067ffffffffffffffff811115612cf457600080fd5b803603821315612d0357600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612da8578135612d76816127a0565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612d63565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612dd48485612c9f565b60a06040860152612de960e086018284612d0a565b915050612df96020860186612c9f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612e2f848385612d0a565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612e6857600080fd5b60209288019283019235915084821115612e8157600080fd5b8160061b3603831315612e9357600080fd5b80878503016080880152612ea8848385612d53565b9450612eb6606089016129c5565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612ee16080890189612c9f565b94509250808786030160c088015250506125d5838383612d0a565b600060208284031215612f0e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612f7857600080fd5b9190910192915050565b600082601f830112612f9357600080fd5b81356020612fa361280b83612766565b8083825260208201915060208460051b870101935086841115612fc557600080fd5b602086015b84811015612fea578035612fdd816127a0565b8352918301918301612fca565b509695505050505050565b60006080823603121561300757600080fd5b6040516080810167ffffffffffffffff828210818311171561302b5761302b6126bf565b816040528435915061303c8261278a565b90825260208401359061304e826129d5565b816020840152604085013591508082111561306857600080fd5b61307436838701612f82565b6040840152606085013591508082111561308d57600080fd5b5061309a36828601612f82565b60608301525092915050565b600060208083850312156130b957600080fd5b825167ffffffffffffffff8111156130d057600080fd5b8301601f810185136130e157600080fd5b80516130ef61280b82612766565b81815260059190911b8201830190838101908783111561310e57600080fd5b928401925b828410156125d5578351613126816127a0565b82529284019290840190613113565b60006020828403121561314757600080fd5b8151611d09816127a0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156123df576123df613152565b600067ffffffffffffffff8083168181036131bf576131bf613152565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126131fe57600080fd5b83018035915067ffffffffffffffff82111561321957600080fd5b602001915036819003821315612d0357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261326357600080fd5b83018035915067ffffffffffffffff82111561327e57600080fd5b6020019150600681901b3603821315612d0357600080fd5b6000604082840312156132a857600080fd5b6132b06126ee565b82356132bb816127a0565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b848110156133a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff825116855285820151818787015261334f82870182612900565b915050604080830151868303828801526133698382612900565b925050506060808301518187015250608080830151925085820381870152506133928183612900565b9a86019a94505050908301906001016132ed565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c060608601526133fd60c08601898b612d0a565b858103608087015261340f81896132d0565b86810360a0880152875180825285890192509085019060005b8181101561344f578351805187168452870151878401529286019291840191600101613428565b50909e9d5050505050505050505050505050565b600082601f83011261347457600080fd5b815167ffffffffffffffff81111561348e5761348e6126bf565b6134bf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612717565b8181528460208386010111156134d457600080fd5b6117b48260208301602087016128dc565b600080600080608085870312156134fb57600080fd5b8451935060208086015161350e816129d5565b604087015190945067ffffffffffffffff8082111561352c57600080fd5b61353889838a01613463565b9450606088015191508082111561354e57600080fd5b818801915088601f83011261356257600080fd5b815161357061280b82612766565b81815260059190911b8301840190848101908b83111561358f57600080fd5b8585015b838110156135c7578051858111156135ab5760008081fd5b6135b98e89838a0101613463565b845250918601918601613593565b50989b979a50959850505050505050565b6000602082840312156135ea57600080fd5b8151611d098161278a565b6020815261364660208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161366f60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e085015261368c6101c0850183612900565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101008187860301818801526136ca8584612900565b94506080880151925081878603016101208801526136e88584612900565b945060a0880151925061371461014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e088015161018088015287015186850390910183870152905061374383826132d0565b9695505050505050565b61012081016137a5828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611d09565b602081526000825160a0602084015261381760c0840182612900565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b60006020828403121561388357600080fd5b815167ffffffffffffffff8082111561389b57600080fd5b90830190604082860312156138af57600080fd5b6138b76126ee565b8251828111156138c657600080fd5b6138d287828601613463565b8252506020830151828111156138e757600080fd5b6138f387828601613463565b60208301525095945050505050565b60208152600061075460208301846132d0565b8181038181111561075757610757613152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612f788184602087016128dc56fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101006040523480156200001257600080fd5b50604051620042393803806200423983398101604081905262000035916200073f565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d81620003e0565b50505062000840565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060608101516001600160a01b0316155b8062000261575080602001515b1562000280576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191620003d591849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b81518110156200051f5760008282815181106200040457620004046200082a565b6020026020010151905060008383815181106200042557620004256200082a565b6020026020010151600001519050806001600160401b03166000036200046a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050620003e3565b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200055e576200055e62000523565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200058f576200058f62000523565b604052919050565b80516001600160401b0381168114620005af57600080fd5b919050565b6001600160a01b0381168114620005ca57600080fd5b50565b600060a08284031215620005e057600080fd5b60405160a081016001600160401b038111828210171562000605576200060562000523565b806040525080915082516200061a81620005b4565b8152602083015180151581146200063057600080fd5b602082015260408301516200064581620005b4565b604082015260608301516200065a81620005b4565b606082015260808301516200066f81620005b4565b6080919091015292915050565b600082601f8301126200068e57600080fd5b815160206001600160401b03821115620006ac57620006ac62000523565b620006bc818360051b0162000564565b82815260069290921b84018101918181019086841115620006dc57600080fd5b8286015b84811015620007345760408189031215620006fb5760008081fd5b6200070562000539565b620007108262000597565b8152848201516200072181620005b4565b81860152835291830191604001620006e0565b509695505050505050565b60008060008385036101408112156200075757600080fd5b60808112156200076657600080fd5b50604051608081016001600160401b0380821183831017156200078d576200078d62000523565b816040526200079c8762000597565b835260208701519150620007b082620005b4565b81602084015260408701519150620007c882620005b4565b81604084015260608701519150620007e082620005b4565b816060840152829550620007f88860808901620005cd565b94506101208701519250808311156200081057600080fd5b505062000820868287016200067c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051613980620008b96000396000818161022c01528181610cfd0152611bd30152600081816101f0015281816115c40152611bac0152600081816101b4015281816106080152611b820152600081816101840152818161114b015281816116e10152611b5e01526139806000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e914610557578063f2fde38b1461056a578063fbca3b741461057d57600080fd5b8063972b4612146104ea578063d77d5ed01461050a57600080fd5b80637437ff9f146103ee57806379ba5097146104985780638da5cb5b146104a05780639041be3d146104be57600080fd5b806327e936f1116101095780633a019940116100ee5780633a0199401461030f57806348a98aa4146103175780636def4ce71461034f57600080fd5b806327e936f1146102e957806334adf494146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e6101493660046127cc565b610590565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b604051610276919061288f565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b6040516102769190612954565b6102db6102d636600461297f565b6105a4565b604051908152602001610276565b61014e6102f73660046129ed565b61075d565b61014e61030a366004612a85565b61076e565b61014e610a8a565b61032a610325366004612afa565b610cb5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b6103b261035d366004612b33565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61048b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102769190612b50565b61014e610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff1661032a565b6104d16104cc366004612b33565b610e67565b60405167ffffffffffffffff9091168152602001610276565b6104fd6104f8366004612b33565b610e90565b6040516102769190612ba9565b61032a610518366004612b33565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db610565366004612c03565b610eb8565b61014e610578366004612c6f565b6117c6565b6104fd61058b366004612b33565b6117d7565b61059861180b565b6105a18161188e565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612c8c565b156106bb576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906107139086908690600401612dbd565b602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612f06565b90505b92915050565b61076561180b565b6105a181611a05565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107de5760055473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a855760008383838181106107fd576107fd612f1f565b905060200281019061080f9190612f4e565b61081890612fff565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909116178155908201515191925090156109d8578160200151156109975760005b826040015151811015610947576000836040015182815181106108b1576108b1612f1f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109305783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b61093d6001840182611c35565b505060010161088c565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161098a9190612ba9565b60405180910390a26109d8565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b60005b826060015151811015610a2457610a1b83606001518281518110610a0157610a01612f1f565b602002602001015183600101611c5790919063ffffffff16565b506001016109db565b5060608201515115610a7b57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610a729190612ba9565b60405180910390a25b50506001016107e1565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f91908101906130b0565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a85576000838281518110610b7b57610b7b612f1f565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612f06565b90508015610cab57610c4373ffffffffffffffffffffffffffffffffffffffff83168583611c79565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610ca291815260200190565b60405180910390a35b5050600101610b5e565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610754919061313f565b60015473ffffffffffffffffffffffffffffffffffffffff163314610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106b2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff80821660009081526006602052604081205490916107579116600161318b565b67ffffffffffffffff8116600090815260066020526040902060609061075790600101611d06565b60025460009074010000000000000000000000000000000000000000900460ff1615610f10576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610fb5576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff161561102657610fd86001820184611d1a565b611026576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016106b2565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611083576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff168015611129576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e506906110f6908a908a90600401612dbd565b600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050505b50604080516101c081019091526000610120820181815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811661014085015289811661016085015284549293928392916101808401918791879161119791166131ac565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187806020019061120b91906131d3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161124f88806131d3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016112ab6080890160608a01612c6f565b73ffffffffffffffffffffffffffffffffffffffff168152602001868152602001600081526020018780604001906112e39190613238565b905067ffffffffffffffff8111156112fd576112fd6126c9565b60405190808252806020026020018201604052801561137657816020015b6113636040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b81526020019060019003908161131b5790505b5090529050600061138a6040880188613238565b808060200260200160405190810160405280939291908181526020016000905b828210156113d6576113c7604083028601368190038101906132a0565b815260200190600101906113aa565b5050505050905060005b6113ed6040890189613238565b90508110156114875761145d82828151811061140b5761140b612f1f565b60209081029190910101518a6114218b806131d3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611d49915050565b836101000151828151811061147457611474612f1f565b60209081029190910101526001016113e0565b50600254600090606090819073ffffffffffffffffffffffffffffffffffffffff1663430d138c8c6114be60808e018e8601612c6f565b8c8e80608001906114cf91906131d3565b8b61010001518b6040518863ffffffff1660e01b81526004016114f897969594939291906133bd565b600060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155b91908101906134ef565b60e08901939093529094509250905082611636576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163191906135e2565b611639565b60005b855167ffffffffffffffff909116608091820152850182905260005b856101000151518110156116ab5781818151811061167557611675612f1f565b6020026020010151866101000151828151811061169457611694612f1f565b602090810291909101015160800152600101611655565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c16606082015230608082015261173b90869060a00160405160208183030381529060405280519060200120612060565b85515284516060015160405167ffffffffffffffff918216918d16907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32906117849089906135ff565b60405180910390a35050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505051519150505b949350505050565b6117ce61180b565b6105a1816121b2565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106b2565b565b60005b8151811015611a015760008282815181106118ae576118ae612f1f565b6020026020010151905060008383815181106118cc576118cc612f1f565b60200260200101516000015190508067ffffffffffffffff1660000361192a576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106b2565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611891565b5050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a415750606081015173ffffffffffffffffffffffffffffffffffffffff16155b80611a4d575080602001515b15611a84576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611c2a918490613757565b60405180910390a150565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122a7565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122f6565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a859084906123f0565b60606000611d13836124fc565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610754565b611d916040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611dcf576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ddf858760000151610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81161580611eaf57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ead9190612c8c565b155b15611f015785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016106b2565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611fa09190613805565b6000604051808303816000875af1158015611fbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612005919081019061387b565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c001516040516020016120de95949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b60405160208183030381529060405280519060200120856060015180519060200120866040015180519060200120876101000151604051602001612122919061390c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff821603612231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546122ee57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610757565b506000610757565b600081815260018301602052604081205480156123df57600061231a60018361391f565b855490915060009061232e9060019061391f565b905080821461239357600086600001828154811061234e5761234e612f1f565b906000526020600020015490508087600001848154811061237157612371612f1f565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123a4576123a4613932565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610757565b6000915050610757565b5092915050565b6000612452826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125589092919063ffffffff16565b805190915015610a8557808060200190518101906124709190612c8c565b610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106b2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561254c57602002820191906000526020600020905b815481526020019060010190808311612538575b50505050509050919050565b60606117be8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161258c9190613961565b60006040518083038185875af1925050503d80600081146125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b50915091506125df878383876125ea565b979650505050505050565b606083156126805782516000036126795773ffffffffffffffffffffffffffffffffffffffff85163b612679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b2565b50816117be565b6117be83838151156126955781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b29190612954565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561271b5761271b6126c9565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612768576127686126c9565b604052919050565b600067ffffffffffffffff82111561278a5761278a6126c9565b5060051b60200190565b67ffffffffffffffff811681146105a157600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105a157600080fd5b600060208083850312156127df57600080fd5b823567ffffffffffffffff8111156127f657600080fd5b8301601f8101851361280757600080fd5b803561281a61281582612770565b612721565b81815260069190911b8201830190838101908783111561283957600080fd5b928401925b828410156125df57604084890312156128575760008081fd5b61285f6126f8565b843561286a81612794565b815284860135612879816127aa565b818701528252604093909301929084019061283e565b60808101610757828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156129015781810151838201526020016128e9565b50506000910152565b600081518084526129228160208601602086016128e6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610754602083018461290a565b600060a0828403121561297957600080fd5b50919050565b6000806040838503121561299257600080fd5b823561299d81612794565b9150602083013567ffffffffffffffff8111156129b957600080fd5b6129c585828601612967565b9150509250929050565b80356129da816127aa565b919050565b80151581146105a157600080fd5b600060a082840312156129ff57600080fd5b60405160a0810181811067ffffffffffffffff82111715612a2257612a226126c9565b6040528235612a30816127aa565b81526020830135612a40816129df565b60208201526040830135612a53816127aa565b60408201526060830135612a66816127aa565b60608201526080830135612a79816127aa565b60808201529392505050565b60008060208385031215612a9857600080fd5b823567ffffffffffffffff80821115612ab057600080fd5b818501915085601f830112612ac457600080fd5b813581811115612ad357600080fd5b8660208260051b8501011115612ae857600080fd5b60209290920196919550909350505050565b60008060408385031215612b0d57600080fd5b8235612b1881612794565b91506020830135612b28816127aa565b809150509250929050565b600060208284031215612b4557600080fd5b8135611d1381612794565b60a08101610757828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b6020808252825182820181905260009190848201906040850190845b81811015612bf757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bc5565b50909695505050505050565b60008060008060808587031215612c1957600080fd5b8435612c2481612794565b9350602085013567ffffffffffffffff811115612c4057600080fd5b612c4c87828801612967565b935050604085013591506060850135612c64816127aa565b939692955090935050565b600060208284031215612c8157600080fd5b8135611d13816127aa565b600060208284031215612c9e57600080fd5b8151611d13816129df565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612cde57600080fd5b830160208101925035905067ffffffffffffffff811115612cfe57600080fd5b803603821315612d0d57600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612db2578135612d80816127aa565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612d6d565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612dde8485612ca9565b60a06040860152612df360e086018284612d14565b915050612e036020860186612ca9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612e39848385612d14565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612e7257600080fd5b60209288019283019235915084821115612e8b57600080fd5b8160061b3603831315612e9d57600080fd5b80878503016080880152612eb2848385612d5d565b9450612ec0606089016129cf565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612eeb6080890189612ca9565b94509250808786030160c088015250506125df838383612d14565b600060208284031215612f1857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612f8257600080fd5b9190910192915050565b600082601f830112612f9d57600080fd5b81356020612fad61281583612770565b8083825260208201915060208460051b870101935086841115612fcf57600080fd5b602086015b84811015612ff4578035612fe7816127aa565b8352918301918301612fd4565b509695505050505050565b60006080823603121561301157600080fd5b6040516080810167ffffffffffffffff8282108183111715613035576130356126c9565b816040528435915061304682612794565b908252602084013590613058826129df565b816020840152604085013591508082111561307257600080fd5b61307e36838701612f8c565b6040840152606085013591508082111561309757600080fd5b506130a436828601612f8c565b60608301525092915050565b600060208083850312156130c357600080fd5b825167ffffffffffffffff8111156130da57600080fd5b8301601f810185136130eb57600080fd5b80516130f961281582612770565b81815260059190911b8201830190838101908783111561311857600080fd5b928401925b828410156125df578351613130816127aa565b8252928401929084019061311d565b60006020828403121561315157600080fd5b8151611d13816127aa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156123e9576123e961315c565b600067ffffffffffffffff8083168181036131c9576131c961315c565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261320857600080fd5b83018035915067ffffffffffffffff82111561322357600080fd5b602001915036819003821315612d0d57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261326d57600080fd5b83018035915067ffffffffffffffff82111561328857600080fd5b6020019150600681901b3603821315612d0d57600080fd5b6000604082840312156132b257600080fd5b6132ba6126f8565b82356132c5816127aa565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b848110156133b0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff82511685528582015181878701526133598287018261290a565b91505060408083015186830382880152613373838261290a565b9250505060608083015181870152506080808301519250858203818701525061339c818361290a565b9a86019a94505050908301906001016132f7565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c0606086015261340760c08601898b612d14565b858103608087015261341981896132da565b86810360a0880152875180825285890192509085019060005b81811015613459578351805187168452870151878401529286019291840191600101613432565b50909e9d5050505050505050505050505050565b600082601f83011261347e57600080fd5b815167ffffffffffffffff811115613498576134986126c9565b6134c960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612721565b8181528460208386010111156134de57600080fd5b6117be8260208301602087016128e6565b6000806000806080858703121561350557600080fd5b84519350602080860151613518816129df565b604087015190945067ffffffffffffffff8082111561353657600080fd5b61354289838a0161346d565b9450606088015191508082111561355857600080fd5b818801915088601f83011261356c57600080fd5b815161357a61281582612770565b81815260059190911b8301840190848101908b83111561359957600080fd5b8585015b838110156135d1578051858111156135b55760008081fd5b6135c38e89838a010161346d565b84525091860191860161359d565b50989b979a50959850505050505050565b6000602082840312156135f457600080fd5b8151611d1381612794565b6020815261365060208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161367960c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e08501526136966101c085018361290a565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101008187860301818801526136d4858461290a565b94506080880151925081878603016101208801526136f2858461290a565b945060a0880151925061371e61014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e088015161018088015287015186850390910183870152905061374d83826132da565b9695505050505050565b61012081016137af828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611d13565b602081526000825160a0602084015261382160c084018261290a565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b60006020828403121561388d57600080fd5b815167ffffffffffffffff808211156138a557600080fd5b90830190604082860312156138b957600080fd5b6138c16126f8565b8251828111156138d057600080fd5b6138dc8782860161346d565b8252506020830151828111156138f157600080fd5b6138fd8782860161346d565b60208301525095945050505050565b60208152600061075460208301846132da565b818103818111156107575761075761315c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612f828184602087016128e656fea164736f6c6343000818000a",
}
var OnRampABI = OnRampMetaData.ABI
@@ -1019,32 +1019,41 @@ func (it *OnRampCCIPMessageSentIterator) Close() error {
type OnRampCCIPMessageSent struct {
DestChainSelector uint64
+ SequenceNumber uint64
Message InternalEVM2AnyRampMessage
Raw types.Log
}
-func (_OnRamp *OnRampFilterer) FilterCCIPMessageSent(opts *bind.FilterOpts, destChainSelector []uint64) (*OnRampCCIPMessageSentIterator, error) {
+func (_OnRamp *OnRampFilterer) FilterCCIPMessageSent(opts *bind.FilterOpts, destChainSelector []uint64, sequenceNumber []uint64) (*OnRampCCIPMessageSentIterator, error) {
var destChainSelectorRule []interface{}
for _, destChainSelectorItem := range destChainSelector {
destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem)
}
+ var sequenceNumberRule []interface{}
+ for _, sequenceNumberItem := range sequenceNumber {
+ sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem)
+ }
- logs, sub, err := _OnRamp.contract.FilterLogs(opts, "CCIPMessageSent", destChainSelectorRule)
+ logs, sub, err := _OnRamp.contract.FilterLogs(opts, "CCIPMessageSent", destChainSelectorRule, sequenceNumberRule)
if err != nil {
return nil, err
}
return &OnRampCCIPMessageSentIterator{contract: _OnRamp.contract, event: "CCIPMessageSent", logs: logs, sub: sub}, nil
}
-func (_OnRamp *OnRampFilterer) WatchCCIPMessageSent(opts *bind.WatchOpts, sink chan<- *OnRampCCIPMessageSent, destChainSelector []uint64) (event.Subscription, error) {
+func (_OnRamp *OnRampFilterer) WatchCCIPMessageSent(opts *bind.WatchOpts, sink chan<- *OnRampCCIPMessageSent, destChainSelector []uint64, sequenceNumber []uint64) (event.Subscription, error) {
var destChainSelectorRule []interface{}
for _, destChainSelectorItem := range destChainSelector {
destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem)
}
+ var sequenceNumberRule []interface{}
+ for _, sequenceNumberItem := range sequenceNumber {
+ sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem)
+ }
- logs, sub, err := _OnRamp.contract.WatchLogs(opts, "CCIPMessageSent", destChainSelectorRule)
+ logs, sub, err := _OnRamp.contract.WatchLogs(opts, "CCIPMessageSent", destChainSelectorRule, sequenceNumberRule)
if err != nil {
return nil, err
}
@@ -1787,7 +1796,7 @@ func (OnRampAllowListSendersRemoved) Topic() common.Hash {
}
func (OnRampCCIPMessageSent) Topic() common.Hash {
- return common.HexToHash("0x8cd775d4a25bd349439a70817fd110144d6ab229ae1b9f54a1e5777d2041bfed")
+ return common.HexToHash("0x192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32")
}
func (OnRampConfigSet) Topic() common.Hash {
@@ -1871,9 +1880,9 @@ type OnRampInterface interface {
ParseAllowListSendersRemoved(log types.Log) (*OnRampAllowListSendersRemoved, error)
- FilterCCIPMessageSent(opts *bind.FilterOpts, destChainSelector []uint64) (*OnRampCCIPMessageSentIterator, error)
+ FilterCCIPMessageSent(opts *bind.FilterOpts, destChainSelector []uint64, sequenceNumber []uint64) (*OnRampCCIPMessageSentIterator, error)
- WatchCCIPMessageSent(opts *bind.WatchOpts, sink chan<- *OnRampCCIPMessageSent, destChainSelector []uint64) (event.Subscription, error)
+ WatchCCIPMessageSent(opts *bind.WatchOpts, sink chan<- *OnRampCCIPMessageSent, destChainSelector []uint64, sequenceNumber []uint64) (event.Subscription, error)
ParseCCIPMessageSent(log types.Log) (*OnRampCCIPMessageSent, error)
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index b4c5c52e82..fa5321b27b 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
@@ -24,7 +24,7 @@ multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRate
multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 04b6b261dd71925670bf4d904aaf7bf08543452009feefb88e07d4c49d12e969
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 941b18b4e2aef977195fefba514e17c9475667e6f8513b18cabfb07ff90136ce
-onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 4f29f05261bdaf9b99e675c1169c0d5cba841b6dd7ca3a8997cc0d3cae7ba850
+onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin fa073de6d76f76917ff45c19afb2901b8a6f20ca0e225f845f36d647505a7cf5
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b
price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2
registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 75be86323c227917a9bbc3f799d7ed02f92db546653a36db30ed0ebe64461353
From 0a41c0b748d2877a28019dd5a3660985b62f02cf Mon Sep 17 00:00:00 2001
From: Ryan Hall
Date: Thu, 3 Oct 2024 13:04:19 -0400
Subject: [PATCH 20/32] Rename IRMNV2 => IRMNRemote (#1484)
## Motivation
IRMNRemote is a better name
## Solution
Rename to `IRMNRemote`
---
.../interfaces/{IRMNV2.sol => IRMNRemote.sol} | 2 +-
contracts/src/v0.8/ccip/offRamp/OffRamp.sol | 20 +++++++-------
contracts/src/v0.8/ccip/onRamp/OnRamp.sol | 16 ++++++------
contracts/src/v0.8/ccip/rmn/RMNRemote.sol | 12 ++++-----
contracts/src/v0.8/ccip/test/BaseTest.t.sol | 8 +++---
.../ccip/test/e2e/MultiRampsEnd2End.t.sol | 4 +--
.../src/v0.8/ccip/test/offRamp/OffRamp.t.sol | 26 +++++++++----------
.../v0.8/ccip/test/offRamp/OffRampSetup.t.sol | 12 ++++-----
.../src/v0.8/ccip/test/onRamp/OnRamp.t.sol | 12 ++++-----
.../v0.8/ccip/test/onRamp/OnRampSetup.t.sol | 4 +--
.../src/v0.8/ccip/test/rmn/RMNRemote.t.sol | 14 +++++-----
.../v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol | 10 +++----
.../ccip/deployment_test/deployment_test.go | 4 +--
.../ccip_reader_tester/ccip_reader_tester.go | 6 ++---
.../ccip/generated/offramp/offramp.go | 4 +--
.../ccip/generated/onramp/onramp.go | 4 +--
.../generated/report_codec/report_codec.go | 6 ++---
.../ccip/generated/rmn_remote/rmn_remote.go | 12 ++++-----
...rapper-dependency-versions-do-not-edit.txt | 10 +++----
19 files changed, 93 insertions(+), 93 deletions(-)
rename contracts/src/v0.8/ccip/interfaces/{IRMNV2.sol => IRMNRemote.sol} (98%)
diff --git a/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol b/contracts/src/v0.8/ccip/interfaces/IRMNRemote.sol
similarity index 98%
rename from contracts/src/v0.8/ccip/interfaces/IRMNV2.sol
rename to contracts/src/v0.8/ccip/interfaces/IRMNRemote.sol
index 0a66af76ef..536a823720 100644
--- a/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol
+++ b/contracts/src/v0.8/ccip/interfaces/IRMNRemote.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.4;
import {Internal} from "../libraries/Internal.sol";
/// @notice This interface contains the only RMN-related functions that might be used on-chain by other CCIP contracts.
-interface IRMNV2 {
+interface IRMNRemote {
/// @notice signature components from RMN nodes
struct Signature {
bytes32 r;
diff --git a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
index 5fcddb486e..e457157b45 100644
--- a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
@@ -7,7 +7,7 @@ import {IFeeQuoter} from "../interfaces/IFeeQuoter.sol";
import {IMessageInterceptor} from "../interfaces/IMessageInterceptor.sol";
import {INonceManager} from "../interfaces/INonceManager.sol";
import {IPoolV1} from "../interfaces/IPool.sol";
-import {IRMNV2} from "../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../interfaces/IRMNRemote.sol";
import {IRouter} from "../interfaces/IRouter.sol";
import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol";
@@ -95,7 +95,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
// solhint-disable-next-line gas-struct-packing
struct StaticConfig {
uint64 chainSelector; // ───╮ Destination chainSelector
- IRMNV2 rmn; // ─────────────╯ RMN Verification Contract
+ IRMNRemote rmnRemote; // ───╯ RMN Verification Contract
address tokenAdminRegistry; // Token admin registry address
address nonceManager; // Nonce manager address
}
@@ -130,7 +130,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
struct CommitReport {
Internal.PriceUpdates priceUpdates; // Collection of gas and price updates to commit
Internal.MerkleRoot[] merkleRoots; // Collection of merkle roots per source chain to commit
- IRMNV2.Signature[] rmnSignatures; // RMN signatures on the merkle roots
+ IRMNRemote.Signature[] rmnSignatures; // RMN signatures on the merkle roots
uint256 rmnRawVs; // Raw v values of the RMN signatures
}
@@ -147,7 +147,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
/// @dev ChainSelector of this chain
uint64 internal immutable i_chainSelector;
/// @dev The RMN verification contract
- IRMNV2 internal immutable i_rmn;
+ IRMNRemote internal immutable i_rmnRemote;
/// @dev The address of the token admin registry
address internal immutable i_tokenAdminRegistry;
/// @dev The address of the nonce manager
@@ -178,7 +178,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
SourceChainConfigArgs[] memory sourceChainConfigs
) MultiOCR3Base() {
if (
- address(staticConfig.rmn) == address(0) || staticConfig.tokenAdminRegistry == address(0)
+ address(staticConfig.rmnRemote) == address(0) || staticConfig.tokenAdminRegistry == address(0)
|| staticConfig.nonceManager == address(0)
) {
revert ZeroAddressNotAllowed();
@@ -189,7 +189,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
}
i_chainSelector = staticConfig.chainSelector;
- i_rmn = staticConfig.rmn;
+ i_rmnRemote = staticConfig.rmnRemote;
i_tokenAdminRegistry = staticConfig.tokenAdminRegistry;
i_nonceManager = staticConfig.nonceManager;
emit StaticConfigSet(staticConfig);
@@ -357,7 +357,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
) internal {
uint64 sourceChainSelector = report.sourceChainSelector;
bool manualExecution = manualExecGasExecOverrides.length != 0;
- if (i_rmn.isCursed(bytes16(uint128(sourceChainSelector)))) {
+ if (i_rmnRemote.isCursed(bytes16(uint128(sourceChainSelector)))) {
if (manualExecution) {
// For manual execution we don't want to silently fail so we revert
revert CursedByRMN(sourceChainSelector);
@@ -785,7 +785,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
// Verify RMN signatures
if (commitReport.merkleRoots.length > 0) {
- i_rmn.verify(address(this), commitReport.merkleRoots, commitReport.rmnSignatures, commitReport.rmnRawVs);
+ i_rmnRemote.verify(address(this), commitReport.merkleRoots, commitReport.rmnSignatures, commitReport.rmnRawVs);
}
// Check if the report contains price updates
@@ -811,7 +811,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
Internal.MerkleRoot memory root = commitReport.merkleRoots[i];
uint64 sourceChainSelector = root.sourceChainSelector;
- if (i_rmn.isCursed(bytes16(uint128(sourceChainSelector)))) {
+ if (i_rmnRemote.isCursed(bytes16(uint128(sourceChainSelector)))) {
revert CursedByRMN(sourceChainSelector);
}
@@ -900,7 +900,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
function getStaticConfig() external view returns (StaticConfig memory) {
return StaticConfig({
chainSelector: i_chainSelector,
- rmn: i_rmn,
+ rmnRemote: i_rmnRemote,
tokenAdminRegistry: i_tokenAdminRegistry,
nonceManager: i_nonceManager
});
diff --git a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
index 00a7bbeeb5..fdbf57f46b 100644
--- a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
+++ b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
@@ -7,7 +7,7 @@ import {IFeeQuoter} from "../interfaces/IFeeQuoter.sol";
import {IMessageInterceptor} from "../interfaces/IMessageInterceptor.sol";
import {INonceManager} from "../interfaces/INonceManager.sol";
import {IPoolV1} from "../interfaces/IPool.sol";
-import {IRMNV2} from "../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../interfaces/IRMNRemote.sol";
import {IRouter} from "../interfaces/IRouter.sol";
import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol";
@@ -60,7 +60,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
// solhint-disable-next-line gas-struct-packing
struct StaticConfig {
uint64 chainSelector; // ─────╮ Source chain selector
- IRMNV2 rmn; // ───────────────╯ RMN remote address
+ IRMNRemote rmnRemote; // ─────╯ RMN remote address
address nonceManager; // Nonce manager address
address tokenAdminRegistry; // Token admin registry address
}
@@ -113,7 +113,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
/// @dev The chain ID of the source chain that this contract is deployed to
uint64 private immutable i_chainSelector;
/// @dev The rmn contract
- IRMNV2 private immutable i_rmn;
+ IRMNRemote private immutable i_rmnRemote;
/// @dev The address of the nonce manager
address private immutable i_nonceManager;
/// @dev The address of the token admin registry
@@ -132,14 +132,14 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
DestChainConfigArgs[] memory destChainConfigArgs
) {
if (
- staticConfig.chainSelector == 0 || address(staticConfig.rmn) == address(0)
+ staticConfig.chainSelector == 0 || address(staticConfig.rmnRemote) == address(0)
|| staticConfig.nonceManager == address(0) || staticConfig.tokenAdminRegistry == address(0)
) {
revert InvalidConfig();
}
i_chainSelector = staticConfig.chainSelector;
- i_rmn = staticConfig.rmn;
+ i_rmnRemote = staticConfig.rmnRemote;
i_nonceManager = staticConfig.nonceManager;
i_tokenAdminRegistry = staticConfig.tokenAdminRegistry;
@@ -314,7 +314,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
function getStaticConfig() external view returns (StaticConfig memory) {
return StaticConfig({
chainSelector: i_chainSelector,
- rmn: i_rmn,
+ rmnRemote: i_rmnRemote,
nonceManager: i_nonceManager,
tokenAdminRegistry: i_tokenAdminRegistry
});
@@ -351,7 +351,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
emit ConfigSet(
StaticConfig({
chainSelector: i_chainSelector,
- rmn: i_rmn,
+ rmnRemote: i_rmnRemote,
nonceManager: i_nonceManager,
tokenAdminRegistry: i_tokenAdminRegistry
}),
@@ -481,7 +481,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
uint64 destChainSelector,
Client.EVM2AnyMessage calldata message
) external view returns (uint256 feeTokenAmount) {
- if (i_rmn.isCursed(bytes16(uint128(destChainSelector)))) revert CursedByRMN(destChainSelector);
+ if (i_rmnRemote.isCursed(bytes16(uint128(destChainSelector)))) revert CursedByRMN(destChainSelector);
return IFeeQuoter(s_dynamicConfig.feeQuoter).getValidatedFee(destChainSelector, message);
}
diff --git a/contracts/src/v0.8/ccip/rmn/RMNRemote.sol b/contracts/src/v0.8/ccip/rmn/RMNRemote.sol
index 88fdd20577..0d38da22b3 100644
--- a/contracts/src/v0.8/ccip/rmn/RMNRemote.sol
+++ b/contracts/src/v0.8/ccip/rmn/RMNRemote.sol
@@ -2,7 +2,7 @@
pragma solidity 0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
-import {IRMNV2} from "../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../interfaces/IRMNRemote.sol";
import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
import {EnumerableSet} from "../../shared/enumerable/EnumerableSetWithBytes16.sol";
@@ -19,7 +19,7 @@ bytes16 constant LEGACY_CURSE_SUBJECT = 0x01000000000000000000000000000000;
bytes16 constant GLOBAL_CURSE_SUBJECT = 0x01000000000000000000000000000001;
/// @notice This contract supports verification of RMN reports for any Any2EVM OffRamp.
-contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNV2 {
+contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNRemote {
using EnumerableSet for EnumerableSet.Bytes16Set;
error AlreadyCursed(bytes16 subject);
@@ -85,7 +85,7 @@ contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNV2 {
// │ Verification │
// ================================================================
- /// @inheritdoc IRMNV2
+ /// @inheritdoc IRMNRemote
function verify(
address offrampAddress,
Internal.MerkleRoot[] calldata merkleRoots,
@@ -224,12 +224,12 @@ contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNV2 {
emit Uncursed(subjects);
}
- /// @inheritdoc IRMNV2
+ /// @inheritdoc IRMNRemote
function getCursedSubjects() external view returns (bytes16[] memory subjects) {
return s_cursedSubjects.values();
}
- /// @inheritdoc IRMNV2
+ /// @inheritdoc IRMNRemote
function isCursed() external view returns (bool) {
if (s_cursedSubjects.length() == 0) {
return false;
@@ -237,7 +237,7 @@ contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNV2 {
return s_cursedSubjects.contains(LEGACY_CURSE_SUBJECT) || s_cursedSubjects.contains(GLOBAL_CURSE_SUBJECT);
}
- /// @inheritdoc IRMNV2
+ /// @inheritdoc IRMNRemote
function isCursed(bytes16 subject) external view returns (bool) {
if (s_cursedSubjects.length() == 0) {
return false;
diff --git a/contracts/src/v0.8/ccip/test/BaseTest.t.sol b/contracts/src/v0.8/ccip/test/BaseTest.t.sol
index f6cd83672e..0c4d7d632c 100644
--- a/contracts/src/v0.8/ccip/test/BaseTest.t.sol
+++ b/contracts/src/v0.8/ccip/test/BaseTest.t.sol
@@ -4,7 +4,7 @@ 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 {IRMNV2} from "../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../interfaces/IRMNRemote.sol";
import {Internal} from "../libraries/Internal.sol";
import {RateLimiter} from "../libraries/RateLimiter.sol";
import {MockRMN} from "./mocks/MockRMN.sol";
@@ -71,7 +71,7 @@ contract BaseTest is Test {
address internal constant ADMIN = 0x11118e64e1FB0c487f25dD6D3601FF6aF8d32E4e;
MockRMN internal s_mockRMN;
- IRMNV2 internal s_mockRMNRemote;
+ IRMNRemote internal s_mockRMNRemote;
// nonce for pseudo-random number generation, not to be exposed to test suites
uint256 private randNonce;
@@ -92,9 +92,9 @@ contract BaseTest is Test {
// setup mock RMN & RMNRemote
s_mockRMN = new MockRMN();
- s_mockRMNRemote = IRMNV2(makeAddr("MOCK RMN REMOTE"));
+ s_mockRMNRemote = IRMNRemote(makeAddr("MOCK RMN REMOTE"));
vm.etch(address(s_mockRMNRemote), bytes("fake bytecode"));
- vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNV2.verify.selector), bytes(""));
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
_setMockRMNGlobalCurse(false);
vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(false)); // no curses by defaule
}
diff --git a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
index 8614f03d8d..48bfa668df 100644
--- a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
+++ b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
@@ -5,7 +5,7 @@ import {IRMN} from "../../interfaces/IRMN.sol";
import {AuthorizedCallers} from "../../../shared/access/AuthorizedCallers.sol";
import {NonceManager} from "../../NonceManager.sol";
-import {IRMNV2} from "../../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../../interfaces/IRMNRemote.sol";
import {LockReleaseTokenPool} from "../../pools/LockReleaseTokenPool.sol";
import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol";
import "../helpers/MerkleHelper.sol";
@@ -150,7 +150,7 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup {
merkleRoots[1] = MerkleHelper.getMerkleRoot(hashedMessages2);
// TODO make these real sigs :)
- IRMNV2.Signature[] memory rmnSignatures = new IRMNV2.Signature[](0);
+ IRMNRemote.Signature[] memory rmnSignatures = new IRMNRemote.Signature[](0);
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](2);
roots[0] = Internal.MerkleRoot({
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol
index 73adbb12c0..c344294494 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol
@@ -3,7 +3,7 @@ pragma solidity 0.8.24;
import {IFeeQuoter} from "../../interfaces/IFeeQuoter.sol";
import {IMessageInterceptor} from "../../interfaces/IMessageInterceptor.sol";
-import {IRMNV2} from "../../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../../interfaces/IRMNRemote.sol";
import {IRouter} from "../../interfaces/IRouter.sol";
import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol";
@@ -33,7 +33,7 @@ contract OffRamp_constructor is OffRampSetup {
function test_Constructor_Success() public {
OffRamp.StaticConfig memory staticConfig = OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: address(s_inboundNonceManager)
});
@@ -102,7 +102,7 @@ contract OffRamp_constructor is OffRampSetup {
// Static config
OffRamp.StaticConfig memory gotStaticConfig = s_offRamp.getStaticConfig();
assertEq(staticConfig.chainSelector, gotStaticConfig.chainSelector);
- assertEq(address(staticConfig.rmn), address(gotStaticConfig.rmn));
+ assertEq(address(staticConfig.rmnRemote), address(gotStaticConfig.rmnRemote));
assertEq(staticConfig.tokenAdminRegistry, gotStaticConfig.tokenAdminRegistry);
// Dynamic config
@@ -154,7 +154,7 @@ contract OffRamp_constructor is OffRampSetup {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: address(s_inboundNonceManager)
}),
@@ -180,7 +180,7 @@ contract OffRamp_constructor is OffRampSetup {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: address(s_inboundNonceManager)
}),
@@ -200,7 +200,7 @@ contract OffRamp_constructor is OffRampSetup {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: IRMNV2(ZERO_ADDRESS),
+ rmnRemote: IRMNRemote(ZERO_ADDRESS),
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: address(s_inboundNonceManager)
}),
@@ -220,7 +220,7 @@ contract OffRamp_constructor is OffRampSetup {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: 0,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: address(s_inboundNonceManager)
}),
@@ -240,7 +240,7 @@ contract OffRamp_constructor is OffRampSetup {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
tokenAdminRegistry: ZERO_ADDRESS,
nonceManager: address(s_inboundNonceManager)
}),
@@ -260,7 +260,7 @@ contract OffRamp_constructor is OffRampSetup {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: ZERO_ADDRESS
}),
@@ -3367,7 +3367,7 @@ contract OffRamp_commit is OffRampSetup {
function test_OnlyTokenPriceUpdates_Success() public {
// force RMN verification to fail
- vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNV2.verify.selector), bytes(""));
+ vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0);
OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({
@@ -3390,7 +3390,7 @@ contract OffRamp_commit is OffRampSetup {
function test_OnlyGasPriceUpdates_Success() public {
// force RMN verification to fail
- vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNV2.verify.selector), bytes(""));
+ vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0);
OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({
@@ -3561,7 +3561,7 @@ contract OffRamp_commit is OffRampSetup {
function test_FailedRMNVerification_Reverts() public {
// force RMN verification to fail
- vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNV2.verify.selector), bytes(""));
+ vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
OffRamp.CommitReport memory commitReport = _constructCommitReport();
vm.expectRevert();
@@ -3769,7 +3769,7 @@ contract OffRamp_afterOC3ConfigSet is OffRampSetup {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: address(s_inboundNonceManager)
}),
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol
index 6b18992f69..0fb4ff5094 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol
@@ -3,7 +3,7 @@ pragma solidity 0.8.24;
import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol";
import {ICommitStore} from "../../interfaces/ICommitStore.sol";
-import {IRMNV2} from "../../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../../interfaces/IRMNRemote.sol";
import {AuthorizedCallers} from "../../../shared/access/AuthorizedCallers.sol";
import {NonceManager} from "../../NonceManager.sol";
@@ -54,7 +54,7 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup {
uint64 internal s_latestSequenceNumber;
- IRMNV2.Signature[] internal s_rmnSignatures;
+ IRMNRemote.Signature[] internal s_rmnSignatures;
function setUp() public virtual override(FeeQuoterSetup, MultiOCR3BaseSetup) {
FeeQuoterSetup.setUp();
@@ -71,13 +71,13 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup {
_deployOffRamp(s_mockRMNRemote, s_inboundNonceManager);
}
- function _deployOffRamp(IRMNV2 rmn, NonceManager nonceManager) internal {
+ function _deployOffRamp(IRMNRemote rmnRemote, NonceManager nonceManager) internal {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](0);
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: rmn,
+ rmnRemote: rmnRemote,
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: address(nonceManager)
}),
@@ -423,7 +423,7 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
tokenAdminRegistry: address(s_tokenAdminRegistry),
nonceManager: address(s_inboundNonceManager)
}),
@@ -449,7 +449,7 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup {
RMN.Voter[] memory voters = new RMN.Voter[](1);
voters[0] =
RMN.Voter({blessVoteAddr: BLESS_VOTE_ADDR, curseVoteAddr: address(9999), blessWeight: 1, curseWeight: 1});
- // Overwrite base mock rmn with real.
+ // Overwrite base mock rmnRemote with real.
s_realRMN = new RMN(RMN.Config({voters: voters, blessWeightThreshold: 1, curseWeightThreshold: 1}));
}
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
index 90e704cf55..16425850e5 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
@@ -2,7 +2,7 @@
pragma solidity 0.8.24;
import {IMessageInterceptor} from "../../interfaces/IMessageInterceptor.sol";
-import {IRMNV2} from "../../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../../interfaces/IRMNRemote.sol";
import {IRouter} from "../../interfaces/IRouter.sol";
import {BurnMintERC677} from "../../../shared/token/ERC677/BurnMintERC677.sol";
@@ -22,7 +22,7 @@ contract OnRamp_constructor is OnRampSetup {
function test_Constructor_Success() public {
OnRamp.StaticConfig memory staticConfig = OnRamp.StaticConfig({
chainSelector: SOURCE_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
nonceManager: address(s_outboundNonceManager),
tokenAdminRegistry: address(s_tokenAdminRegistry)
});
@@ -53,7 +53,7 @@ contract OnRamp_constructor is OnRampSetup {
new OnRampHelper(
OnRamp.StaticConfig({
chainSelector: 0,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
nonceManager: address(s_outboundNonceManager),
tokenAdminRegistry: address(s_tokenAdminRegistry)
}),
@@ -67,7 +67,7 @@ contract OnRamp_constructor is OnRampSetup {
s_onRamp = new OnRampHelper(
OnRamp.StaticConfig({
chainSelector: SOURCE_CHAIN_SELECTOR,
- rmn: IRMNV2(address(0)),
+ rmnRemote: IRMNRemote(address(0)),
nonceManager: address(s_outboundNonceManager),
tokenAdminRegistry: address(s_tokenAdminRegistry)
}),
@@ -81,7 +81,7 @@ contract OnRamp_constructor is OnRampSetup {
new OnRampHelper(
OnRamp.StaticConfig({
chainSelector: SOURCE_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
nonceManager: address(0),
tokenAdminRegistry: address(s_tokenAdminRegistry)
}),
@@ -95,7 +95,7 @@ contract OnRamp_constructor is OnRampSetup {
new OnRampHelper(
OnRamp.StaticConfig({
chainSelector: SOURCE_CHAIN_SELECTOR,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
nonceManager: address(s_outboundNonceManager),
tokenAdminRegistry: address(0)
}),
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
index 6ecd3a5807..f60cfcc5ae 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
@@ -139,7 +139,7 @@ contract OnRampSetup is FeeQuoterFeeSetup {
OnRampHelper onRamp = new OnRampHelper(
OnRamp.StaticConfig({
chainSelector: sourceChainSelector,
- rmn: s_mockRMNRemote,
+ rmnRemote: s_mockRMNRemote,
nonceManager: nonceManager,
tokenAdminRegistry: tokenAdminRegistry
}),
@@ -183,7 +183,7 @@ contract OnRampSetup is FeeQuoterFeeSetup {
function _assertStaticConfigsEqual(OnRamp.StaticConfig memory a, OnRamp.StaticConfig memory b) internal pure {
assertEq(a.chainSelector, b.chainSelector);
- assertEq(address(a.rmn), address(b.rmn));
+ assertEq(address(a.rmnRemote), address(b.rmnRemote));
assertEq(a.tokenAdminRegistry, b.tokenAdminRegistry);
}
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote.t.sol
index f24b3ac9c9..5f46f85669 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote.t.sol
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
-import {IRMNV2} from "../../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../../interfaces/IRMNRemote.sol";
import {Internal} from "../../libraries/Internal.sol";
import {GLOBAL_CURSE_SUBJECT, LEGACY_CURSE_SUBJECT, RMNRemote} from "../../rmn/RMNRemote.sol";
import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol";
@@ -115,7 +115,7 @@ contract RMNRemote_setConfig is RMNRemoteSetup {
contract RMNRemote_verify_withConfigNotSet is RMNRemoteSetup {
function test_verify_reverts() public {
Internal.MerkleRoot[] memory merkleRoots = new Internal.MerkleRoot[](0);
- IRMNV2.Signature[] memory signatures = new IRMNV2.Signature[](0);
+ IRMNRemote.Signature[] memory signatures = new IRMNRemote.Signature[](0);
vm.expectRevert(RMNRemote.ConfigNotSet.selector);
s_rmnRemote.verify(OFF_RAMP_ADDRESS, merkleRoots, signatures, 0);
@@ -144,11 +144,11 @@ contract RMNRemote_verify_withConfigSet is RMNRemoteSetup {
vm.stopPrank();
vm.prank(OFF_RAMP_ADDRESS);
- s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, new IRMNV2.Signature[](0), s_v);
+ s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, new IRMNRemote.Signature[](0), s_v);
}
function test_verify_InvalidSignature_reverts() public {
- IRMNV2.Signature memory sig = s_signatures[s_signatures.length - 1];
+ IRMNRemote.Signature memory sig = s_signatures[s_signatures.length - 1];
sig.r = _randomBytes32();
s_signatures.pop();
s_signatures.push(sig);
@@ -158,9 +158,9 @@ contract RMNRemote_verify_withConfigSet is RMNRemoteSetup {
}
function test_verify_OutOfOrderSignatures_not_sorted_reverts() public {
- IRMNV2.Signature memory sig1 = s_signatures[s_signatures.length - 1];
+ IRMNRemote.Signature memory sig1 = s_signatures[s_signatures.length - 1];
s_signatures.pop();
- IRMNV2.Signature memory sig2 = s_signatures[s_signatures.length - 1];
+ IRMNRemote.Signature memory sig2 = s_signatures[s_signatures.length - 1];
s_signatures.pop();
s_signatures.push(sig1);
s_signatures.push(sig2);
@@ -170,7 +170,7 @@ contract RMNRemote_verify_withConfigSet is RMNRemoteSetup {
}
function test_verify_OutOfOrderSignatures_duplicateSignature_reverts() public {
- IRMNV2.Signature memory sig = s_signatures[s_signatures.length - 2];
+ IRMNRemote.Signature memory sig = s_signatures[s_signatures.length - 2];
s_signatures.pop();
s_signatures.push(sig);
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol
index 6896cb91c6..ad25abcf1a 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
-import {IRMNV2} from "../../interfaces/IRMNV2.sol";
+import {IRMNRemote} from "../../interfaces/IRMNRemote.sol";
import {Internal} from "../../libraries/Internal.sol";
import {RMNRemote} from "../../rmn/RMNRemote.sol";
import {BaseTest} from "../BaseTest.t.sol";
@@ -17,7 +17,7 @@ contract RMNRemoteSetup is BaseTest {
Vm.Wallet[] public s_signerWallets;
Internal.MerkleRoot[] s_merkleRoots;
- IRMNV2.Signature[] s_signatures;
+ IRMNRemote.Signature[] s_signatures;
uint256 internal s_v;
bytes16 internal constant curseSubj1 = bytes16(keccak256("subject 1"));
@@ -76,7 +76,7 @@ contract RMNRemoteSetup is BaseTest {
}
for (uint256 i = 0; i < numSigs; i++) {
- (uint8 v, IRMNV2.Signature memory sig) = _signDestLaneUpdate(s_merkleRoots, s_signerWallets[i]);
+ (uint8 v, IRMNRemote.Signature memory sig) = _signDestLaneUpdate(s_merkleRoots, s_signerWallets[i]);
s_signatures.push(sig);
if (v == 28) {
s_v += 1 << i;
@@ -103,7 +103,7 @@ contract RMNRemoteSetup is BaseTest {
function _signDestLaneUpdate(
Internal.MerkleRoot[] memory merkleRoots,
Vm.Wallet memory wallet
- ) private returns (uint8 sigV, IRMNV2.Signature memory) {
+ ) private returns (uint8 sigV, IRMNRemote.Signature memory) {
(, RMNRemote.Config memory config) = s_rmnRemote.getVersionedConfig();
bytes32 digest = keccak256(
abi.encode(
@@ -119,7 +119,7 @@ contract RMNRemoteSetup is BaseTest {
)
);
(uint8 v, bytes32 r, bytes32 s) = vm.sign(wallet, digest);
- return (v, IRMNV2.Signature({r: r, s: s}));
+ return (v, IRMNRemote.Signature({r: r, s: s}));
}
/// @notice bubble sort on a storage array of wallets
diff --git a/core/gethwrappers/ccip/deployment_test/deployment_test.go b/core/gethwrappers/ccip/deployment_test/deployment_test.go
index 295dee120f..a9c9dc1dd4 100644
--- a/core/gethwrappers/ccip/deployment_test/deployment_test.go
+++ b/core/gethwrappers/ccip/deployment_test/deployment_test.go
@@ -42,7 +42,7 @@ func TestDeployAllV1_6(t *testing.T) {
// offramp
_, _, _, err = offramp.DeployOffRamp(owner, chain, offramp.OffRampStaticConfig{
ChainSelector: 1,
- Rmn: common.HexToAddress("0x1"),
+ RmnRemote: common.HexToAddress("0x1"),
TokenAdminRegistry: common.HexToAddress("0x2"),
NonceManager: common.HexToAddress("0x3"),
}, offramp.OffRampDynamicConfig{
@@ -56,7 +56,7 @@ func TestDeployAllV1_6(t *testing.T) {
// onramp
_, _, _, err = onramp.DeployOnRamp(owner, chain, onramp.OnRampStaticConfig{
ChainSelector: 1,
- Rmn: common.HexToAddress("0x1"),
+ RmnRemote: common.HexToAddress("0x1"),
NonceManager: common.HexToAddress("0x2"),
TokenAdminRegistry: common.HexToAddress("0x3"),
}, onramp.OnRampDynamicConfig{
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 bb6639d7e8..e5b59060a2 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
@@ -30,7 +30,7 @@ var (
_ = abi.ConvertType
)
-type IRMNV2Signature struct {
+type IRMNRemoteSignature struct {
R [32]byte
S [32]byte
}
@@ -89,7 +89,7 @@ type InternalTokenPriceUpdate struct {
type OffRampCommitReport struct {
PriceUpdates InternalPriceUpdates
MerkleRoots []InternalMerkleRoot
- RmnSignatures []IRMNV2Signature
+ RmnSignatures []IRMNRemoteSignature
RmnRawVs *big.Int
}
@@ -101,7 +101,7 @@ type OffRampSourceChainConfig struct {
}
var CCIPReaderTesterMetaData = &bind.MetaData{
- ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"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\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"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\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\":\"emitCCIPSendRequested\",\"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\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\"}],\"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\"},{\"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\"}]",
+ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"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\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"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\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\":\"emitCCIPSendRequested\",\"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\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\"}],\"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\"},{\"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: "0x608060405234801561001057600080fd5b506113e9806100206000396000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c8063198b821c146100725780634cf66e36146100875780639041be3d1461009a578063c081a962146100ca578063c1a5a355146100dd578063e83eabba14610119578063e9d68a8e1461012c575b600080fd5b6100856100803660046107bd565b61014c565b005b610085610095366004610954565b610186565b6100ad6100a83660046109d2565b6101db565b6040516001600160401b0390911681526020015b60405180910390f35b6100856100d8366004610b82565b61020a565b6100856100eb366004610cbc565b6001600160401b03918216600090815260016020526040902080546001600160401b03191691909216179055565b610085610127366004610cef565b61024f565b61013f61013a3660046109d2565b6102db565b6040516100c19190610df0565b7f062172a2ae1a84d7c8d18965d6267b71d579aeca033bbd2e0548947798c3d4628160405161017b9190610f8c565b60405180910390a150565b82846001600160401b0316866001600160401b03167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df285856040516101cc92919061106d565b60405180910390a45050505050565b6001600160401b03808216600090815260016020819052604082205491926102049216906110a4565b92915050565b816001600160401b03167f273f5ec254c4821d9795f26fddd245b3658bf1126d45d9d1c13a1d18a4c77750826040516102439190611186565b60405180910390a25050565b6001600160401b0380831660009081526020818152604091829020845181549286015193860151909416600160a81b02600160a81b600160e81b0319931515600160a01b026001600160a81b03199093166001600160a01b03909516949094179190911791909116919091178155606082015182919060018201906102d4908261131d565b5050505050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b038781168452838352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b90920490921694830194909452600184018054939492939184019161036690611292565b80601f016020809104026020016040519081016040528092919081815260200182805461039290611292565b80156103df5780601f106103b4576101008083540402835291602001916103df565b820191906000526020600020905b8154815290600101906020018083116103c257829003601f168201915b5050505050815250509050919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610427576104276103ef565b60405290565b60405160a081016001600160401b0381118282101715610427576104276103ef565b604051608081016001600160401b0381118282101715610427576104276103ef565b60405161012081016001600160401b0381118282101715610427576104276103ef565b604051601f8201601f191681016001600160401b03811182821017156104bc576104bc6103ef565b604052919050565b60006001600160401b038211156104dd576104dd6103ef565b5060051b60200190565b6001600160a01b03811681146104fc57600080fd5b50565b803561050a816104e7565b919050565b80356001600160e01b038116811461050a57600080fd5b80356001600160401b038116811461050a57600080fd5b600082601f83011261054e57600080fd5b8135602061056361055e836104c4565b610494565b82815260069290921b8401810191818101908684111561058257600080fd5b8286015b848110156105cf576040818903121561059f5760008081fd5b6105a7610405565b6105b082610526565b81526105bd85830161050f565b81860152835291830191604001610586565b509695505050505050565b600082601f8301126105eb57600080fd5b81356001600160401b03811115610604576106046103ef565b610617601f8201601f1916602001610494565b81815284602083860101111561062c57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261065a57600080fd5b8135602061066a61055e836104c4565b82815260059290921b8401810191818101908684111561068957600080fd5b8286015b848110156105cf5780356001600160401b03808211156106ad5760008081fd5b9088019060a0828b03601f19018113156106c75760008081fd5b6106cf61042d565b6106da888501610526565b8152604080850135848111156106f05760008081fd5b6106fe8e8b838901016105da565b8a8401525060609350610712848601610526565b908201526080610723858201610526565b9382019390935292013590820152835291830191830161068d565b600082601f83011261074f57600080fd5b8135602061075f61055e836104c4565b82815260069290921b8401810191818101908684111561077e57600080fd5b8286015b848110156105cf576040818903121561079b5760008081fd5b6107a3610405565b813581528482013585820152835291830191604001610782565b600060208083850312156107d057600080fd5b82356001600160401b03808211156107e757600080fd5b90840190608082870312156107fb57600080fd5b61080361044f565b82358281111561081257600080fd5b8301604081890381131561082557600080fd5b61082d610405565b82358581111561083c57600080fd5b8301601f81018b1361084d57600080fd5b803561085b61055e826104c4565b81815260069190911b8201890190898101908d83111561087a57600080fd5b928a01925b828410156108ca5785848f0312156108975760008081fd5b61089f610405565b84356108aa816104e7565b81526108b7858d0161050f565b818d0152825292850192908a019061087f565b8452505050828701359150848211156108e257600080fd5b6108ee8a83850161053d565b8188015283525050828401358281111561090757600080fd5b61091388828601610649565b8583015250604083013593508184111561092c57600080fd5b6109388785850161073e565b6040820152606083013560608201528094505050505092915050565b600080600080600060a0868803121561096c57600080fd5b61097586610526565b945061098360208701610526565b93506040860135925060608601356004811061099e57600080fd5b915060808601356001600160401b038111156109b957600080fd5b6109c5888289016105da565b9150509295509295909350565b6000602082840312156109e457600080fd5b6109ed82610526565b9392505050565b600060a08284031215610a0657600080fd5b610a0e61042d565b905081358152610a2060208301610526565b6020820152610a3160408301610526565b6040820152610a4260608301610526565b6060820152610a5360808301610526565b608082015292915050565b600082601f830112610a6f57600080fd5b81356020610a7f61055e836104c4565b82815260059290921b84018101918181019086841115610a9e57600080fd5b8286015b848110156105cf5780356001600160401b0380821115610ac25760008081fd5b9088019060a0828b03601f1901811315610adc5760008081fd5b610ae461042d565b610aef8885016104ff565b815260408085013584811115610b055760008081fd5b610b138e8b838901016105da565b8a8401525060608086013585811115610b2c5760008081fd5b610b3a8f8c838a01016105da565b83850152506080915081860135818401525082850135925083831115610b605760008081fd5b610b6e8d8a858801016105da565b908201528652505050918301918301610aa2565b60008060408385031215610b9557600080fd5b610b9e83610526565b915060208301356001600160401b0380821115610bba57600080fd5b908401906101a08287031215610bcf57600080fd5b610bd7610471565b610be187846109f4565b8152610bef60a084016104ff565b602082015260c083013582811115610c0657600080fd5b610c12888286016105da565b60408301525060e083013582811115610c2a57600080fd5b610c36888286016105da565b6060830152506101008084013583811115610c5057600080fd5b610c5c898287016105da565b608084015250610c6f61012085016104ff565b60a083015261014084013560c083015261016084013560e083015261018084013583811115610c9d57600080fd5b610ca989828701610a5e565b8284015250508093505050509250929050565b60008060408385031215610ccf57600080fd5b610cd883610526565b9150610ce660208401610526565b90509250929050565b60008060408385031215610d0257600080fd5b610d0b83610526565b915060208301356001600160401b0380821115610d2757600080fd5b9084019060808287031215610d3b57600080fd5b610d4361044f565b8235610d4e816104e7565b815260208301358015158114610d6357600080fd5b6020820152610d7460408401610526565b6040820152606083013582811115610d8b57600080fd5b610d97888286016105da565b6060830152508093505050509250929050565b6000815180845260005b81811015610dd057602081850181015186830182015201610db4565b506000602082860101526020601f19601f83011685010191505092915050565b602080825282516001600160a01b03168282015282015115156040808301919091528201516001600160401b0316606080830191909152820151608080830152600090610e4060a0840182610daa565b949350505050565b6001600160a01b03169052565b60008151808452602080850194506020840160005b83811015610ea357815180516001600160401b031688528301516001600160e01b03168388015260409096019590820190600101610e6a565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b84811015610f4357858303601f19018952815180516001600160401b0390811685528582015160a08787018190529190610f0783880182610daa565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101610ecb565b5090979650505050505050565b60008151808452602080850194506020840160005b83811015610ea3578151805188528301518388015260409096019590820190600101610f65565b602080825282516080838301528051604060a08501819052815160e08601819052600094939284019185916101008801905b80841015610ff957845180516001600160a01b031683528701516001600160e01b031687830152938601936001939093019290820190610fbe565b5093850151878503609f190160c0890152936110158186610e55565b945050505050818501519150601f19808583030160408601526110388284610eae565b92506040860151915080858403016060860152506110568282610f50565b915050606084015160808401528091505092915050565b60006004841061108d57634e487b7160e01b600052602160045260246000fd5b83825260406020830152610e406040830184610daa565b6001600160401b038181168382160190808211156110d257634e487b7160e01b600052601160045260246000fd5b5092915050565b600082825180855260208086019550808260051b84010181860160005b84811015610f4357858303601f19018952815180516001600160a01b031684528481015160a08686018190529061112f82870182610daa565b915050604080830151868303828801526111498382610daa565b925050506060808301518187015250608080830151925085820381870152506111728183610daa565b9a86019a94505050908301906001016110f6565b602081526111d3602082018351805182526020808201516001600160401b039081169184019190915260408083015182169084015260608083015182169084015260809182015116910152565b600060208301516111e760c0840182610e48565b5060408301516101a08060e08501526112046101c0850183610daa565b91506060850151601f196101008187860301818801526112248584610daa565b94506080880151925081878603016101208801526112428584610daa565b945060a08801519250611259610140880184610e48565b60c088015161016088015260e088015161018088015287015186850390910183870152905061128883826110d9565b9695505050505050565b600181811c908216806112a657607f821691505b6020821081036112c657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611318576000816000526020600020601f850160051c810160208610156112f55750805b601f850160051c820191505b8181101561131457828155600101611301565b5050505b505050565b81516001600160401b03811115611336576113366103ef565b61134a816113448454611292565b846112cc565b602080601f83116001811461137f57600084156113675750858301515b600019600386901b1c1916600185901b178555611314565b600085815260208120601f198616915b828110156113ae5788860151825594840194600190910190840161138f565b50858210156113cc5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000818000a",
}
diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go
index 9ef94b601b..fe30f8090f 100644
--- a/core/gethwrappers/ccip/generated/offramp/offramp.go
+++ b/core/gethwrappers/ccip/generated/offramp/offramp.go
@@ -148,13 +148,13 @@ type OffRampSourceChainConfigArgs struct {
type OffRampStaticConfig struct {
ChainSelector uint64
- Rmn common.Address
+ RmnRemote common.Address
TokenAdminRegistry common.Address
NonceManager common.Address
}
var OffRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"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\":[{\"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\":\"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\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationDisabled\",\"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\":\"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\":\"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\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"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\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"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\":\"contractIRMNV2\",\"name\":\"rmn\",\"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.ExecutionReportSingleChain[]\",\"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\":\"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\"}]",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"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\":\"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\":[{\"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\":\"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\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationDisabled\",\"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\":\"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\":\"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\":\"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[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"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\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"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\":\"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.ExecutionReportSingleChain[]\",\"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\":\"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: "0x6101206040523480156200001257600080fd5b50604051620067de380380620067de833981016040819052620000359162000806565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f1816200036d565b50505062000b8d565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586166001600160c01b03199094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b60005b8151811015620005ba57600082828151811062000391576200039162000943565b60200260200101519050600081602001519050806001600160401b0316600003620003cf5760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b0316620003f8576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b03811660009081526006602052604090206060830151600182018054620004269062000959565b905060000362000489578154600160a81b600160e81b031916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620004c8565b8154600160a81b90046001600160401b0316600114620004c857604051632105803760e11b81526001600160401b038416600482015260240162000083565b80511580620004fe5750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b156200051d576040516342bcdf7f60e11b815260040160405180910390fd5b600182016200052d8282620009ea565b50604080850151835486516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178355516001600160401b038416907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b90620005a290859062000ab6565b60405180910390a25050505080600101905062000370565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620005f957620005f9620005be565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200062a576200062a620005be565b604052919050565b80516001600160401b03811681146200064a57600080fd5b919050565b6001600160a01b03811681146200066557600080fd5b50565b6000601f83601f8401126200067c57600080fd5b825160206001600160401b03808311156200069b576200069b620005be565b8260051b620006ac838201620005ff565b9384528681018301938381019089861115620006c757600080fd5b84890192505b85831015620007f957825184811115620006e75760008081fd5b89016080601f19828d038101821315620007015760008081fd5b6200070b620005d4565b888401516200071a816200064f565b815260406200072b85820162000632565b8a8301526060808601518015158114620007455760008081fd5b838301529385015193898511156200075d5760008081fd5b84860195508f603f8701126200077557600094508485fd5b8a8601519450898511156200078e576200078e620005be565b6200079f8b858f88011601620005ff565b93508484528f82868801011115620007b75760008081fd5b60005b85811015620007d7578681018301518582018d01528b01620007ba565b5060009484018b019490945250918201528352509184019190840190620006cd565b9998505050505050505050565b60008060008385036101008112156200081e57600080fd5b60808112156200082d57600080fd5b62000837620005d4565b620008428662000632565b8152602086015162000854816200064f565b6020820152604086015162000869816200064f565b604082015260608601516200087e816200064f565b606082810191909152909450607f19820112156200089b57600080fd5b50604051606081016001600160401b038082118383101715620008c257620008c2620005be565b8160405260808701519150620008d8826200064f565b90825260a08601519063ffffffff82168214620008f457600080fd5b81602084015260c087015191506200090c826200064f565b6040830182905260e0870151929450808311156200092957600080fd5b5050620009398682870162000668565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200096e57607f821691505b6020821081036200098f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009e5576000816000526020600020601f850160051c81016020861015620009c05750805b601f850160051c820191505b81811015620009e157828155600101620009cc565b5050505b505050565b81516001600160401b0381111562000a065762000a06620005be565b62000a1e8162000a17845462000959565b8462000995565b602080601f83116001811462000a56576000841562000a3d5750858301515b600019600386901b1c1916600185901b178555620009e1565b600085815260208120601f198616915b8281101562000a875788860151825594840194600190910190840162000a66565b508582101562000aa65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000b0b8162000959565b8060a089015260c0600183166000811462000b2f576001811462000b4c5762000b7e565b60ff19841660c08b015260c083151560051b8b0101945062000b7e565b85600052602060002060005b8481101562000b755781548c820185015290880190890162000b58565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615bdb62000c036000396000818161022c01526129d50152600081816101fd0152612c9a0152600081816101ce015281816105580152818161070a015261239601526000818161019f01526125d5015260008181611ac70152611afa0152615bdb6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80636f9e320f116100cd578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e146104bc578063f2fde38b146104dc578063f716f99f146104ef57600080fd5b8063c673e58414610458578063ccd37ba31461047857600080fd5b806379ba5097116100b257806379ba50971461042757806385572ffb1461042f5780638da5cb5b1461043d57600080fd5b80636f9e320f146103825780637437ff9f1461039557600080fd5b8063311cd513116101245780635e36480c116101095780635e36480c1461033c5780635e7bb0081461035c57806360987c201461036f57600080fd5b8063311cd5131461030e5780633f4b04aa1461032157600080fd5b806304666f9c1461015657806306285c691461016b578063181f5a77146102b25780632d04ab76146102fb575b600080fd5b610169610164366004613ba0565b610502565b005b61025c60408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160401b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102a9919081516001600160401b031681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6102ee6040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102a99190613d0e565b610169610309366004613dbe565b610516565b61016961031c366004613e70565b610a1d565b6009546040516001600160401b0390911681526020016102a9565b61034f61034a366004613ec3565b610a86565b6040516102a99190613f20565b61016961036a366004614489565b610adb565b61016961037d3660046146cd565b610d6a565b610169610390366004614761565b61104a565b6103f1604080516060810182526000808252602082018190529181019190915250604080516060810182526004546001600160a01b038082168352600160a01b90910463ffffffff166020830152600554169181019190915290565b6040805182516001600160a01b03908116825260208085015163ffffffff169083015292820151909216908201526060016102a9565b61016961105b565b6101696101513660046147d0565b6000546040516001600160a01b0390911681526020016102a9565b61046b61046636600461481b565b61110c565b6040516102a9919061487b565b6104ae6104863660046148f0565b6001600160401b03919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102a9565b6104cf6104ca36600461491a565b61126a565b6040516102a99190614935565b6101696104ea366004614982565b611376565b6101696104fd366004614a07565b611387565b61050a6113c9565b61051381611425565b50565b600061052487890189614d5c565b602081015151909150156105c157602081015160408083015160608401519151638d8741cb60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693638d8741cb93610590933093909190600401614f91565b60006040518083038186803b1580156105a857600080fd5b505afa1580156105bc573d6000803e3d6000fd5b505050505b805151511515806105d757508051602001515115155b156106a35760095460208a0135906001600160401b038083169116101561067b576009805467ffffffffffffffff19166001600160401b038316179055600480548351604051633937306f60e01b81526001600160a01b0390921692633937306f926106449291016150de565b600060405180830381600087803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b505050506106a1565b8160200151516000036106a157604051632261116760e01b815260040160405180910390fd5b505b60005b81602001515181101561095e576000826020015182815181106106cb576106cb61500c565b60209081029190910101518051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610751573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077591906150f1565b156107a357604051637edeb53960e11b81526001600160401b03821660048201526024015b60405180910390fd5b60006107ae82611678565b9050806001016040516107c19190615148565b6040518091039020836020015180519060200120146107fe5782602001518160010160405163b80d8fa960e01b815260040161079a92919061523b565b60408301518154600160a81b90046001600160401b03908116911614158061083f575082606001516001600160401b031683604001516001600160401b0316115b1561088457825160408085015160608601519151636af0786b60e11b81526001600160401b03938416600482015290831660248201529116604482015260640161079a565b6080830151806108a75760405163504570e360e01b815260040160405180910390fd5b83516001600160401b03166000908152600860209081526040808320848452909152902054156108ff5783516040516332cf0cbf60e01b81526001600160401b0390911660048201526024810182905260440161079a565b606084015161090f906001615276565b825467ffffffffffffffff60a81b1916600160a81b6001600160401b039283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016106a6565b50602081015181516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e49261099692909161529d565b60405180910390a1610a1260008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92506116c4915050565b505050505050505050565b610a5d610a2c828401846152c2565b6040805160008082526020820190925290610a57565b6060815260200190600190039081610a425790505b506119bd565b604080516000808252602082019092529050610a806001858585858660006116c4565b50505050565b6000610a94600160046152f6565b6002610aa160808561531f565b6001600160401b0316610ab49190615345565b610abe8585611a7f565b901c166003811115610ad257610ad2613ef6565b90505b92915050565b610ae3611ac4565b815181518114610b06576040516320f8fd5960e21b815260040160405180910390fd5b60005b81811015610d5a576000848281518110610b2557610b2561500c565b60200260200101519050600081602001515190506000858481518110610b4d57610b4d61500c565b6020026020010151905080518214610b78576040516320f8fd5960e21b815260040160405180910390fd5b60005b82811015610d4b576000828281518110610b9757610b9761500c565b6020026020010151600001519050600085602001518381518110610bbd57610bbd61500c565b6020026020010151905081600014610c11578060800151821015610c11578551815151604051633a98d46360e11b81526001600160401b03909216600483015260248201526044810183905260640161079a565b838381518110610c2357610c2361500c565b602002602001015160200151518160a001515114610c7057805180516060909101516040516370a193fd60e01b815260048101929092526001600160401b0316602482015260440161079a565b60005b8160a0015151811015610d3d576000858581518110610c9457610c9461500c565b6020026020010151602001518281518110610cb157610cb161500c565b602002602001015163ffffffff16905080600014610d345760008360a001518381518110610ce157610ce161500c565b60200260200101516040015163ffffffff16905080821015610d32578351516040516348e617b360e01b8152600481019190915260248101849052604481018290526064810183905260840161079a565b505b50600101610c73565b505050806001019050610b7b565b50505050806001019050610b09565b50610d6583836119bd565b505050565b333014610d8a576040516306e34e6560e31b815260040160405180910390fd5b6040805160008082526020820190925281610dc7565b6040805180820190915260008082526020820152815260200190600190039081610da05790505b5060a08701515190915015610dfd57610dfa8660a001518760200151886060015189600001516020015189898989611b2c565b90505b6040805160a081018252875151815287516020908101516001600160401b031681830152808901518351600094840192610e38929101613d0e565b60408051601f19818403018152918152908252898101516020830152018390526005549091506001600160a01b03168015610f13576040516308d450a160e01b81526001600160a01b038216906308d450a190610e999085906004016153fd565b600060405180830381600087803b158015610eb357600080fd5b505af1925050508015610ec4575060015b610f13573d808015610ef2576040519150601f19603f3d011682016040523d82523d6000602084013e610ef7565b606091505b50806040516309c2532560e01b815260040161079a9190613d0e565b604088015151158015610f2857506080880151155b80610f3f575060608801516001600160a01b03163b155b80610f6657506060880151610f64906001600160a01b03166385572ffb60e01b611cdd565b155b15610f7357505050611043565b87516020908101516001600160401b03166000908152600690915260408082205460808b015160608c01519251633cf9798360e01b815284936001600160a01b0390931692633cf9798392610fd19289926113889291600401615410565b6000604051808303816000875af1158015610ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611018919081019061544c565b50915091508161103d57806040516302a35ba360e21b815260040161079a9190613d0e565b50505050505b5050505050565b6110526113c9565b61051381611cf9565b6001546001600160a01b031633146110b55760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161079a565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61114f6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c0820152948552918201805484518184028101840190955280855292938583019390928301828280156111f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116111da575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561125a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161123c575b5050505050815250509050919050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b03878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b9092049092169483019490945260018401805493949293918401916112f69061510e565b80601f01602080910402602001604051908101604052809291908181526020018280546113229061510e565b801561125a5780601f106113445761010080835404028352916020019161125a565b820191906000526020600020905b81548152906001019060200180831161135257505050919092525091949350505050565b61137e6113c9565b61051381611dd8565b61138f6113c9565b60005b81518110156113c5576113bd8282815181106113b0576113b061500c565b6020026020010151611e81565b600101611392565b5050565b6000546001600160a01b031633146114235760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161079a565b565b60005b81518110156113c55760008282815181106114455761144561500c565b60200260200101519050600081602001519050806001600160401b03166000036114825760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166114aa576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260066020526040902060608301516001820180546114d69061510e565b905060000361153857815467ffffffffffffffff60a81b1916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611575565b8154600160a81b90046001600160401b031660011461157557604051632105803760e11b81526001600160401b038416600482015260240161079a565b805115806115aa5750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b156115c8576040516342bcdf7f60e11b815260040160405180910390fd5b600182016115d68282615531565b50604080850151835486516001600160a01b03166001600160a01b0319921515600160a01b02929092167fffffffffffffffffffffff00000000000000000000000000000000000000000090911617178355516001600160401b038416907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906116619085906155f0565b60405180910390a250505050806001019050611428565b6001600160401b03811660009081526006602052604081208054600160a01b900460ff16610ad55760405163ed053c5960e01b81526001600160401b038416600482015260240161079a565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906117238760a461563e565b905082606001511561176b57845161173c906020615345565b8651611749906020615345565b6117549060a061563e565b61175e919061563e565b611768908261563e565b90505b36811461179457604051638e1192e160e01b81526004810182905236602482015260440161079a565b50815181146117c35781516040516324f7d61360e21b815260048101919091526024810182905260440161079a565b6117cb611ac4565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561181957611819613ef6565b600281111561182a5761182a613ef6565b905250905060028160200151600281111561184757611847613ef6565b14801561189b5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff16815481106118835761188361500c565b6000918252602090912001546001600160a01b031633145b6118b857604051631b41e11d60e31b815260040160405180910390fd5b508160600151156119685760208201516118d3906001615651565b60ff168551146118f6576040516371253a2560e01b815260040160405180910390fd5b83518551146119185760405163a75d88af60e01b815260040160405180910390fd5b6000878760405161192a92919061566a565b604051908190038120611941918b9060200161567a565b6040516020818303038152906040528051906020012090506119668a828888886121ab565b505b6040805182815260208a8101356001600160401b03169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b81516000036119de5760405162bf199760e01b815260040160405180910390fd5b80516040805160008082526020820190925291159181611a21565b6040805180820190915260008152606060208201528152602001906001900390816119f95790505b50905060005b845181101561104357611a77858281518110611a4557611a4561500c565b602002602001015184611a7157858381518110611a6457611a6461500c565b6020026020010151612368565b83612368565b600101611a27565b6001600160401b038216600090815260076020526040812081611aa360808561568e565b6001600160401b031681526020810191909152604001600020549392505050565b467f00000000000000000000000000000000000000000000000000000000000000001461142357604051630f01ce8560e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161079a565b606088516001600160401b03811115611b4757611b476139e2565b604051908082528060200260200182016040528015611b8c57816020015b6040805180820190915260008082526020820152815260200190600190039081611b655790505b509050811560005b8a51811015611ccf5781611c2c57848482818110611bb457611bb461500c565b9050602002016020810190611bc991906156b4565b63ffffffff1615611c2c57848482818110611be657611be661500c565b9050602002016020810190611bfb91906156b4565b8b8281518110611c0d57611c0d61500c565b60200260200101516040019063ffffffff16908163ffffffff16815250505b611caa8b8281518110611c4157611c4161500c565b60200260200101518b8b8b8b8b87818110611c5e57611c5e61500c565b9050602002810190611c7091906156cf565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612c5f92505050565b838281518110611cbc57611cbc61500c565b6020908102919091010152600101611b94565b505098975050505050505050565b6000611ce883612f3f565b8015610ad25750610ad28383612f8a565b80516001600160a01b0316611d21576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586167fffffffffffffffff0000000000000000000000000000000000000000000000009094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b336001600160a01b03821603611e305760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161079a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003611eac576000604051631b3fab5160e11b815260040161079a9190615715565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003611efd576060840151600182018054911515620100000262ff000019909216919091179055611f39565b6060840151600182015460ff6201000090910416151590151514611f39576040516321fd80df60e21b815260ff8416600482015260240161079a565b60a084015180516101001015611f65576001604051631b3fab5160e11b815260040161079a9190615715565b8051600003611f8a576005604051631b3fab5160e11b815260040161079a9190615715565b611ff08484600301805480602002602001604051908101604052809291908181526020018280548015611fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fc8575b505050505061302c565b8460600151156121205761205e8484600201805480602002602001604051908101604052809291908181526020018280548015611fe6576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611fc857505050505061302c565b60808501518051610100101561208a576002604051631b3fab5160e11b815260040161079a9190615715565b604086015161209a90600361572f565b60ff168151116120c0576003604051631b3fab5160e11b815260040161079a9190615715565b8151815110156120e6576001604051631b3fab5160e11b815260040161079a9190615715565b805160018401805461ff00191661010060ff8416021790556121119060028601906020840190613968565b5061211e85826001613095565b505b61212c84826002613095565b80516121419060038501906020840190613968565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361219a9389939260028a0192919061574b565b60405180910390a1611043846131f0565b8251600090815b8181101561235e5760006001888684602081106121d1576121d161500c565b6121de91901a601b615651565b8985815181106121f0576121f061500c565b602002602001015189868151811061220a5761220a61500c565b602002602001015160405160008152602001604052604051612248949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561226a573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b038516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156122cb576122cb613ef6565b60028111156122dc576122dc613ef6565b90525090506001816020015160028111156122f9576122f9613ef6565b1461231757604051636518c33d60e11b815260040160405180910390fd5b8051600160ff9091161b85161561234157604051633d9ef1f160e21b815260040160405180910390fd5b806000015160ff166001901b8517945050508060010190506121b2565b5050505050505050565b81518151604051632cbc26bb60e01b8152608083901b67ffffffffffffffff60801b166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156123e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240991906150f1565b1561247a57801561243857604051637edeb53960e11b81526001600160401b038316600482015260240161079a565b6040516001600160401b03831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b600061248583611678565b60010180546124939061510e565b80601f01602080910402602001604051908101604052809291908181526020018280546124bf9061510e565b801561250c5780601f106124e15761010080835404028352916020019161250c565b820191906000526020600020905b8154815290600101906020018083116124ef57829003601f168201915b5050506020880151519293505050600081900361253b5760405162bf199760e01b815260040160405180910390fd5b8560400151518114612560576040516357e0e08360e01b815260040160405180910390fd5b6000816001600160401b0381111561257a5761257a6139e2565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b50905060005b82811015612747576000886020015182815181106125c9576125c961500c565b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160401b03168160000151604001516001600160401b0316146126405780516040908101519051631c21951160e11b81526001600160401b03909116600482015260240161079a565b866001600160401b03168160000151602001516001600160401b03161461269457805160200151604051636c95f1eb60e01b81526001600160401b03808a166004830152909116602482015260440161079a565b612721817f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f836000015160200151846000015160400151898051906020012060405160200161270694939291909384526001600160401b03928316602085015291166040830152606082015260800190565b60405160208183030381529060405280519060200120613247565b8383815181106127335761273361500c565b6020908102919091010152506001016125a9565b50600061275e86838a606001518b6080015161334f565b90508060000361278c57604051633ee8bd3f60e11b81526001600160401b038716600482015260240161079a565b60005b83811015610a125760005a905060008a6020015183815181106127b4576127b461500c565b6020026020010151905060006127d28a836000015160600151610a86565b905060008160038111156127e8576127e8613ef6565b14806128055750600381600381111561280357612803613ef6565b145b61285b57815160600151604080516001600160401b03808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a1505050612c57565b6060891561293a578b85815181106128755761287561500c565b6020908102919091018101510151600454909150600090600160a01b900463ffffffff166128a388426152f6565b11905080806128c3575060038360038111156128c1576128c1613ef6565b145b6128eb576040516354e7e43160e11b81526001600160401b038d16600482015260240161079a565b8c86815181106128fd576128fd61500c565b602002602001015160000151600014612934578c86815181106129225761292261500c565b60209081029190910101515160808501525b506129a6565b600082600381111561294e5761294e613ef6565b146129a657825160600151604080516001600160401b03808f16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe65120910160405180910390a150505050612c57565b8251608001516001600160401b031615612a7f5760008260038111156129ce576129ce613ef6565b03612a7f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e0e03cae8c85600001516080015186602001516040518463ffffffff1660e01b8152600401612a2f939291906157fd565b6020604051808303816000875af1158015612a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7291906150f1565b612a7f5750505050612c57565b60008d604001518681518110612a9757612a9761500c565b6020026020010151905080518460a001515114612ae157835160600151604051631cfe6d8b60e01b81526001600160401b03808f166004830152909116602482015260440161079a565b612af58c856000015160600151600161338c565b600080612b03868486613431565b91509150612b1a8e8760000151606001518461338c565b8c15612b71576003826003811115612b3457612b34613ef6565b03612b71576000856003811115612b4d57612b4d613ef6565b14612b7157855151604051632b11b8d960e01b815261079a91908390600401615829565b6002826003811115612b8557612b85613ef6565b14612bca576003826003811115612b9e57612b9e613ef6565b14612bca578d866000015160600151836040516349362d1f60e11b815260040161079a93929190615842565b8560000151600001518660000151606001516001600160401b03168f6001600160401b03167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8d8c81518110612c2257612c2261500c565b602002602001015186865a612c37908f6152f6565b604051612c479493929190615867565b60405180910390a4505050505050505b60010161278f565b6040805180820190915260008082526020820152602086015160405163bbe4f6db60e01b81526001600160a01b0380831660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015612ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d07919061589e565b90506001600160a01b0381161580612d365750612d346001600160a01b03821663aff2afbf60e01b611cdd565b155b15612d5f5760405163ae9b4ce960e01b81526001600160a01b038216600482015260240161079a565b600080612d7788858c6040015163ffffffff166134e5565b915091506000806000612e2a6040518061010001604052808e81526020018c6001600160401b031681526020018d6001600160a01b031681526020018f608001518152602001896001600160a01b031681526020018f6000015181526020018f6060015181526020018b815250604051602401612df491906158bb565b60408051601f198184030181529190526020810180516001600160e01b0316633907753760e01b179052878661138860846135c8565b92509250925082612e50578160405163e1cd550960e01b815260040161079a9190613d0e565b8151602014612e7f578151604051631e3be00960e21b815260206004820152602481019190915260440161079a565b600082806020019051810190612e959190615987565b9050866001600160a01b03168c6001600160a01b031614612f11576000612ec68d8a612ec1868a6152f6565b6134e5565b50905086811080612ee0575081612edd88836152f6565b14155b15612f0f5760405163a966e21f60e01b815260048101839052602481018890526044810182905260640161079a565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b6000612f52826301ffc9a760e01b612f8a565b8015610ad55750612f83827fffffffff00000000000000000000000000000000000000000000000000000000612f8a565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03166301ffc9a760e01b178152825192935060009283928392909183918a617530fa92503d91506000519050828015613015575060208210155b80156130215750600081115b979650505050505050565b60005b8151811015610d655760ff8316600090815260036020526040812083519091908490849081106130615761306161500c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff1916905560010161302f565b60005b8251811015610a805760008382815181106130b5576130b561500c565b60200260200101519050600060028111156130d2576130d2613ef6565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561311157613111613ef6565b14613132576004604051631b3fab5160e11b815260040161079a9190615715565b6001600160a01b0381166131595760405163d6c62c9b60e01b815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561317f5761317f613ef6565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff1916176101008360028111156131dc576131dc613ef6565b021790555090505050806001019050613098565b60ff81166105135760ff8082166000908152600260205260409020600101546201000090041661323357604051631e8ed32560e21b815260040160405180910390fd5b6009805467ffffffffffffffff1916905550565b8151805160608085015190830151608080870151940151604051600095869588956132ab95919490939192916020019485526001600160a01b039390931660208501526001600160401b039182166040850152606084015216608082015260a00190565b604051602081830303815290604052805190602001208560200151805190602001208660400151805190602001208760a001516040516020016132ee9190615a41565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b60008061335d8585856136a2565b6001600160401b038716600090815260086020908152604080832093835292905220549150505b949350505050565b6000600261339b60808561531f565b6001600160401b03166133ae9190615345565b905060006133bc8585611a7f565b9050816133cb600160046152f6565b901b1916818360038111156133e2576133e2613ef6565b6001600160401b03871660009081526007602052604081209190921b9290921791829161341060808861568e565b6001600160401b031681526020810191909152604001600020555050505050565b604051630304c3e160e51b815260009060609030906360987c209061345e90889088908890600401615ad8565b600060405180830381600087803b15801561347857600080fd5b505af1925050508015613489575060015b6134c8573d8080156134b7576040519150601f19603f3d011682016040523d82523d6000602084013e6134bc565b606091505b506003925090506134dd565b50506040805160208101909152600081526002905b935093915050565b60008060008060006135468860405160240161351091906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166370a0823160e01b179052888861138860846135c8565b9250925092508261356c578160405163e1cd550960e01b815260040161079a9190613d0e565b602082511461359b578151604051631e3be00960e21b815260206004820152602481019190915260440161079a565b818060200190518101906135af9190615987565b6135b982886152f6565b94509450505050935093915050565b6000606060008361ffff166001600160401b038111156135ea576135ea6139e2565b6040519080825280601f01601f191660200182016040528015613614576020820181803683370190505b509150863b61362e5763030ed58f60e21b60005260046000fd5b5a8581101561364857632be8ca8b60e21b60005260046000fd5b8590036040810481038710613668576337c3be2960e01b60005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d8481111561368b5750835b808352806000602085013e50955095509592505050565b82518251600091908183036136ca57604051630469ac9960e21b815260040160405180910390fd5b61010182118015906136de57506101018111155b6136fb576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613725576040516309bde33960e01b815260040160405180910390fd5b8060000361375257866000815181106137405761374061500c565b60200260200101519350505050613920565b6000816001600160401b0381111561376c5761376c6139e2565b604051908082528060200260200182016040528015613795578160200160208202803683370190505b50905060008080805b858110156138bf5760006001821b8b8116036137f957888510156137e2578c5160018601958e9181106137d3576137d361500c565b6020026020010151905061381b565b85516001850194879181106137d3576137d361500c565b8b5160018401938d9181106138105761381061500c565b602002602001015190505b60008986101561384b578d5160018701968f91811061383c5761383c61500c565b6020026020010151905061386d565b86516001860195889181106138625761386261500c565b602002602001015190505b8285111561388e576040516309bde33960e01b815260040160405180910390fd5b6138988282613927565b8784815181106138aa576138aa61500c565b6020908102919091010152505060010161379e565b5060018503821480156138d157508683145b80156138dc57508581145b6138f9576040516309bde33960e01b815260040160405180910390fd5b83600186038151811061390e5761390e61500c565b60200260200101519750505050505050505b9392505050565b600081831061393f5761393a8284613945565b610ad2565b610ad283835b604080516001602082015290810183905260608101829052600090608001613331565b8280548282559060005260206000209081019282156139bd579160200282015b828111156139bd57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613988565b506139c99291506139cd565b5090565b5b808211156139c957600081556001016139ce565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613a1a57613a1a6139e2565b60405290565b60405160a081016001600160401b0381118282101715613a1a57613a1a6139e2565b60405160c081016001600160401b0381118282101715613a1a57613a1a6139e2565b604080519081016001600160401b0381118282101715613a1a57613a1a6139e2565b604051601f8201601f191681016001600160401b0381118282101715613aae57613aae6139e2565b604052919050565b60006001600160401b03821115613acf57613acf6139e2565b5060051b60200190565b6001600160a01b038116811461051357600080fd5b80356001600160401b0381168114613b0557600080fd5b919050565b801515811461051357600080fd5b8035613b0581613b0a565b60006001600160401b03821115613b3c57613b3c6139e2565b50601f01601f191660200190565b600082601f830112613b5b57600080fd5b8135613b6e613b6982613b23565b613a86565b818152846020838601011115613b8357600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215613bb357600080fd5b82356001600160401b0380821115613bca57600080fd5b818501915085601f830112613bde57600080fd5b8135613bec613b6982613ab6565b81815260059190911b83018401908481019088831115613c0b57600080fd5b8585015b83811015613cb157803585811115613c275760008081fd5b86016080818c03601f1901811315613c3f5760008081fd5b613c476139f8565b89830135613c5481613ad9565b81526040613c63848201613aee565b8b830152606080850135613c7681613b0a565b83830152928401359289841115613c8f57600091508182fd5b613c9d8f8d86880101613b4a565b908301525085525050918601918601613c0f565b5098975050505050505050565b60005b83811015613cd9578181015183820152602001613cc1565b50506000910152565b60008151808452613cfa816020860160208601613cbe565b601f01601f19169290920160200192915050565b602081526000610ad26020830184613ce2565b8060608101831015610ad557600080fd5b60008083601f840112613d4457600080fd5b5081356001600160401b03811115613d5b57600080fd5b602083019150836020828501011115613d7357600080fd5b9250929050565b60008083601f840112613d8c57600080fd5b5081356001600160401b03811115613da357600080fd5b6020830191508360208260051b8501011115613d7357600080fd5b60008060008060008060008060e0898b031215613dda57600080fd5b613de48a8a613d21565b975060608901356001600160401b0380821115613e0057600080fd5b613e0c8c838d01613d32565b909950975060808b0135915080821115613e2557600080fd5b613e318c838d01613d7a565b909750955060a08b0135915080821115613e4a57600080fd5b50613e578b828c01613d7a565b999c989b50969995989497949560c00135949350505050565b600080600060808486031215613e8557600080fd5b613e8f8585613d21565b925060608401356001600160401b03811115613eaa57600080fd5b613eb686828701613d32565b9497909650939450505050565b60008060408385031215613ed657600080fd5b613edf83613aee565b9150613eed60208401613aee565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110613f1c57613f1c613ef6565b9052565b60208101610ad58284613f0c565b600060a08284031215613f4057600080fd5b613f48613a20565b905081358152613f5a60208301613aee565b6020820152613f6b60408301613aee565b6040820152613f7c60608301613aee565b6060820152613f8d60808301613aee565b608082015292915050565b8035613b0581613ad9565b803563ffffffff81168114613b0557600080fd5b600082601f830112613fc857600080fd5b81356020613fd8613b6983613ab6565b82815260059290921b84018101918181019086841115613ff757600080fd5b8286015b848110156140c75780356001600160401b038082111561401b5760008081fd5b9088019060a0828b03601f19018113156140355760008081fd5b61403d613a20565b878401358381111561404f5760008081fd5b61405d8d8a83880101613b4a565b82525060408085013561406f81613ad9565b828a01526060614080868201613fa3565b8284015260809150818601358581111561409a5760008081fd5b6140a88f8c838a0101613b4a565b9184019190915250919093013590830152508352918301918301613ffb565b509695505050505050565b600061014082840312156140e557600080fd5b6140ed613a42565b90506140f98383613f2e565b815260a08201356001600160401b038082111561411557600080fd5b61412185838601613b4a565b602084015260c084013591508082111561413a57600080fd5b61414685838601613b4a565b604084015261415760e08501613f98565b6060840152610100840135608084015261012084013591508082111561417c57600080fd5b5061418984828501613fb7565b60a08301525092915050565b600082601f8301126141a657600080fd5b813560206141b6613b6983613ab6565b82815260059290921b840181019181810190868411156141d557600080fd5b8286015b848110156140c75780356001600160401b038111156141f85760008081fd5b6142068986838b01016140d2565b8452509183019183016141d9565b600082601f83011261422557600080fd5b81356020614235613b6983613ab6565b82815260059290921b8401810191818101908684111561425457600080fd5b8286015b848110156140c75780356001600160401b038082111561427757600080fd5b818901915089603f83011261428b57600080fd5b8582013561429b613b6982613ab6565b81815260059190911b830160400190878101908c8311156142bb57600080fd5b604085015b838110156142f4578035858111156142d757600080fd5b6142e68f6040838a0101613b4a565b8452509189019189016142c0565b50875250505092840192508301614258565b600082601f83011261431757600080fd5b81356020614327613b6983613ab6565b8083825260208201915060208460051b87010193508684111561434957600080fd5b602086015b848110156140c7578035835291830191830161434e565b600082601f83011261437657600080fd5b81356020614386613b6983613ab6565b82815260059290921b840181019181810190868411156143a557600080fd5b8286015b848110156140c75780356001600160401b03808211156143c95760008081fd5b9088019060a0828b03601f19018113156143e35760008081fd5b6143eb613a20565b6143f6888501613aee565b81526040808501358481111561440c5760008081fd5b61441a8e8b83890101614195565b8a84015250606080860135858111156144335760008081fd5b6144418f8c838a0101614214565b838501525060809150818601358581111561445c5760008081fd5b61446a8f8c838a0101614306565b91840191909152509190930135908301525083529183019183016143a9565b6000806040838503121561449c57600080fd5b6001600160401b03833511156144b157600080fd5b6144be8484358501614365565b91506001600160401b03602084013511156144d857600080fd5b6020830135830184601f8201126144ee57600080fd5b6144fb613b698235613ab6565b81358082526020808301929160051b84010187101561451957600080fd5b602083015b6020843560051b8501018110156146bf576001600160401b038135111561454457600080fd5b87603f82358601011261455657600080fd5b614569613b696020833587010135613ab6565b81358501602081810135808452908301929160059190911b016040018a101561459157600080fd5b604083358701015b83358701602081013560051b016040018110156146af576001600160401b03813511156145c557600080fd5b833587018135016040818d03603f190112156145e057600080fd5b6145e8613a64565b604082013581526001600160401b036060830135111561460757600080fd5b8c605f60608401358401011261461c57600080fd5b6040606083013583010135614633613b6982613ab6565b808282526020820191508f60608460051b606088013588010101111561465857600080fd5b6060808601358601015b60608460051b60608801358801010181101561468f5761468181613fa3565b835260209283019201614662565b508060208501525050508085525050602083019250602081019050614599565b508452506020928301920161451e565b508093505050509250929050565b6000806000806000606086880312156146e557600080fd5b85356001600160401b03808211156146fc57600080fd5b61470889838a016140d2565b9650602088013591508082111561471e57600080fd5b61472a89838a01613d7a565b9096509450604088013591508082111561474357600080fd5b5061475088828901613d7a565b969995985093965092949392505050565b60006060828403121561477357600080fd5b604051606081018181106001600160401b0382111715614795576147956139e2565b60405282356147a381613ad9565b81526147b160208401613fa3565b602082015260408301356147c481613ad9565b60408201529392505050565b6000602082840312156147e257600080fd5b81356001600160401b038111156147f857600080fd5b820160a0818503121561392057600080fd5b803560ff81168114613b0557600080fd5b60006020828403121561482d57600080fd5b610ad28261480a565b60008151808452602080850194506020840160005b838110156148705781516001600160a01b03168752958201959082019060010161484b565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a08401526148ca60e0840182614836565b90506040840151601f198483030160c08501526148e78282614836565b95945050505050565b6000806040838503121561490357600080fd5b61490c83613aee565b946020939093013593505050565b60006020828403121561492c57600080fd5b610ad282613aee565b602081526001600160a01b0382511660208201526020820151151560408201526001600160401b0360408301511660608201526000606083015160808084015261338460a0840182613ce2565b60006020828403121561499457600080fd5b813561392081613ad9565b600082601f8301126149b057600080fd5b813560206149c0613b6983613ab6565b8083825260208201915060208460051b8701019350868411156149e257600080fd5b602086015b848110156140c75780356149fa81613ad9565b83529183019183016149e7565b60006020808385031215614a1a57600080fd5b82356001600160401b0380821115614a3157600080fd5b818501915085601f830112614a4557600080fd5b8135614a53613b6982613ab6565b81815260059190911b83018401908481019088831115614a7257600080fd5b8585015b83811015613cb157803585811115614a8d57600080fd5b860160c0818c03601f19011215614aa45760008081fd5b614aac613a42565b8882013581526040614abf81840161480a565b8a8301526060614ad081850161480a565b8284015260809150614ae3828501613b18565b9083015260a08381013589811115614afb5760008081fd5b614b098f8d8388010161499f565b838501525060c0840135915088821115614b235760008081fd5b614b318e8c8487010161499f565b9083015250845250918601918601614a76565b80356001600160e01b0381168114613b0557600080fd5b600082601f830112614b6c57600080fd5b81356020614b7c613b6983613ab6565b82815260069290921b84018101918181019086841115614b9b57600080fd5b8286015b848110156140c75760408189031215614bb85760008081fd5b614bc0613a64565b614bc982613aee565b8152614bd6858301614b44565b81860152835291830191604001614b9f565b600082601f830112614bf957600080fd5b81356020614c09613b6983613ab6565b82815260059290921b84018101918181019086841115614c2857600080fd5b8286015b848110156140c75780356001600160401b0380821115614c4c5760008081fd5b9088019060a0828b03601f1901811315614c665760008081fd5b614c6e613a20565b614c79888501613aee565b815260408085013584811115614c8f5760008081fd5b614c9d8e8b83890101613b4a565b8a8401525060609350614cb1848601613aee565b908201526080614cc2858201613aee565b93820193909352920135908201528352918301918301614c2c565b600082601f830112614cee57600080fd5b81356020614cfe613b6983613ab6565b82815260069290921b84018101918181019086841115614d1d57600080fd5b8286015b848110156140c75760408189031215614d3a5760008081fd5b614d42613a64565b813581528482013585820152835291830191604001614d21565b60006020808385031215614d6f57600080fd5b82356001600160401b0380821115614d8657600080fd5b9084019060808287031215614d9a57600080fd5b614da26139f8565b823582811115614db157600080fd5b83016040818903811315614dc457600080fd5b614dcc613a64565b823585811115614ddb57600080fd5b8301601f81018b13614dec57600080fd5b8035614dfa613b6982613ab6565b81815260069190911b8201890190898101908d831115614e1957600080fd5b928a01925b82841015614e695785848f031215614e365760008081fd5b614e3e613a64565b8435614e4981613ad9565b8152614e56858d01614b44565b818d0152825292850192908a0190614e1e565b845250505082870135915084821115614e8157600080fd5b614e8d8a838501614b5b565b81880152835250508284013582811115614ea657600080fd5b614eb288828601614be8565b85830152506040830135935081841115614ecb57600080fd5b614ed787858501614cdd565b6040820152606083013560608201528094505050505092915050565b600082825180855260208086019550808260051b84010181860160005b84811015614f8457601f19868403018952815160a06001600160401b03808351168652868301518288880152614f4883880182613ce2565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101614f10565b5090979650505050505050565b6001600160a01b038516815260006020608081840152614fb46080840187614ef3565b83810360408581019190915286518083528388019284019060005b81811015614ff457845180518452860151868401529385019391830191600101614fcf565b50508094505050505082606083015295945050505050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561507957835180516001600160a01b031684528501516001600160e01b0316858401529284019291850191600101615042565b50508583015187820388850152805180835290840192506000918401905b808310156150d257835180516001600160401b031683528501516001600160e01b031685830152928401926001929092019190850190615097565b50979650505050505050565b602081526000610ad26020830184615022565b60006020828403121561510357600080fd5b815161392081613b0a565b600181811c9082168061512257607f821691505b60208210810361514257634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546151568161510e565b6001828116801561516e5760018114615183576151b2565b60ff19841687528215158302870194506151b2565b8760005260208060002060005b858110156151a95781548a820152908401908201615190565b50505082870194505b50929695505050505050565b600081546151cb8161510e565b8085526020600183811680156151e8576001811461520257615230565b60ff1985168884015283151560051b880183019550615230565b866000528260002060005b858110156152285781548a820186015290830190840161520d565b890184019650505b505050505092915050565b60408152600061524e6040830185613ce2565b82810360208401526148e781856151be565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111561529657615296615260565b5092915050565b6040815260006152b06040830185614ef3565b82810360208401526148e78185615022565b6000602082840312156152d457600080fd5b81356001600160401b038111156152ea57600080fd5b61338484828501614365565b81810381811115610ad557610ad5615260565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b038084168061533957615339615309565b92169190910692915050565b8082028115828204841417610ad557610ad5615260565b80518252600060206001600160401b0381840151168185015260408084015160a0604087015261538f60a0870182613ce2565b9050606085015186820360608801526153a88282613ce2565b608087810151898303918a01919091528051808352908601935060009250908501905b808310156150d257835180516001600160a01b03168352860151868301529285019260019290920191908401906153cb565b602081526000610ad2602083018461535c565b608081526000615423608083018761535c565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561546157600080fd5b835161546c81613b0a565b60208501519093506001600160401b0381111561548857600080fd5b8401601f8101861361549957600080fd5b80516154a7613b6982613b23565b8181528760208385010111156154bc57600080fd5b6154cd826020830160208601613cbe565b809450505050604084015190509250925092565b601f821115610d65576000816000526020600020601f850160051c8101602086101561550a5750805b601f850160051c820191505b8181101561552957828155600101615516565b505050505050565b81516001600160401b0381111561554a5761554a6139e2565b61555e81615558845461510e565b846154e1565b602080601f831160018114615593576000841561557b5750858301515b600019600386901b1c1916600185901b178555615529565b600085815260208120601f198616915b828110156155c2578886015182559484019460019091019084016155a3565b50858210156155e05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208152600082546001600160a01b038116602084015260ff8160a01c16151560408401526001600160401b038160a81c16606084015250608080830152610ad260a08301600185016151be565b80820180821115610ad557610ad5615260565b60ff8181168382160190811115610ad557610ad5615260565b8183823760009101908152919050565b828152606082602083013760800192915050565b60006001600160401b03808416806156a8576156a8615309565b92169190910492915050565b6000602082840312156156c657600080fd5b610ad282613fa3565b6000808335601e198436030181126156e657600080fd5b8301803591506001600160401b0382111561570057600080fd5b602001915036819003821315613d7357600080fd5b602081016006831061572957615729613ef6565b91905290565b60ff818116838216029081169081811461529657615296615260565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b818110156157a35784546001600160a01b03168352600194850194928401920161577e565b50508481036060860152865180825290820192508187019060005b818110156157e35782516001600160a01b0316855293830193918301916001016157be565b50505060ff851660808501525090505b9695505050505050565b60006001600160401b038086168352808516602084015250606060408301526148e76060830184613ce2565b8281526040602082015260006133846040830184613ce2565b6001600160401b03848116825283166020820152606081016133846040830184613f0c565b8481526158776020820185613f0c565b60806040820152600061588d6080830185613ce2565b905082606083015295945050505050565b6000602082840312156158b057600080fd5b815161392081613ad9565b60208152600082516101008060208501526158da610120850183613ce2565b915060208501516158f660408601826001600160401b03169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161593060a08601826001600160a01b03169052565b5060a0850151601f19808685030160c087015261594d8483613ce2565b935060c08701519150808685030160e087015261596a8483613ce2565b935060e08701519150808685030183870152506157f38382613ce2565b60006020828403121561599957600080fd5b5051919050565b600082825180855260208086019550808260051b84010181860160005b84811015614f8457601f19868403018952815160a081518186526159e382870182613ce2565b9150506001600160a01b03868301511686860152604063ffffffff8184015116818701525060608083015186830382880152615a1f8382613ce2565b60809485015197909401969096525050988401989250908301906001016159bd565b602081526000610ad260208301846159a0565b60008282518085526020808601955060208260051b8401016020860160005b84811015614f8457601f19868403018952615a8f838351613ce2565b98840198925090830190600101615a73565b60008151808452602080850194506020840160005b8381101561487057815163ffffffff1687529582019590820190600101615ab6565b60608152600084518051606084015260208101516001600160401b0380821660808601528060408401511660a08601528060608401511660c08601528060808401511660e0860152505050602085015161014080610100850152615b406101a0850183613ce2565b91506040870151605f198086850301610120870152615b5f8483613ce2565b935060608901519150615b7c838701836001600160a01b03169052565b608089015161016087015260a0890151925080868503016101808701525050615ba582826159a0565b9150508281036020840152615bba8186615a54565b905082810360408401526157f38185615aa156fea164736f6c6343000818000a",
}
diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/onramp/onramp.go
index fae9793648..bbe9fba709 100644
--- a/core/gethwrappers/ccip/generated/onramp/onramp.go
+++ b/core/gethwrappers/ccip/generated/onramp/onramp.go
@@ -93,13 +93,13 @@ type OnRampDynamicConfig struct {
type OnRampStaticConfig struct {
ChainSelector uint64
- Rmn common.Address
+ RmnRemote common.Address
NonceManager common.Address
TokenAdminRegistry common.Address
}
var OnRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ 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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x6101006040523480156200001257600080fd5b50604051620042393803806200423983398101604081905262000035916200073f565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d81620003e0565b50505062000840565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060608101516001600160a01b0316155b8062000261575080602001515b1562000280576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191620003d591849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b81518110156200051f5760008282815181106200040457620004046200082a565b6020026020010151905060008383815181106200042557620004256200082a565b6020026020010151600001519050806001600160401b03166000036200046a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050620003e3565b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200055e576200055e62000523565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200058f576200058f62000523565b604052919050565b80516001600160401b0381168114620005af57600080fd5b919050565b6001600160a01b0381168114620005ca57600080fd5b50565b600060a08284031215620005e057600080fd5b60405160a081016001600160401b038111828210171562000605576200060562000523565b806040525080915082516200061a81620005b4565b8152602083015180151581146200063057600080fd5b602082015260408301516200064581620005b4565b604082015260608301516200065a81620005b4565b606082015260808301516200066f81620005b4565b6080919091015292915050565b600082601f8301126200068e57600080fd5b815160206001600160401b03821115620006ac57620006ac62000523565b620006bc818360051b0162000564565b82815260069290921b84018101918181019086841115620006dc57600080fd5b8286015b84811015620007345760408189031215620006fb5760008081fd5b6200070562000539565b620007108262000597565b8152848201516200072181620005b4565b81860152835291830191604001620006e0565b509695505050505050565b60008060008385036101408112156200075757600080fd5b60808112156200076657600080fd5b50604051608081016001600160401b0380821183831017156200078d576200078d62000523565b816040526200079c8762000597565b835260208701519150620007b082620005b4565b81602084015260408701519150620007c882620005b4565b81604084015260608701519150620007e082620005b4565b816060840152829550620007f88860808901620005cd565b94506101208701519250808311156200081057600080fd5b505062000820868287016200067c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051613980620008b96000396000818161022c01528181610cfd0152611bd30152600081816101f0015281816115c40152611bac0152600081816101b4015281816106080152611b820152600081816101840152818161114b015281816116e10152611b5e01526139806000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e914610557578063f2fde38b1461056a578063fbca3b741461057d57600080fd5b8063972b4612146104ea578063d77d5ed01461050a57600080fd5b80637437ff9f146103ee57806379ba5097146104985780638da5cb5b146104a05780639041be3d146104be57600080fd5b806327e936f1116101095780633a019940116100ee5780633a0199401461030f57806348a98aa4146103175780636def4ce71461034f57600080fd5b806327e936f1146102e957806334adf494146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e6101493660046127cc565b610590565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b604051610276919061288f565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b6040516102769190612954565b6102db6102d636600461297f565b6105a4565b604051908152602001610276565b61014e6102f73660046129ed565b61075d565b61014e61030a366004612a85565b61076e565b61014e610a8a565b61032a610325366004612afa565b610cb5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b6103b261035d366004612b33565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61048b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102769190612b50565b61014e610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff1661032a565b6104d16104cc366004612b33565b610e67565b60405167ffffffffffffffff9091168152602001610276565b6104fd6104f8366004612b33565b610e90565b6040516102769190612ba9565b61032a610518366004612b33565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db610565366004612c03565b610eb8565b61014e610578366004612c6f565b6117c6565b6104fd61058b366004612b33565b6117d7565b61059861180b565b6105a18161188e565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612c8c565b156106bb576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906107139086908690600401612dbd565b602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612f06565b90505b92915050565b61076561180b565b6105a181611a05565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107de5760055473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a855760008383838181106107fd576107fd612f1f565b905060200281019061080f9190612f4e565b61081890612fff565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909116178155908201515191925090156109d8578160200151156109975760005b826040015151811015610947576000836040015182815181106108b1576108b1612f1f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109305783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b61093d6001840182611c35565b505060010161088c565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161098a9190612ba9565b60405180910390a26109d8565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b60005b826060015151811015610a2457610a1b83606001518281518110610a0157610a01612f1f565b602002602001015183600101611c5790919063ffffffff16565b506001016109db565b5060608201515115610a7b57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610a729190612ba9565b60405180910390a25b50506001016107e1565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f91908101906130b0565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a85576000838281518110610b7b57610b7b612f1f565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612f06565b90508015610cab57610c4373ffffffffffffffffffffffffffffffffffffffff83168583611c79565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610ca291815260200190565b60405180910390a35b5050600101610b5e565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610754919061313f565b60015473ffffffffffffffffffffffffffffffffffffffff163314610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106b2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff80821660009081526006602052604081205490916107579116600161318b565b67ffffffffffffffff8116600090815260066020526040902060609061075790600101611d06565b60025460009074010000000000000000000000000000000000000000900460ff1615610f10576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610fb5576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff161561102657610fd86001820184611d1a565b611026576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016106b2565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611083576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff168015611129576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e506906110f6908a908a90600401612dbd565b600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050505b50604080516101c081019091526000610120820181815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811661014085015289811661016085015284549293928392916101808401918791879161119791166131ac565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187806020019061120b91906131d3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161124f88806131d3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016112ab6080890160608a01612c6f565b73ffffffffffffffffffffffffffffffffffffffff168152602001868152602001600081526020018780604001906112e39190613238565b905067ffffffffffffffff8111156112fd576112fd6126c9565b60405190808252806020026020018201604052801561137657816020015b6113636040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b81526020019060019003908161131b5790505b5090529050600061138a6040880188613238565b808060200260200160405190810160405280939291908181526020016000905b828210156113d6576113c7604083028601368190038101906132a0565b815260200190600101906113aa565b5050505050905060005b6113ed6040890189613238565b90508110156114875761145d82828151811061140b5761140b612f1f565b60209081029190910101518a6114218b806131d3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611d49915050565b836101000151828151811061147457611474612f1f565b60209081029190910101526001016113e0565b50600254600090606090819073ffffffffffffffffffffffffffffffffffffffff1663430d138c8c6114be60808e018e8601612c6f565b8c8e80608001906114cf91906131d3565b8b61010001518b6040518863ffffffff1660e01b81526004016114f897969594939291906133bd565b600060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155b91908101906134ef565b60e08901939093529094509250905082611636576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163191906135e2565b611639565b60005b855167ffffffffffffffff909116608091820152850182905260005b856101000151518110156116ab5781818151811061167557611675612f1f565b6020026020010151866101000151828151811061169457611694612f1f565b602090810291909101015160800152600101611655565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c16606082015230608082015261173b90869060a00160405160208183030381529060405280519060200120612060565b85515284516060015160405167ffffffffffffffff918216918d16907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32906117849089906135ff565b60405180910390a35050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505051519150505b949350505050565b6117ce61180b565b6105a1816121b2565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106b2565b565b60005b8151811015611a015760008282815181106118ae576118ae612f1f565b6020026020010151905060008383815181106118cc576118cc612f1f565b60200260200101516000015190508067ffffffffffffffff1660000361192a576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106b2565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611891565b5050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a415750606081015173ffffffffffffffffffffffffffffffffffffffff16155b80611a4d575080602001515b15611a84576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611c2a918490613757565b60405180910390a150565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122a7565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122f6565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a859084906123f0565b60606000611d13836124fc565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610754565b611d916040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611dcf576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ddf858760000151610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81161580611eaf57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ead9190612c8c565b155b15611f015785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016106b2565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611fa09190613805565b6000604051808303816000875af1158015611fbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612005919081019061387b565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c001516040516020016120de95949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b60405160208183030381529060405280519060200120856060015180519060200120866040015180519060200120876101000151604051602001612122919061390c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff821603612231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546122ee57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610757565b506000610757565b600081815260018301602052604081205480156123df57600061231a60018361391f565b855490915060009061232e9060019061391f565b905080821461239357600086600001828154811061234e5761234e612f1f565b906000526020600020015490508087600001848154811061237157612371612f1f565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123a4576123a4613932565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610757565b6000915050610757565b5092915050565b6000612452826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125589092919063ffffffff16565b805190915015610a8557808060200190518101906124709190612c8c565b610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106b2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561254c57602002820191906000526020600020905b815481526020019060010190808311612538575b50505050509050919050565b60606117be8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161258c9190613961565b60006040518083038185875af1925050503d80600081146125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b50915091506125df878383876125ea565b979650505050505050565b606083156126805782516000036126795773ffffffffffffffffffffffffffffffffffffffff85163b612679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b2565b50816117be565b6117be83838151156126955781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b29190612954565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561271b5761271b6126c9565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612768576127686126c9565b604052919050565b600067ffffffffffffffff82111561278a5761278a6126c9565b5060051b60200190565b67ffffffffffffffff811681146105a157600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105a157600080fd5b600060208083850312156127df57600080fd5b823567ffffffffffffffff8111156127f657600080fd5b8301601f8101851361280757600080fd5b803561281a61281582612770565b612721565b81815260069190911b8201830190838101908783111561283957600080fd5b928401925b828410156125df57604084890312156128575760008081fd5b61285f6126f8565b843561286a81612794565b815284860135612879816127aa565b818701528252604093909301929084019061283e565b60808101610757828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156129015781810151838201526020016128e9565b50506000910152565b600081518084526129228160208601602086016128e6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610754602083018461290a565b600060a0828403121561297957600080fd5b50919050565b6000806040838503121561299257600080fd5b823561299d81612794565b9150602083013567ffffffffffffffff8111156129b957600080fd5b6129c585828601612967565b9150509250929050565b80356129da816127aa565b919050565b80151581146105a157600080fd5b600060a082840312156129ff57600080fd5b60405160a0810181811067ffffffffffffffff82111715612a2257612a226126c9565b6040528235612a30816127aa565b81526020830135612a40816129df565b60208201526040830135612a53816127aa565b60408201526060830135612a66816127aa565b60608201526080830135612a79816127aa565b60808201529392505050565b60008060208385031215612a9857600080fd5b823567ffffffffffffffff80821115612ab057600080fd5b818501915085601f830112612ac457600080fd5b813581811115612ad357600080fd5b8660208260051b8501011115612ae857600080fd5b60209290920196919550909350505050565b60008060408385031215612b0d57600080fd5b8235612b1881612794565b91506020830135612b28816127aa565b809150509250929050565b600060208284031215612b4557600080fd5b8135611d1381612794565b60a08101610757828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b6020808252825182820181905260009190848201906040850190845b81811015612bf757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bc5565b50909695505050505050565b60008060008060808587031215612c1957600080fd5b8435612c2481612794565b9350602085013567ffffffffffffffff811115612c4057600080fd5b612c4c87828801612967565b935050604085013591506060850135612c64816127aa565b939692955090935050565b600060208284031215612c8157600080fd5b8135611d13816127aa565b600060208284031215612c9e57600080fd5b8151611d13816129df565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612cde57600080fd5b830160208101925035905067ffffffffffffffff811115612cfe57600080fd5b803603821315612d0d57600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612db2578135612d80816127aa565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612d6d565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612dde8485612ca9565b60a06040860152612df360e086018284612d14565b915050612e036020860186612ca9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612e39848385612d14565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612e7257600080fd5b60209288019283019235915084821115612e8b57600080fd5b8160061b3603831315612e9d57600080fd5b80878503016080880152612eb2848385612d5d565b9450612ec0606089016129cf565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612eeb6080890189612ca9565b94509250808786030160c088015250506125df838383612d14565b600060208284031215612f1857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612f8257600080fd5b9190910192915050565b600082601f830112612f9d57600080fd5b81356020612fad61281583612770565b8083825260208201915060208460051b870101935086841115612fcf57600080fd5b602086015b84811015612ff4578035612fe7816127aa565b8352918301918301612fd4565b509695505050505050565b60006080823603121561301157600080fd5b6040516080810167ffffffffffffffff8282108183111715613035576130356126c9565b816040528435915061304682612794565b908252602084013590613058826129df565b816020840152604085013591508082111561307257600080fd5b61307e36838701612f8c565b6040840152606085013591508082111561309757600080fd5b506130a436828601612f8c565b60608301525092915050565b600060208083850312156130c357600080fd5b825167ffffffffffffffff8111156130da57600080fd5b8301601f810185136130eb57600080fd5b80516130f961281582612770565b81815260059190911b8201830190838101908783111561311857600080fd5b928401925b828410156125df578351613130816127aa565b8252928401929084019061311d565b60006020828403121561315157600080fd5b8151611d13816127aa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156123e9576123e961315c565b600067ffffffffffffffff8083168181036131c9576131c961315c565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261320857600080fd5b83018035915067ffffffffffffffff82111561322357600080fd5b602001915036819003821315612d0d57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261326d57600080fd5b83018035915067ffffffffffffffff82111561328857600080fd5b6020019150600681901b3603821315612d0d57600080fd5b6000604082840312156132b257600080fd5b6132ba6126f8565b82356132c5816127aa565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b848110156133b0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff82511685528582015181878701526133598287018261290a565b91505060408083015186830382880152613373838261290a565b9250505060608083015181870152506080808301519250858203818701525061339c818361290a565b9a86019a94505050908301906001016132f7565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c0606086015261340760c08601898b612d14565b858103608087015261341981896132da565b86810360a0880152875180825285890192509085019060005b81811015613459578351805187168452870151878401529286019291840191600101613432565b50909e9d5050505050505050505050505050565b600082601f83011261347e57600080fd5b815167ffffffffffffffff811115613498576134986126c9565b6134c960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612721565b8181528460208386010111156134de57600080fd5b6117be8260208301602087016128e6565b6000806000806080858703121561350557600080fd5b84519350602080860151613518816129df565b604087015190945067ffffffffffffffff8082111561353657600080fd5b61354289838a0161346d565b9450606088015191508082111561355857600080fd5b818801915088601f83011261356c57600080fd5b815161357a61281582612770565b81815260059190911b8301840190848101908b83111561359957600080fd5b8585015b838110156135d1578051858111156135b55760008081fd5b6135c38e89838a010161346d565b84525091860191860161359d565b50989b979a50959850505050505050565b6000602082840312156135f457600080fd5b8151611d1381612794565b6020815261365060208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161367960c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e08501526136966101c085018361290a565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101008187860301818801526136d4858461290a565b94506080880151925081878603016101208801526136f2858461290a565b945060a0880151925061371e61014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e088015161018088015287015186850390910183870152905061374d83826132da565b9695505050505050565b61012081016137af828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611d13565b602081526000825160a0602084015261382160c084018261290a565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b60006020828403121561388d57600080fd5b815167ffffffffffffffff808211156138a557600080fd5b90830190604082860312156138b957600080fd5b6138c16126f8565b8251828111156138d057600080fd5b6138dc8782860161346d565b8252506020830151828111156138f157600080fd5b6138fd8782860161346d565b60208301525095945050505050565b60208152600061075460208301846132da565b818103818111156107575761075761315c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612f828184602087016128e656fea164736f6c6343000818000a",
}
diff --git a/core/gethwrappers/ccip/generated/report_codec/report_codec.go b/core/gethwrappers/ccip/generated/report_codec/report_codec.go
index c693335bc4..06a169473b 100644
--- a/core/gethwrappers/ccip/generated/report_codec/report_codec.go
+++ b/core/gethwrappers/ccip/generated/report_codec/report_codec.go
@@ -30,7 +30,7 @@ var (
_ = abi.ConvertType
)
-type IRMNV2Signature struct {
+type IRMNRemoteSignature struct {
R [32]byte
S [32]byte
}
@@ -94,12 +94,12 @@ type InternalTokenPriceUpdate struct {
type OffRampCommitReport struct {
PriceUpdates InternalPriceUpdates
MerkleRoots []InternalMerkleRoot
- RmnSignatures []IRMNV2Signature
+ RmnSignatures []IRMNRemoteSignature
RmnRawVs *big.Int
}
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\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"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.ExecutionReportSingleChain[]\",\"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\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"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.ExecutionReportSingleChain[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
+ 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[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"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.ExecutionReportSingleChain[]\",\"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\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"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.ExecutionReportSingleChain[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
Bin: "0x608060405234801561001057600080fd5b506113e8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636fb349561461003b578063f816ec6014610064575b600080fd5b61004e61004936600461023a565b610084565b60405161005b91906104f7565b60405180910390f35b61007761007236600461023a565b6100a0565b60405161005b919061083c565b60608180602001905181019061009a9190610e85565b92915050565b6040805160c08101825260606080820181815260a08301829052825260208083018290529282018190526000908201528251909161009a9184018101908401611245565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715610136576101366100e4565b60405290565b60405160c0810167ffffffffffffffff81118282101715610136576101366100e4565b6040805190810167ffffffffffffffff81118282101715610136576101366100e4565b6040516080810167ffffffffffffffff81118282101715610136576101366100e4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156101ec576101ec6100e4565b604052919050565b600067ffffffffffffffff82111561020e5761020e6100e4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561024c57600080fd5b813567ffffffffffffffff81111561026357600080fd5b8201601f8101841361027457600080fd5b8035610287610282826101f4565b6101a5565b81815285602083850101111561029c57600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b838110156102d55781810151838201526020016102bd565b50506000910152565b600081518084526102f68160208601602086016102ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b848110156103f4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a08151818652610389828701826102de565b91505073ffffffffffffffffffffffffffffffffffffffff868301511686860152604063ffffffff81840151168187015250606080830151868303828801526103d283826102de565b6080948501519790940196909652505098840198925090830190600101610345565b5090979650505050505050565b6000828251808552602080860195506005818360051b8501018287016000805b868110156104ac577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe088850381018c5283518051808752908801908887019080891b88018a01865b8281101561049557858a83030184526104838286516102de565b948c0194938c01939150600101610469565b509e8a019e97505050938701935050600101610421565b50919998505050505050505050565b60008151808452602080850194506020840160005b838110156104ec578151875295820195908201906001016104d0565b509495945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156106df577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452815160a0860167ffffffffffffffff8083511688528883015160a08a8a015282815180855260c08b01915060c08160051b8c010194508b8301925060005b81811015610688577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408c87030183528351805180518852868f820151168f890152866040820151166040890152866060820151166060890152866080820151166080890152508d81015161014060a089015261060b6101408901826102de565b9050604082015188820360c08a015261062482826102de565b915050606082015161064e60e08a018273ffffffffffffffffffffffffffffffffffffffff169052565b50608082015161010089015260a082015191508781036101208901526106748183610328565b97505050928c0192918c019160010161058b565b5050505050604082015187820360408901526106a48282610401565b915050606082015187820360608901526106be82826104bb565b6080938401519890930197909752509450928501929085019060010161051e565b5092979650505050505050565b60008151808452602080850194506020840160005b838110156104ec578151805167ffffffffffffffff1688528301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168388015260409096019590820190600101610701565b600082825180855260208086019550808260051b84010181860160005b848110156103f4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a067ffffffffffffffff8083511686528683015182888801526107c4838801826102de565b6040858101518416908901526060808601519093169288019290925250608092830151929095019190915250978301979083019060010161076d565b60008151808452602080850194506020840160005b838110156104ec578151805188528301518388015260409096019590820190600101610815565b602080825282516080838301528051604060a08501819052815160e08601819052600094939284019185916101008801905b808410156108cb578451805173ffffffffffffffffffffffffffffffffffffffff1683528701517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168783015293860193600193909301929082019061086e565b50938501518785037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600160c08901529361090581866106ec565b9450505050508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808583030160408601526109468284610750565b92506040860151915080858403016060860152506109648282610800565b915050606084015160808401528091505092915050565b600067ffffffffffffffff821115610995576109956100e4565b5060051b60200190565b805167ffffffffffffffff811681146109b757600080fd5b919050565b600060a082840312156109ce57600080fd5b6109d6610113565b9050815181526109e86020830161099f565b60208201526109f96040830161099f565b6040820152610a0a6060830161099f565b6060820152610a1b6080830161099f565b608082015292915050565b600082601f830112610a3757600080fd5b8151610a45610282826101f4565b818152846020838601011115610a5a57600080fd5b610a6b8260208301602087016102ba565b949350505050565b805173ffffffffffffffffffffffffffffffffffffffff811681146109b757600080fd5b600082601f830112610aa857600080fd5b81516020610ab86102828361097b565b82815260059290921b84018101918181019086841115610ad757600080fd5b8286015b84811015610bd357805167ffffffffffffffff80821115610afc5760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610b355760008081fd5b610b3d610113565b8784015183811115610b4f5760008081fd5b610b5d8d8a83880101610a26565b8252506040610b6d818601610a73565b8983015260608086015163ffffffff81168114610b8a5760008081fd5b808385015250608091508186015185811115610ba65760008081fd5b610bb48f8c838a0101610a26565b9184019190915250919093015190830152508352918301918301610adb565b509695505050505050565b600082601f830112610bef57600080fd5b81516020610bff6102828361097b565b82815260059290921b84018101918181019086841115610c1e57600080fd5b8286015b84811015610bd357805167ffffffffffffffff80821115610c435760008081fd5b8189019150610140807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610c7d5760008081fd5b610c8561013c565b610c918c8986016109bc565b815260c084015183811115610ca65760008081fd5b610cb48d8a83880101610a26565b898301525060e084015183811115610ccc5760008081fd5b610cda8d8a83880101610a26565b604083015250610ced6101008501610a73565b60608201526101208401516080820152908301519082821115610d105760008081fd5b610d1e8c8984870101610a97565b60a08201528652505050918301918301610c22565b600082601f830112610d4457600080fd5b81516020610d546102828361097b565b82815260059290921b84018101918181019086841115610d7357600080fd5b8286015b84811015610bd357805167ffffffffffffffff80821115610d9757600080fd5b818901915089603f830112610dab57600080fd5b85820151610dbb6102828261097b565b81815260059190911b830160400190878101908c831115610ddb57600080fd5b604085015b83811015610e1457805185811115610df757600080fd5b610e068f6040838a0101610a26565b845250918901918901610de0565b50875250505092840192508301610d77565b600082601f830112610e3757600080fd5b81516020610e476102828361097b565b8083825260208201915060208460051b870101935086841115610e6957600080fd5b602086015b84811015610bd35780518352918301918301610e6e565b60006020808385031215610e9857600080fd5b825167ffffffffffffffff80821115610eb057600080fd5b818501915085601f830112610ec457600080fd5b8151610ed26102828261097b565b81815260059190911b83018401908481019088831115610ef157600080fd5b8585015b83811015610feb57805185811115610f0c57600080fd5b860160a0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215610f415760008081fd5b610f49610113565b610f5489830161099f565b815260408083015188811115610f6a5760008081fd5b610f788e8c83870101610bde565b8b8401525060608084015189811115610f915760008081fd5b610f9f8f8d83880101610d33565b8385015250608091508184015189811115610fba5760008081fd5b610fc88f8d83880101610e26565b918401919091525060a09290920151918101919091528352918601918601610ef5565b5098975050505050505050565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146109b757600080fd5b600082601f83011261103557600080fd5b815160206110456102828361097b565b82815260069290921b8401810191818101908684111561106457600080fd5b8286015b84811015610bd357604081890312156110815760008081fd5b61108961015f565b6110928261099f565b815261109f858301610ff8565b81860152835291830191604001611068565b600082601f8301126110c257600080fd5b815160206110d26102828361097b565b82815260059290921b840181019181810190868411156110f157600080fd5b8286015b84811015610bd357805167ffffffffffffffff808211156111165760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d0301121561114f5760008081fd5b611157610113565b61116288850161099f565b8152604080850151848111156111785760008081fd5b6111868e8b83890101610a26565b8a840152506060935061119a84860161099f565b9082015260806111ab85820161099f565b938201939093529201519082015283529183019183016110f5565b600082601f8301126111d757600080fd5b815160206111e76102828361097b565b82815260069290921b8401810191818101908684111561120657600080fd5b8286015b84811015610bd357604081890312156112235760008081fd5b61122b61015f565b81518152848201518582015283529183019160400161120a565b6000602080838503121561125857600080fd5b825167ffffffffffffffff8082111561127057600080fd5b908401906080828703121561128457600080fd5b61128c610182565b82518281111561129b57600080fd5b830160408189038113156112ae57600080fd5b6112b661015f565b8251858111156112c557600080fd5b8301601f81018b136112d657600080fd5b80516112e46102828261097b565b81815260069190911b8201890190898101908d83111561130357600080fd5b928a01925b828410156113515785848f0312156113205760008081fd5b61132861015f565b61133185610a73565b815261133e8c8601610ff8565b818d0152825292850192908a0190611308565b84525050508287015191508482111561136957600080fd5b6113758a838501611024565b8188015283525050828401518281111561138e57600080fd5b61139a888286016110b1565b858301525060408301519350818411156113b357600080fd5b6113bf878585016111c6565b604082015260608301516060820152809450505050509291505056fea164736f6c6343000818000a",
}
diff --git a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go b/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go
index 71ef173042..da84ba9c8c 100644
--- a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go
+++ b/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go
@@ -30,7 +30,7 @@ var (
_ = abi.ConvertType
)
-type IRMNV2Signature struct {
+type IRMNRemoteSignature struct {
R [32]byte
S [32]byte
}
@@ -55,7 +55,7 @@ type RMNRemoteSigner struct {
}
var RMNRemoteMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"localChainSelector\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"AlreadyCursed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateOnchainPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignerOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MinSignersTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"NotCursed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderSignatures\",\"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\":\"minSigners\",\"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\":\"minSigners\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"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\":\"minSigners\",\"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\":\"structIRMNV2.Signature[]\",\"name\":\"signatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rawVs\",\"type\":\"uint256\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"localChainSelector\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"AlreadyCursed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateOnchainPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignerOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MinSignersTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"NotCursed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderSignatures\",\"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\":\"minSigners\",\"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\":\"minSigners\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"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\":\"minSigners\",\"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[]\"},{\"internalType\":\"uint256\",\"name\":\"rawVs\",\"type\":\"uint256\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]",
Bin: "0x60a06040523480156200001157600080fd5b506040516200216a3803806200216a8339810160408190526200003491620001a9565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fe565b505050806001600160401b0316600003620000ec5760405163273e150360e21b815260040160405180910390fd5b6001600160401b0316608052620001db565b336001600160a01b03821603620001585760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bc57600080fd5b81516001600160401b0381168114620001d457600080fd5b9392505050565b608051611f6c620001fe6000396000818161027a0152610acb0152611f6c6000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806379ba509711610097578063d881e09211610066578063d881e09214610257578063eaa83ddd1461026c578063f2fde38b146102a4578063f8bb876e146102b757600080fd5b806379ba5097146102015780638d8741cb146102095780638da5cb5b1461021c5780639a19b3291461024457600080fd5b8063397796f7116100d3578063397796f7146101a557806362eed415146101ad5780636509a954146101c05780636d2d3993146101ee57600080fd5b8063181f5a7714610105578063198f0f77146101575780631add205f1461016c5780632cbc26bb14610182575b600080fd5b6101416040518060400160405280601381526020017f524d4e52656d6f746520312e362e302d6465760000000000000000000000000081525081565b60405161014e91906113b9565b60405180910390f35b61016a6101653660046113cc565b6102ca565b005b610174610676565b60405161014e929190611407565b6101956101903660046114e5565b61076e565b604051901515815260200161014e565b6101956107cb565b61016a6101bb3660046114e5565b610845565b6040517f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf53815260200161014e565b61016a6101fc3660046114e5565b6108b9565b61016a610929565b61016a61021736600461156e565b610a2b565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014e565b61016a6102523660046116f5565b610d7f565b61025f610e7c565b60405161014e9190611792565b60405167ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161014e565b61016a6102b23660046117f8565b610e88565b61016a6102c53660046116f5565b610e9c565b6102d2610f8e565b60015b6102e26020830183611815565b90508110156103b2576102f86020830183611815565b828181106103085761030861187d565b905060400201602001602081019061032091906118cd565b67ffffffffffffffff166103376020840184611815565b610342600185611919565b8181106103515761035161187d565b905060400201602001602081019061036991906118cd565b67ffffffffffffffff16106103aa576040517f4485151700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001016102d5565b506103c06020820182611815565b90506103d260608301604084016118cd565b67ffffffffffffffff161115610414576040517ffba0d9e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003545b80156104a65760086000600361042f600185611919565b8154811061043f5761043f61187d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561049f8161192c565b9050610418565b5060005b6104b76020830183611815565b90508110156105ec57600860006104d16020850185611815565b848181106104e1576104e161187d565b6104f792602060409092020190810191506117f8565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff1615610558576040517f28cae27d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016008600061056b6020860186611815565b8581811061057b5761057b61187d565b61059192602060409092020190810191506117f8565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016104aa565b508060026105fa8282611a1a565b5050600580546000919082906106159063ffffffff16611b55565b91906101000a81548163ffffffff021916908363ffffffff160217905590508063ffffffff167f7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c8360405161066a9190611b78565b60405180910390a25050565b6040805160608082018352600080835260208301919091529181018290526005546040805160608101825260028054825260038054845160208281028201810190965281815263ffffffff9096169592948593818601939092909160009084015b82821015610745576000848152602090819020604080518082019091529084015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900467ffffffffffffffff16818301528252600190920191016106d7565b505050908252506002919091015467ffffffffffffffff16602090910152919491935090915050565b600061077a6006611011565b60000361078957506000919050565b61079460068361101b565b806107c557506107c560067f010000000000000000000000000000010000000000000000000000000000000061101b565b92915050565b60006107d76006611011565b6000036107e45750600090565b61080f60067f010000000000000000000000000000000000000000000000000000000000000061101b565b80610840575061084060067f010000000000000000000000000000010000000000000000000000000000000061101b565b905090565b60408051600180825281830190925260009160208083019080368337019050509050818160008151811061087b5761087b61187d565b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216602092830291909101909101526108b581610e9c565b5050565b6040805160018082528183019092526000916020808301908036833701905050905081816000815181106108ef576108ef61187d565b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216602092830291909101909101526108b581610d7f565b60015473ffffffffffffffffffffffffffffffffffffffff1633146109af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60055463ffffffff16600003610a6d576040517face124bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045467ffffffffffffffff16821015610ab3576040517f59fa4a9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160c08101825246815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020820152309181019190915273ffffffffffffffffffffffffffffffffffffffff8716606082015260025460808201526000907f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf539060a08101610b4f888a611c82565b9052604051610b62929190602001611de2565b60405160208183030381529060405280519060200120905060008060005b85811015610d7357600184610b9a82841b8816601b611f17565b898985818110610bac57610bac61187d565b905060400201600001358a8a86818110610bc857610bc861187d565b9050604002016020013560405160008152602001604052604051610c08949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610c2a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015192505073ffffffffffffffffffffffffffffffffffffffff8216610ca2576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1610610d07576040517fbbe15e7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff16610d66576040517faaaa914100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9091508190600101610b80565b50505050505050505050565b610d87610f8e565b60005b8151811015610e4157610dc0828281518110610da857610da861187d565b6020026020010151600661105990919063ffffffff16565b610e3957818181518110610dd657610dd661187d565b60200260200101516040517f73281fa10000000000000000000000000000000000000000000000000000000081526004016109a691907fffffffffffffffffffffffffffffffff0000000000000000000000000000000091909116815260200190565b600101610d8a565b507f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba181604051610e719190611792565b60405180910390a150565b60606108406006611087565b610e90610f8e565b610e9981611094565b50565b610ea4610f8e565b60005b8151811015610f5e57610edd828281518110610ec557610ec561187d565b6020026020010151600661118990919063ffffffff16565b610f5657818181518110610ef357610ef361187d565b60200260200101516040517f19d5c79b0000000000000000000000000000000000000000000000000000000081526004016109a691907fffffffffffffffffffffffffffffffff0000000000000000000000000000000091909116815260200190565b600101610ea7565b507f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7481604051610e719190611792565b60005473ffffffffffffffffffffffffffffffffffffffff16331461100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109a6565b565b60006107c5825490565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008116600090815260018301602052604081205415155b9392505050565b6000611052837fffffffffffffffffffffffffffffffff0000000000000000000000000000000084166111b7565b60606000611052836112aa565b3373ffffffffffffffffffffffffffffffffffffffff821603611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109a6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611052837fffffffffffffffffffffffffffffffff000000000000000000000000000000008416611306565b600081815260018301602052604081205480156112a05760006111db600183611919565b85549091506000906111ef90600190611919565b905080821461125457600086600001828154811061120f5761120f61187d565b90600052602060002001549050808760000184815481106112325761123261187d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061126557611265611f30565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107c5565b60009150506107c5565b6060816000018054806020026020016040519081016040528092919081815260200182805480156112fa57602002820191906000526020600020905b8154815260200190600101908083116112e6575b50505050509050919050565b600081815260018301602052604081205461134d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107c5565b5060006107c5565b6000815180845260005b8181101561137b5760208185018101518683018201520161135f565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006110526020830184611355565b6000602082840312156113de57600080fd5b813567ffffffffffffffff8111156113f557600080fd5b82016060818503121561105257600080fd5b63ffffffff831681526040602080830182905283518383015283810151606080850152805160a085018190526000939291820190849060c08701905b8083101561148c578351805173ffffffffffffffffffffffffffffffffffffffff16835285015167ffffffffffffffff1685830152928401926001929092019190850190611443565b50604088015167ffffffffffffffff81166080890152945098975050505050505050565b80357fffffffffffffffffffffffffffffffff00000000000000000000000000000000811681146114e057600080fd5b919050565b6000602082840312156114f757600080fd5b611052826114b0565b73ffffffffffffffffffffffffffffffffffffffff81168114610e9957600080fd5b60008083601f84011261153457600080fd5b50813567ffffffffffffffff81111561154c57600080fd5b6020830191508360208260061b850101111561156757600080fd5b9250929050565b6000806000806000806080878903121561158757600080fd5b863561159281611500565b9550602087013567ffffffffffffffff808211156115af57600080fd5b818901915089601f8301126115c357600080fd5b8135818111156115d257600080fd5b8a60208260051b85010111156115e757600080fd5b60208301975080965050604089013591508082111561160557600080fd5b5061161289828a01611522565b979a9699509497949695606090950135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561167c5761167c61162a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156116c9576116c961162a565b604052919050565b600067ffffffffffffffff8211156116eb576116eb61162a565b5060051b60200190565b6000602080838503121561170857600080fd5b823567ffffffffffffffff81111561171f57600080fd5b8301601f8101851361173057600080fd5b803561174361173e826116d1565b611682565b81815260059190911b8201830190838101908783111561176257600080fd5b928401925b8284101561178757611778846114b0565b82529284019290840190611767565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156117ec5783517fffffffffffffffffffffffffffffffff0000000000000000000000000000000016835292840192918401916001016117ae565b50909695505050505050565b60006020828403121561180a57600080fd5b813561105281611500565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261184a57600080fd5b83018035915067ffffffffffffffff82111561186557600080fd5b6020019150600681901b360382131561156757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff81168114610e9957600080fd5b80356114e0816118ac565b6000602082840312156118df57600080fd5b8135611052816118ac565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156107c5576107c56118ea565b60008161193b5761193b6118ea565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600081356107c5816118ac565b813561197981611500565b73ffffffffffffffffffffffffffffffffffffffff811690508154817fffffffffffffffffffffffff0000000000000000000000000000000000000000821617835560208401356119c9816118ac565b7bffffffffffffffff00000000000000000000000000000000000000008160a01b16837fffffffff000000000000000000000000000000000000000000000000000000008416171784555050505050565b81358155600180820160208401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112611a5857600080fd5b8401803567ffffffffffffffff811115611a7157600080fd5b6020820191508060061b3603821315611a8957600080fd5b68010000000000000000811115611aa257611aa261162a565b825481845580821015611ad7576000848152602081208381019083015b80821015611ad35782825590870190611abf565b5050505b50600092835260208320925b81811015611b0757611af5838561196e565b92840192604092909201918401611ae3565b50505050506108b5611b1b60408401611961565b6002830167ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161781555050565b600063ffffffff808316818103611b6e57611b6e6118ea565b6001019392505050565b6000602080835260808301843582850152818501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112611bbd57600080fd5b8501828101903567ffffffffffffffff80821115611bda57600080fd5b8160061b3603831315611bec57600080fd5b6040606060408901528483865260a089019050849550600094505b83851015611c57578535611c1a81611500565b73ffffffffffffffffffffffffffffffffffffffff16815285870135611c3f816118ac565b83168188015294810194600194909401938101611c07565b611c6360408b016118c2565b67ffffffffffffffff811660608b015296509998505050505050505050565b6000611c9061173e846116d1565b80848252602080830192508560051b850136811115611cae57600080fd5b855b81811015611dd657803567ffffffffffffffff80821115611cd15760008081fd5b818901915060a08236031215611ce75760008081fd5b611cef611659565b8235611cfa816118ac565b81528286013582811115611d0e5760008081fd5b8301601f3681830112611d215760008081fd5b813584811115611d3357611d3361162a565b611d62897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08484011601611682565b94508085523689828501011115611d7b57600091508182fd5b808984018a8701376000898287010152505050818682015260409150611da28284016118c2565b8282015260609150611db58284016118c2565b91810191909152608091820135918101919091528552938201938201611cb0565b50919695505050505050565b60006040848352602060408185015261010084018551604086015281860151606067ffffffffffffffff808316606089015260408901519250608073ffffffffffffffffffffffffffffffffffffffff80851660808b015260608b0151945060a081861660a08c015260808c015160c08c015260a08c0151955060c060e08c015286915085518088526101209750878c019250878160051b8d01019750888701965060005b81811015611f04577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee08d8a030184528751868151168a528a810151848c8c0152611ed3858c0182611355565b828e015189168c8f01528983015189168a8d0152918701519a87019a909a5298509689019692890192600101611e87565b50969d9c50505050505050505050505050565b60ff81811683821601908111156107c5576107c56118ea565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
@@ -379,7 +379,7 @@ 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 []IRMNV2Signature, rawVs *big.Int) error {
+func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature, rawVs *big.Int) error {
var out []interface{}
err := _RMNRemote.contract.Call(opts, &out, "verify", offrampAddress, merkleRoots, signatures, rawVs)
@@ -391,11 +391,11 @@ func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, offrampAddress co
}
-func (_RMNRemote *RMNRemoteSession) Verify(offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNV2Signature, rawVs *big.Int) error {
+func (_RMNRemote *RMNRemoteSession) Verify(offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature, rawVs *big.Int) error {
return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offrampAddress, merkleRoots, signatures, rawVs)
}
-func (_RMNRemote *RMNRemoteCallerSession) Verify(offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNV2Signature, rawVs *big.Int) error {
+func (_RMNRemote *RMNRemoteCallerSession) Verify(offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature, rawVs *big.Int) error {
return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offrampAddress, merkleRoots, signatures, rawVs)
}
@@ -1183,7 +1183,7 @@ type RMNRemoteInterface interface {
TypeAndVersion(opts *bind.CallOpts) (string, error)
- Verify(opts *bind.CallOpts, offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNV2Signature, rawVs *big.Int) error
+ Verify(opts *bind.CallOpts, offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature, rawVs *big.Int) error
AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index fa5321b27b..6d9c6b97f5 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
@@ -6,7 +6,7 @@ burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMint
burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 1ed5c299f928529081dc01b7a46db2b5e6728001767863495a7675d8db99a9e2
ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin 2e6fa009821d30a24efdc9f9d14b2269fb9a51cb7d536ea8b2d29d97dd8b591c
ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin 87de30d71a511f936bdeecb01a88a70ad3f323117202ebb17cdbdc84d65a3857
-ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 32916b41e0070cb6853d558bbff06ab367324fa52cac59893065e8f616ff14f0
+ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin f3b3c1df101be295808e6e7698cd9646e95c46a5a1c955459767e8189838c09e
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin 274d87db70b643e00ab0a7e7845bb4b791f3b613bfc87708d33fc5a8369e2a41
commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin f7128dcc2ee6dbcbc976288abcc16970ffb19b59412c5202ef6b259d2007f801
ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
@@ -23,15 +23,15 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo
multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin 0b541232e49727e947dc164eadf35963c66e67576f21baa0ecaa06a8833148ed
multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 04b6b261dd71925670bf4d904aaf7bf08543452009feefb88e07d4c49d12e969
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
-offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 941b18b4e2aef977195fefba514e17c9475667e6f8513b18cabfb07ff90136ce
-onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin fa073de6d76f76917ff45c19afb2901b8a6f20ca0e225f845f36d647505a7cf5
+offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 8d788a8fe2ed337311672a1c832e211a191d3fa4327d9141bc8c0f47bb5e29b4
+onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin cdf282d410d2dc38e47b360d00ab69a262ab240577071a49c2be49aceea5f5fa
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b
price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2
registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 75be86323c227917a9bbc3f799d7ed02f92db546653a36db30ed0ebe64461353
-report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin 7413576693f76bac7c01fbaec4a161d37a1de51b13dcab78455d2c484ed938b1
+report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin 738616a62c24ad4c5b851d174f40a06b51ccbc0bbfc65f04ff9d1c865f0be5bc
rmn_contract: ../../../contracts/solc/v0.8.24/RMN/RMN.abi ../../../contracts/solc/v0.8.24/RMN/RMN.bin 8b45b0fb08631c6b582fd3c0b4052a79cc2b4e091e6286af1ab131bef63661f9
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 515b0b7038284f8970edddf58d23cd1492237206dbe047dcbe045248db07e8a5
+rmn_remote: ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.abi ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.bin 8d7f0e4581acac5c6b42c7cca1c06e699fdcf9dbca782dde153b7d190cdbe9bc
router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 2e4f0a7826c8abb49d882bb49fc5ff20a186dbd3137624b9097ffed903ae4888
self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 8ea5d75dbc3f8afd90d22c4a665a94e02892259cd16520c1c6b4cf0dc80c9148
token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin 942be7d1681ac102e0615bee13f76838ebb0b261697cf1270d2bf82c12e57aeb
From 4db2b213c8fc9fa40eacdf0a7fc7f3eca23119db Mon Sep 17 00:00:00 2001
From: Sishir Giri
Date: Thu, 3 Oct 2024 23:29:22 -0700
Subject: [PATCH 21/32] Chore: Metis change (#1485)
## Motivation
## Solution
---
core/chains/evm/config/toml/defaults/Metis_Mainnet.toml | 2 +-
docs/CONFIG.md | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/core/chains/evm/config/toml/defaults/Metis_Mainnet.toml b/core/chains/evm/config/toml/defaults/Metis_Mainnet.toml
index f057400d01..388b9f00b0 100644
--- a/core/chains/evm/config/toml/defaults/Metis_Mainnet.toml
+++ b/core/chains/evm/config/toml/defaults/Metis_Mainnet.toml
@@ -1,6 +1,6 @@
# Metis is an L2 chain based on Optimism.
ChainID = '1088'
-ChainType = 'metis'
+ChainType = 'optimismBedrock'
# Sequencer offers absolute finality
FinalityDepth = 10
FinalityTagEnabled = true
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 10e2519049..196da084ab 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -4523,7 +4523,7 @@ GasLimit = 5400000
AutoCreateKey = true
BlockBackfillDepth = 10
BlockBackfillSkip = false
-ChainType = 'metis'
+ChainType = 'optimismBedrock'
FinalityDepth = 10
FinalityTagEnabled = true
LogBackfillBatchSize = 1000
From 29f7edf3ce0e9f91cf0293c286640e3a42516bec Mon Sep 17 00:00:00 2001
From: Valerii Kabisov <172247313+valerii-kabisov-cll@users.noreply.github.com>
Date: Fri, 4 Oct 2024 22:58:42 +0900
Subject: [PATCH 22/32] Do not return the error in case if onRamp not
initialized (#1487)
## Motivation
For the exec provider, in some cases, the onRamp reader is not
initialized. For immediate reaction, we need to allow execution without
blocking in cases if onRamp is not initialized. It fails due the issue
when onRampReader is not initialized for execProvider. This fix should
fix this issue. In case the onRamp reader is not initialized, the module
will return 0 values and DAGasEstimator will behave as it worked before
this feature been implemented.
---
.../services/ocr2/plugins/ccip/estimatorconfig/config.go | 3 +--
.../ocr2/plugins/ccip/estimatorconfig/config_test.go | 9 ++++++---
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/core/services/ocr2/plugins/ccip/estimatorconfig/config.go b/core/services/ocr2/plugins/ccip/estimatorconfig/config.go
index 0e66f4fb39..4737bd33e8 100644
--- a/core/services/ocr2/plugins/ccip/estimatorconfig/config.go
+++ b/core/services/ocr2/plugins/ccip/estimatorconfig/config.go
@@ -2,7 +2,6 @@ package estimatorconfig
import (
"context"
- "errors"
"math/big"
"github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
@@ -42,7 +41,7 @@ func (c *FeeEstimatorConfigService) SetOnRampReader(reader ccip.OnRampReader) {
// GetDynamicConfig should be cached in the onRamp reader to avoid unnecessary on-chain calls
func (c *FeeEstimatorConfigService) GetDataAvailabilityConfig(ctx context.Context) (destDataAvailabilityOverheadGas, destGasPerDataAvailabilityByte, destDataAvailabilityMultiplierBps int64, err error) {
if c.onRampReader == nil {
- return 0, 0, 0, errors.New("no OnRampReader has been configured")
+ return 0, 0, 0, nil
}
cfg, err := c.onRampReader.GetDynamicConfig(ctx)
diff --git a/core/services/ocr2/plugins/ccip/estimatorconfig/config_test.go b/core/services/ocr2/plugins/ccip/estimatorconfig/config_test.go
index 0ed7510591..3ecd88ae3b 100644
--- a/core/services/ocr2/plugins/ccip/estimatorconfig/config_test.go
+++ b/core/services/ocr2/plugins/ccip/estimatorconfig/config_test.go
@@ -24,8 +24,11 @@ func TestFeeEstimatorConfigService(t *testing.T) {
var expectedDestDataAvailabilityMultiplierBps int64 = 3
onRampReader := mocks.NewOnRampReader(t)
- _, _, _, err := svc.GetDataAvailabilityConfig(ctx)
- require.Error(t, err)
+ destDataAvailabilityOverheadGas, destGasPerDataAvailabilityByte, destDataAvailabilityMultiplierBps, err := svc.GetDataAvailabilityConfig(ctx)
+ require.NoError(t, err) // if onRampReader not set, return nil error and 0 values
+ require.EqualValues(t, 0, destDataAvailabilityOverheadGas)
+ require.EqualValues(t, 0, destGasPerDataAvailabilityByte)
+ require.EqualValues(t, 0, destDataAvailabilityMultiplierBps)
svc.SetOnRampReader(onRampReader)
onRampReader.On("GetDynamicConfig", ctx).
@@ -35,7 +38,7 @@ func TestFeeEstimatorConfigService(t *testing.T) {
DestDataAvailabilityMultiplierBps: uint16(expectedDestDataAvailabilityMultiplierBps),
}, nil).Once()
- destDataAvailabilityOverheadGas, destGasPerDataAvailabilityByte, destDataAvailabilityMultiplierBps, err := svc.GetDataAvailabilityConfig(ctx)
+ destDataAvailabilityOverheadGas, destGasPerDataAvailabilityByte, destDataAvailabilityMultiplierBps, err = svc.GetDataAvailabilityConfig(ctx)
require.NoError(t, err)
require.Equal(t, expectedDestDataAvailabilityOverheadGas, destDataAvailabilityOverheadGas)
require.Equal(t, expectedDestGasPerDataAvailabilityByte, destGasPerDataAvailabilityByte)
From ace434b861f94a1a4278a82818ed158110c37892 Mon Sep 17 00:00:00 2001
From: Jordan Krage
Date: Fri, 4 Oct 2024 09:57:26 -0500
Subject: [PATCH 23/32] integration-tests: restore original module name; remove
self-replace (#1478)
## Motivation
The module import path for `integration-tests` was split brained
between:
- github.com/smartcontractkit/chainlink/integration-tests
- github.com/smartcontractkit/ccip/integration-tests
And patched with a self-replace:
```
github.com/smartcontractkit/chainlink/integration-tests => ../integration-tests
```
Which was breaking `gomods`
## Solution
This PR removes the replace and restores the original import path, and
re-enables gomods.
---
GNUmakefile | 18 +++++-------------
.../ccip-tests/load/ccip_loadgen.go | 13 ++++++-------
integration-tests/docker/cmd/main.go | 2 +-
integration-tests/go.mod | 4 +---
integration-tests/web/sdk/client/client.go | 4 ++--
5 files changed, 15 insertions(+), 26 deletions(-)
diff --git a/GNUmakefile b/GNUmakefile
index 5804d2c9d4..62af10572d 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -27,12 +27,8 @@ gomod: ## Ensure chainlink's go dependencies are installed.
go mod download
.PHONY: gomodtidy
-gomodtidy: ## Run go mod tidy on all modules.
- go mod tidy
- cd ./core/scripts && go mod tidy
- cd ./integration-tests && go mod tidy
- cd ./integration-tests/load && go mod tidy
- cd ./dashboard-lib && go mod tidy
+gomodtidy: gomods ## Run go mod tidy on all modules.
+ gomods tidy
.PHONY: docs
docs: ## Install and run pkgsite to view Go docs
@@ -93,12 +89,8 @@ abigen: ## Build & install abigen.
./tools/bin/build_abigen
.PHONY: generate
-generate: pnpmdep abigen codecgen mockery protoc ## Execute all go:generate commands.
- go generate -x ./...
- cd ./core/scripts && go generate -x ./...
- cd ./integration-tests && go generate -x ./...
- cd ./integration-tests/load && go generate -x ./...
- cd ./dashboard-lib && go generate -x ./...
+generate: pnpmdep abigen codecgen mockery protoc gomods ## Execute all go:generate commands.
+ gomods -w go generate -x ./...
mockery
.PHONY: rm-mocked
@@ -140,7 +132,7 @@ presubmit: ## Format go files and imports.
.PHONY: gomods
gomods: ## Install gomods
- go install github.com/jmank88/gomods@v0.1.1
+ go install github.com/jmank88/gomods@v0.1.5
.PHONY: mockery
mockery: $(mockery) ## Install mockery.
diff --git a/integration-tests/ccip-tests/load/ccip_loadgen.go b/integration-tests/ccip-tests/load/ccip_loadgen.go
index 89804dbf8a..8a3059feca 100644
--- a/integration-tests/ccip-tests/load/ccip_loadgen.go
+++ b/integration-tests/ccip-tests/load/ccip_loadgen.go
@@ -10,28 +10,27 @@ import (
"testing"
"time"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
-
"github.com/AlekSi/pointer"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/ccip/integration-tests/ccip-tests/contracts"
- chain_selectors "github.com/smartcontractkit/chain-selectors"
"github.com/stretchr/testify/require"
"go.uber.org/atomic"
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
"github.com/smartcontractkit/chainlink-testing-framework/wasp"
"github.com/smartcontractkit/chainlink-common/pkg/config"
+ "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/actions"
+ "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/contracts"
"github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testconfig"
+ "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testreporters"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers"
-
- "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/actions"
- "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testreporters"
)
// CCIPLaneOptimized is a light-weight version of CCIPLane, It only contains elements which are used during load triggering and validation
diff --git a/integration-tests/docker/cmd/main.go b/integration-tests/docker/cmd/main.go
index 2d61904f3e..e10a82d5cc 100644
--- a/integration-tests/docker/cmd/main.go
+++ b/integration-tests/docker/cmd/main.go
@@ -10,7 +10,7 @@ import (
"github.com/spf13/cobra"
"github.com/testcontainers/testcontainers-go"
- "github.com/smartcontractkit/ccip/integration-tests/docker/cmd/internal"
+ "github.com/smartcontractkit/chainlink/integration-tests/docker/cmd/internal"
)
var rootCmd = &cobra.Command{
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index f11f609258..1e949b536e 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -1,4 +1,4 @@
-module github.com/smartcontractkit/ccip/integration-tests
+module github.com/smartcontractkit/chainlink/integration-tests
go 1.22.5
@@ -40,7 +40,6 @@ require (
github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0
github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.2
github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.0
- github.com/smartcontractkit/chainlink/integration-tests v0.0.0-00010101000000-000000000000
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
github.com/spf13/cobra v1.8.1
@@ -528,7 +527,6 @@ replace (
// type func(a Label, b Label) bool of func(a, b Label) bool {…} does not match inferred type func(a Label, b Label) int for func(a E, b E) int
github.com/prometheus/prometheus => github.com/prometheus/prometheus v0.47.2-0.20231010075449-4b9c19fe5510
- github.com/smartcontractkit/chainlink/integration-tests => ../integration-tests
)
exclude github.com/sourcegraph/sourcegraph/lib v0.0.0-20221216004406-749998a2ac74
diff --git a/integration-tests/web/sdk/client/client.go b/integration-tests/web/sdk/client/client.go
index e13a02aa5a..454e18a234 100644
--- a/integration-tests/web/sdk/client/client.go
+++ b/integration-tests/web/sdk/client/client.go
@@ -9,8 +9,8 @@ import (
"github.com/Khan/genqlient/graphql"
- "github.com/smartcontractkit/ccip/integration-tests/web/sdk/client/internal/doer"
- "github.com/smartcontractkit/ccip/integration-tests/web/sdk/internal/generated"
+ "github.com/smartcontractkit/chainlink/integration-tests/web/sdk/client/internal/doer"
+ "github.com/smartcontractkit/chainlink/integration-tests/web/sdk/internal/generated"
)
type Client interface {
From e97914d285676f82e934d55531f6c0843616014e Mon Sep 17 00:00:00 2001
From: Makram
Date: Fri, 4 Oct 2024 23:00:09 +0400
Subject: [PATCH 24/32] contracts/ccip/capability: per (donId, pluginType)
active config indexes (#1488)
---
contracts/gas-snapshots/ccip.gas-snapshot | 30 ++++----
.../src/v0.8/ccip/capability/CCIPHome.sol | 35 ++++-----
.../v0.8/ccip/test/capability/CCIPHome.t.sol | 75 ++++++++++++-------
.../ccip/generated/ccip_home/ccip_home.go | 2 +-
...rapper-dependency-versions-do-not-edit.txt | 2 +-
5 files changed, 84 insertions(+), 60 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 19f3d0f512..7da740eb01 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -59,28 +59,28 @@ CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_
CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 270824)
CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14952)
CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 370980)
-CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 27108)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 27137)
CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 11783)
CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 11038)
-CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 26121)
-CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1412263)
-CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 63866)
-CCIPHome_constructor:test_constructor_success() (gas: 3498390)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 26150)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1436726)
+CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 63878)
+CCIPHome_constructor:test_constructor_success() (gas: 3521034)
CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 9173)
CCIPHome_constructor:test_supportsInterface_success() (gas: 9865)
-CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2735455)
-CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2513909)
+CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2765282)
+CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2539724)
CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 9110)
-CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 21877)
-CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 8796)
-CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 2556754)
+CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23052)
+CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 8818)
+CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5096112)
CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 9068)
-CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 18421)
+CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19128)
CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 8773)
-CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 29506)
-CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 19022)
-CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1385010)
-CCIPHome_setCandidate:test_setCandidate_success() (gas: 1355245)
+CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 30676)
+CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 19051)
+CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1388198)
+CCIPHome_setCandidate:test_setCandidate_success() (gas: 1357740)
CommitStore_constructor:test_Constructor_Success() (gas: 2855567)
CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73954)
CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28739)
diff --git a/contracts/src/v0.8/ccip/capability/CCIPHome.sol b/contracts/src/v0.8/ccip/capability/CCIPHome.sol
index 3f05b59d5b..e387558946 100644
--- a/contracts/src/v0.8/ccip/capability/CCIPHome.sol
+++ b/contracts/src/v0.8/ccip/capability/CCIPHome.sol
@@ -174,9 +174,10 @@ contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration,
s_configs;
/// @notice The total number of configs ever set, used for generating the version of the configs.
+ /// @dev Used to ensure unique digests across all configurations.
uint32 private s_currentVersion = 0;
- /// @notice The index of the active config.
- uint32 private s_activeConfigIndex = 0;
+ /// @notice The index of the active config on a per-don and per-plugin basis.
+ mapping(uint32 donId => mapping(Internal.OCRPluginType pluginType => uint32)) private s_activeConfigIndexes;
/// @notice Constructor for the CCIPHome contract takes in the address of the capabilities registry. This address
/// is the only allowed caller to mutate the configuration through beforeCapabilityConfigSet.
@@ -263,21 +264,21 @@ contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration,
Internal.OCRPluginType pluginType
) public view returns (bytes32 activeConfigDigest, bytes32 candidateConfigDigest) {
return (
- s_configs[donId][pluginType][_getActiveIndex()].configDigest,
- s_configs[donId][pluginType][_getCandidateIndex()].configDigest
+ s_configs[donId][pluginType][_getActiveIndex(donId, pluginType)].configDigest,
+ s_configs[donId][pluginType][_getCandidateIndex(donId, pluginType)].configDigest
);
}
/// @notice Returns the active config digest for for a given key.
/// @param donId The key of the plugin to get the config digests for.
function getActiveDigest(uint32 donId, Internal.OCRPluginType pluginType) public view returns (bytes32) {
- return s_configs[donId][pluginType][_getActiveIndex()].configDigest;
+ return s_configs[donId][pluginType][_getActiveIndex(donId, pluginType)].configDigest;
}
/// @notice Returns the candidate config digest for for a given key.
/// @param donId The key of the plugin to get the config digests for.
function getCandidateDigest(uint32 donId, Internal.OCRPluginType pluginType) public view returns (bytes32) {
- return s_configs[donId][pluginType][_getCandidateIndex()].configDigest;
+ return s_configs[donId][pluginType][_getCandidateIndex(donId, pluginType)].configDigest;
}
/// @notice The offchain code can use this to fetch an old config which might still be in use by some remotes. Use
@@ -310,12 +311,12 @@ contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration,
uint32 donId,
Internal.OCRPluginType pluginType
) external view returns (VersionedConfig memory activeConfig, VersionedConfig memory candidateConfig) {
- VersionedConfig memory storedActiveConfig = s_configs[donId][pluginType][_getActiveIndex()];
+ VersionedConfig memory storedActiveConfig = s_configs[donId][pluginType][_getActiveIndex(donId, pluginType)];
if (storedActiveConfig.configDigest != ZERO_DIGEST) {
activeConfig = storedActiveConfig;
}
- VersionedConfig memory storedCandidateConfig = s_configs[donId][pluginType][_getCandidateIndex()];
+ VersionedConfig memory storedCandidateConfig = s_configs[donId][pluginType][_getCandidateIndex(donId, pluginType)];
if (storedCandidateConfig.configDigest != ZERO_DIGEST) {
candidateConfig = storedCandidateConfig;
}
@@ -353,7 +354,7 @@ contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration,
uint32 newVersion = ++s_currentVersion;
newConfigDigest = _calculateConfigDigest(donId, pluginType, abi.encode(config), newVersion);
- VersionedConfig storage existingConfig = s_configs[donId][pluginType][_getCandidateIndex()];
+ VersionedConfig storage existingConfig = s_configs[donId][pluginType][_getCandidateIndex(donId, pluginType)];
existingConfig.configDigest = newConfigDigest;
existingConfig.version = newVersion;
existingConfig.config = config;
@@ -373,7 +374,7 @@ contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration,
revert RevokingZeroDigestNotAllowed();
}
- uint256 candidateConfigIndex = _getCandidateIndex();
+ uint256 candidateConfigIndex = _getCandidateIndex(donId, pluginType);
if (s_configs[donId][pluginType][candidateConfigIndex].configDigest != configDigest) {
revert ConfigDigestMismatch(s_configs[donId][pluginType][candidateConfigIndex].configDigest, configDigest);
}
@@ -400,19 +401,19 @@ contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration,
revert NoOpStateTransitionNotAllowed();
}
- uint256 candidateConfigIndex = _getCandidateIndex();
+ uint256 candidateConfigIndex = _getCandidateIndex(donId, pluginType);
if (s_configs[donId][pluginType][candidateConfigIndex].configDigest != digestToPromote) {
revert ConfigDigestMismatch(s_configs[donId][pluginType][candidateConfigIndex].configDigest, digestToPromote);
}
- VersionedConfig storage activeConfig = s_configs[donId][pluginType][_getActiveIndex()];
+ VersionedConfig storage activeConfig = s_configs[donId][pluginType][_getActiveIndex(donId, pluginType)];
if (activeConfig.configDigest != digestToRevoke) {
revert ConfigDigestMismatch(activeConfig.configDigest, digestToRevoke);
}
delete activeConfig.configDigest;
- s_activeConfigIndex ^= 1;
+ s_activeConfigIndexes[donId][pluginType] ^= 1;
if (digestToRevoke != ZERO_DIGEST) {
emit ActiveConfigRevoked(digestToRevoke);
}
@@ -444,12 +445,12 @@ contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration,
);
}
- function _getActiveIndex() private view returns (uint32) {
- return s_activeConfigIndex;
+ function _getActiveIndex(uint32 donId, Internal.OCRPluginType pluginType) private view returns (uint32) {
+ return s_activeConfigIndexes[donId][pluginType];
}
- function _getCandidateIndex() private view returns (uint32) {
- return s_activeConfigIndex ^ 1;
+ function _getCandidateIndex(uint32 donId, Internal.OCRPluginType pluginType) private view returns (uint32) {
+ return s_activeConfigIndexes[donId][pluginType] ^ 1;
}
// ================================================================
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol
index 1b91191cc0..f4784b0d0f 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol
@@ -76,7 +76,7 @@ contract CCIPHomeTest is Test {
);
}
- function _getBaseConfig() internal pure returns (CCIPHome.OCR3Config memory) {
+ function _getBaseConfig(Internal.OCRPluginType pluginType) internal pure returns (CCIPHome.OCR3Config memory) {
CCIPHome.OCR3Node[] memory nodes = new CCIPHome.OCR3Node[](4);
for (uint256 i = 0; i < nodes.length; i++) {
nodes[i] = CCIPHome.OCR3Node({
@@ -87,7 +87,7 @@ contract CCIPHomeTest is Test {
}
return CCIPHome.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
+ pluginType: pluginType,
chainSelector: DEFAULT_CHAIN_SELECTOR,
FRoleDON: 1,
offchainConfigVersion: 98765,
@@ -131,8 +131,10 @@ contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTest {
function test_beforeCapabilityConfigSet_success() public {
// first set a config
- bytes memory callData =
- abi.encodeCall(CCIPHome.setCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST));
+ bytes memory callData = abi.encodeCall(
+ CCIPHome.setCandidate,
+ (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST)
+ );
vm.expectCall(address(s_ccipHome), callData);
@@ -149,8 +151,10 @@ contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTest {
s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
// Then set a new config
- callData =
- abi.encodeCall(CCIPHome.setCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST));
+ callData = abi.encodeCall(
+ CCIPHome.setCandidate,
+ (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST)
+ );
vm.expectCall(address(s_ccipHome), callData);
@@ -174,8 +178,10 @@ contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTest {
}
function test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() public {
- bytes memory callData =
- abi.encodeCall(CCIPHome.setCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST));
+ bytes memory callData = abi.encodeCall(
+ CCIPHome.setCandidate,
+ (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST)
+ );
vm.stopPrank();
@@ -194,8 +200,10 @@ contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTest {
function test_beforeCapabilityConfigSet_DONIdMismatch_reverts() public {
uint32 wrongDonId = DEFAULT_DON_ID + 1;
- bytes memory callData =
- abi.encodeCall(CCIPHome.setCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST));
+ bytes memory callData = abi.encodeCall(
+ CCIPHome.setCandidate,
+ (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST)
+ );
vm.expectRevert(abi.encodeWithSelector(CCIPHome.DONIdMismatch.selector, DEFAULT_DON_ID, wrongDonId));
s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, wrongDonId);
@@ -215,7 +223,7 @@ contract CCIPHome_getConfigDigests is CCIPHomeTest {
assertEq(activeDigest, ZERO_DIGEST);
assertEq(candidateDigest, ZERO_DIGEST);
- CCIPHome.OCR3Config memory config = _getBaseConfig();
+ CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit);
bytes32 firstDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
(activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
@@ -241,7 +249,7 @@ contract CCIPHome_getConfigDigests is CCIPHomeTest {
contract CCIPHome_getAllConfigs is CCIPHomeTest {
function test_getAllConfigs_success() public {
- CCIPHome.OCR3Config memory config = _getBaseConfig();
+ CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit);
bytes32 firstDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
(CCIPHome.VersionedConfig memory activeConfig, CCIPHome.VersionedConfig memory candidateConfig) =
@@ -273,7 +281,7 @@ contract CCIPHome_getAllConfigs is CCIPHomeTest {
contract CCIPHome_setCandidate is CCIPHomeTest {
function test_setCandidate_success() public {
- CCIPHome.OCR3Config memory config = _getBaseConfig();
+ CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit);
CCIPHome.VersionedConfig memory versionedConfig =
CCIPHome.VersionedConfig({version: 1, config: config, configDigest: ZERO_DIGEST});
@@ -294,7 +302,7 @@ contract CCIPHome_setCandidate is CCIPHomeTest {
}
function test_setCandidate_ConfigDigestMismatch_reverts() public {
- CCIPHome.OCR3Config memory config = _getBaseConfig();
+ CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit);
bytes32 digest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
@@ -311,7 +319,9 @@ contract CCIPHome_setCandidate is CCIPHomeTest {
vm.stopPrank();
vm.expectRevert(CCIPHome.CanOnlySelfCall.selector);
- s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(), ZERO_DIGEST);
+ s_ccipHome.setCandidate(
+ DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST
+ );
}
}
@@ -319,7 +329,7 @@ contract CCIPHome_revokeCandidate is CCIPHomeTest {
// Sets two configs
function setUp() public virtual override {
super.setUp();
- CCIPHome.OCR3Config memory config = _getBaseConfig();
+ CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit);
bytes32 digest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, digest, ZERO_DIGEST);
@@ -373,23 +383,38 @@ contract CCIPHome_revokeCandidate is CCIPHomeTest {
}
contract CCIPHome_promoteCandidateAndRevokeActive is CCIPHomeTest {
- function test_promoteCandidateAndRevokeActive_success() public {
- CCIPHome.OCR3Config memory config = _getBaseConfig();
- bytes32 firstConfigToPromote = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+ function test_promoteCandidateAndRevokeActive_multiplePlugins_success() public {
+ promoteCandidateAndRevokeActive(Internal.OCRPluginType.Commit);
+ promoteCandidateAndRevokeActive(Internal.OCRPluginType.Execution);
+
+ // check that the two plugins have only active configs and no candidates.
+ (bytes32 activeDigest, bytes32 candidateDigest) =
+ s_ccipHome.getConfigDigests(DEFAULT_DON_ID, Internal.OCRPluginType.Commit);
+ assertTrue(activeDigest != ZERO_DIGEST);
+ assertEq(candidateDigest, ZERO_DIGEST);
+
+ (activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, Internal.OCRPluginType.Execution);
+ assertTrue(activeDigest != ZERO_DIGEST);
+ assertEq(candidateDigest, ZERO_DIGEST);
+ }
+
+ function promoteCandidateAndRevokeActive(Internal.OCRPluginType pluginType) public {
+ CCIPHome.OCR3Config memory config = _getBaseConfig(pluginType);
+ bytes32 firstConfigToPromote = s_ccipHome.setCandidate(DEFAULT_DON_ID, pluginType, config, ZERO_DIGEST);
vm.expectEmit();
emit CCIPHome.ConfigPromoted(firstConfigToPromote);
- s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, firstConfigToPromote, ZERO_DIGEST);
+ s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, pluginType, firstConfigToPromote, ZERO_DIGEST);
// Assert the active digest is updated and the candidate digest is set to zero
- (bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ (bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, pluginType);
assertEq(activeDigest, firstConfigToPromote);
assertEq(candidateDigest, ZERO_DIGEST);
// Set a new candidate to promote over a non-zero active config.
config.offchainConfig = abi.encode("new_offchainConfig_config");
- bytes32 secondConfigToPromote = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
+ bytes32 secondConfigToPromote = s_ccipHome.setCandidate(DEFAULT_DON_ID, pluginType, config, ZERO_DIGEST);
vm.expectEmit();
emit CCIPHome.ActiveConfigRevoked(firstConfigToPromote);
@@ -397,12 +422,10 @@ contract CCIPHome_promoteCandidateAndRevokeActive is CCIPHomeTest {
vm.expectEmit();
emit CCIPHome.ConfigPromoted(secondConfigToPromote);
- s_ccipHome.promoteCandidateAndRevokeActive(
- DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, secondConfigToPromote, firstConfigToPromote
- );
+ s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, pluginType, secondConfigToPromote, firstConfigToPromote);
(CCIPHome.VersionedConfig memory activeConfig, CCIPHome.VersionedConfig memory candidateConfig) =
- s_ccipHome.getAllConfigs(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
+ s_ccipHome.getAllConfigs(DEFAULT_DON_ID, pluginType);
assertEq(activeConfig.configDigest, secondConfigToPromote);
assertEq(candidateConfig.configDigest, ZERO_DIGEST);
assertEq(keccak256(abi.encode(activeConfig.config)), keccak256(abi.encode(config)));
diff --git a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
index 3f1246dbb4..8976868a43 100644
--- a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
+++ b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
@@ -66,7 +66,7 @@ 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\":[{\"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\":[{\"internalType\":\"bytes32\",\"name\":\"currentActiveDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"currentCandidateDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"proposedActiveDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"proposedCandidateDigest\",\"type\":\"bytes32\"}],\"name\":\"InvalidStateTransition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoOpStateTransitionNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[],\"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\":\"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: "0x60a0604052600680546001600160401b03191690553480156200002157600080fd5b5060405162004eb738038062004eb78339810160408190526200004491620001b6565b33806000816200009b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000ce57620000ce816200010b565b5050506001600160a01b038116620000f9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001e8565b336001600160a01b03821603620001655760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000092565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001c957600080fd5b81516001600160a01b0381168114620001e157600080fd5b9392505050565b608051614ca56200021260003960008181610180015281816122730152612c880152614ca56000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063b74b235611610081578063f2fde38b11610066578063f2fde38b14610356578063f442c89a14610369578063fba64a7c1461037c57600080fd5b8063b74b235614610323578063bae4e0fa1461034357600080fd5b80638318ed5d116100b25780638318ed5d146102d15780638da5cb5b146102f2578063922ea4061461031057600080fd5b806379ba5097146102c15780637ac0d41e146102c957600080fd5b80633df45a72116101245780635a837f97116101095780635a837f97146102785780635f1edd9c1461028d5780637524051a146102ae57600080fd5b80633df45a721461022f5780634851d5491461025057600080fd5b806301ffc9a714610156578063020330e61461017e578063181f5a77146101c557806333d9704a1461020e575b600080fd5b6101696101643660046130e2565b61038f565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6102016040518060400160405280601281526020017f43434950486f6d6520312e362e302d646576000000000000000000000000000081525081565b6040516101759190613192565b61022161021c3660046131df565b610428565b604051610175929190613437565b61024261023d36600461345b565b610922565b604051610175929190613494565b61026361025e36600461345b565b61123c565b60408051928352602083019190915201610175565b61028b6102863660046134b9565b61134c565b005b6102a061029b36600461345b565b611639565b604051908152602001610175565b61028b6102bc3660046131df565b6116be565b61028b6118ad565b6102a06119aa565b6102016102df3660046134ff565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff166101a0565b6102a061031e36600461345b565b6119bb565b61033661033136600461351c565b611a1d565b60405161017591906135ac565b6102a061035136600461364a565b611c9e565b61028b6103643660046136ba565b611ea8565b61028b610377366004613735565b611ebc565b61028b61038a3660046137c2565b61225b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea72100000000000000000000000000000000000000000000000000000000148061042257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610430612f6b565b6000805b60028110156109145763ffffffff86166000908152600560205260408120859187600181111561046657610466613220565b600181111561047757610477613220565b815260200190815260200160002082600281106104965761049661387f565b60070201600101541480156104aa57508315155b1561090c5763ffffffff86166000908152600560205260408120908660018111156104d7576104d7613220565b60018111156104e8576104e8613220565b815260200190815260200160002081600281106105075761050761387f565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054939592949386938501929190829060ff168781111561056057610560613220565b600181111561057157610571613220565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916105c9906138ae565b80601f01602080910402602001604051908101604052809291908181526020018280546105f5906138ae565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050815260200160028201805461065b906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610687906138ae565b80156106d45780601f106106a9576101008083540402835291602001916106d4565b820191906000526020600020905b8154815290600101906020018083116106b757829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561086257838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461073f906138ae565b80601f016020809104026020016040519081016040528092919081815260200182805461076b906138ae565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b505050505081526020016002820180546107d1906138ae565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd906138ae565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b50505050508152505081526020019060010190610702565b50505050815260200160048201805461087a906138ae565b80601f01602080910402602001604051908101604052809291908181526020018280546108a6906138ae565b80156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b505050505081525050815250509150925092505061091a565b600101610434565b50600090505b935093915050565b61092a612f6b565b610932612f6b565b63ffffffff841660009081526005602052604081208185600181111561095a5761095a613220565b600181111561096b5761096b613220565b815260200190815260200160002061099160065463ffffffff6401000000009091041690565b63ffffffff16600281106109a7576109a761387f565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff90911690811115610a0257610a02613220565b6001811115610a1357610a13613220565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610a6b906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610a97906138ae565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b50505050508152602001600282018054610afd906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610b29906138ae565b8015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015610d04578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054610be1906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d906138ae565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b50505050508152602001600282018054610c73906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f906138ae565b8015610cec5780601f10610cc157610100808354040283529160200191610cec565b820191906000526020600020905b815481529060010190602001808311610ccf57829003601f168201915b50505050508152505081526020019060010190610ba4565b505050508152602001600482018054610d1c906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610d48906138ae565b8015610d955780601f10610d6a57610100808354040283529160200191610d95565b820191906000526020600020905b815481529060010190602001808311610d7857829003601f168201915b50505091909252505050905250602081015190915015610db3578092505b63ffffffff8516600090815260056020526040812081866001811115610ddb57610ddb613220565b6001811115610dec57610dec613220565b81526020810191909152604001600020600654640100000000900463ffffffff1660011863ffffffff1660028110610e2657610e2661387f565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff90911690811115610e8157610e81613220565b6001811115610e9257610e92613220565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610eea906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610f16906138ae565b8015610f635780601f10610f3857610100808354040283529160200191610f63565b820191906000526020600020905b815481529060010190602001808311610f4657829003601f168201915b50505050508152602001600282018054610f7c906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa8906138ae565b8015610ff55780601f10610fca57610100808354040283529160200191610ff5565b820191906000526020600020905b815481529060010190602001808311610fd857829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015611183578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054611060906138ae565b80601f016020809104026020016040519081016040528092919081815260200182805461108c906138ae565b80156110d95780601f106110ae576101008083540402835291602001916110d9565b820191906000526020600020905b8154815290600101906020018083116110bc57829003601f168201915b505050505081526020016002820180546110f2906138ae565b80601f016020809104026020016040519081016040528092919081815260200182805461111e906138ae565b801561116b5780601f106111405761010080835404028352916020019161116b565b820191906000526020600020905b81548152906001019060200180831161114e57829003601f168201915b50505050508152505081526020019060010190611023565b50505050815260200160048201805461119b906138ae565b80601f01602080910402602001604051908101604052809291908181526020018280546111c7906138ae565b80156112145780601f106111e957610100808354040283529160200191611214565b820191906000526020600020905b8154815290600101906020018083116111f757829003601f168201915b50505091909252505050905250602081015190915015611232578092505b50505b9250929050565b63ffffffff8216600090815260056020526040812081908184600181111561126657611266613220565b600181111561127757611277613220565b815260200190815260200160002061129d60065463ffffffff6401000000009091041690565b63ffffffff16600281106112b3576112b361387f565b6007020160010154600560008663ffffffff1663ffffffff16815260200190815260200160002060008560018111156112ee576112ee613220565b60018111156112ff576112ff613220565b81526020810191909152604001600020600654640100000000900463ffffffff1660011863ffffffff16600281106113395761133961387f565b6007020160010154915091509250929050565b611354612518565b81158015611360575080155b15611397576040517f7b4d1e4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065463ffffffff8581166000908152600560205260408120600164010000000090940483168418909216928592919087908111156113d8576113d8613220565b60018111156113e9576113e9613220565b815260200190815260200160002082600281106114085761140861387f565b6007020160010154146114bc5763ffffffff851660009081526005602052604081209085600181111561143d5761143d613220565b600181111561144e5761144e613220565b8152602001908152602001600020816002811061146d5761146d61387f565b6007020160010154836040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016114b3929190918252602082015260400190565b60405180910390fd5b63ffffffff85166000908152600560205260408120818660018111156114e4576114e4613220565b60018111156114f5576114f5613220565b815260200190815260200160002061151b60065463ffffffff6401000000009091041690565b63ffffffff16600281106115315761153161387f565b600702019050828160010154146115845760018101546040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016114b3565b60006001808301919091556006805463ffffffff6401000000008083048216909418169092027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905582156116065760405183907f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b890600090a25b60405184907ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e90600090a2505050505050565b63ffffffff821660009081526005602052604081208183600181111561166157611661613220565b600181111561167257611672613220565b815260200190815260200160002061169860065463ffffffff6401000000009091041690565b63ffffffff16600281106116ae576116ae61387f565b6007020160010154905092915050565b6116c6612518565b806116fd576040517f0849d8cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065463ffffffff84811660009081526005602052604081206001640100000000909404831684189092169284929190869081111561173e5761173e613220565b600181111561174f5761174f613220565b8152602001908152602001600020826002811061176e5761176e61387f565b6007020160010154146118195763ffffffff84166000908152600560205260408120908460018111156117a3576117a3613220565b60018111156117b4576117b4613220565b815260200190815260200160002081600281106117d3576117d361387f565b6007020160010154826040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016114b3929190918252602082015260400190565b60405182907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a263ffffffff841660009081526005602052604081209084600181111561186c5761186c613220565b600181111561187d5761187d613220565b8152602001908152602001600020816002811061189c5761189c61387f565b600702016001016000905550505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016114b3565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006119b66003612553565b905090565b63ffffffff82166000908152600560205260408120818360018111156119e3576119e3613220565b60018111156119f4576119f4613220565b81526020810191909152604001600020600654640100000000900463ffffffff16600118611698565b60606000611a2b6003612553565b90506000611a398486613930565b9050831580611a485750818110155b15611a88576040805160008082526020820190925290611a7e565b611a6b612fe7565b815260200190600190039081611a635790505b5092505050610422565b6000611a948583613976565b905082811115611aa15750815b6000611aad8383613989565b67ffffffffffffffff811115611ac557611ac5613947565b604051908082528060200260200182016040528015611afe57816020015b611aeb612fe7565b815260200190600190039081611ae35790505b5090506000611b0d600361255d565b9050835b83811015611c91576000828281518110611b2d57611b2d61387f565b60209081029190910181015160408051808201825267ffffffffffffffff831680825260009081526002855282902082518154608081880283018101909552606082018181529597509295860194909391928492849190840182828015611bb357602002820191906000526020600020905b815481526020019060010190808311611b9f575b5050509183525050600182015460ff166020820152600282018054604090920191611bdd906138ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611c09906138ae565b8015611c565780601f10611c2b57610100808354040283529160200191611c56565b820191906000526020600020905b815481529060010190602001808311611c3957829003601f168201915b50505091909252505050905284611c6d8885613989565b81518110611c7d57611c7d61387f565b602090810291909101015250600101611b11565b5090979650505050505050565b6000611ca8612518565b611cb9611cb484613c3f565b612571565b6000611cc586866119bb565b9050828114611d0a576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018490526044016114b3565b8015611d3c5760405183907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a25b60068054600091908290611d559063ffffffff16613d3b565b91906101000a81548163ffffffff021916908363ffffffff16021790559050611d9f878787604051602001611d8a9190614049565b604051602081830303815290604052846129df565b63ffffffff881660009081526005602052604081209194509081886001811115611dcb57611dcb613220565b6001811115611ddc57611ddc613220565b81526020810191909152604001600020600654640100000000900463ffffffff1660011863ffffffff1660028110611e1657611e1661387f565b600702016001810185905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff841617815590508560028201611e60828261456b565b905050837f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c68388604051611e95929190614732565b60405180910390a2505050949350505050565b611eb0612adb565b611eb981612b5c565b50565b611ec4612adb565b60005b838110156120aa57611f0b858583818110611ee457611ee461387f565b9050602002016020810190611ef99190614759565b60039067ffffffffffffffff16612c51565b611f7557848482818110611f2157611f2161387f565b9050602002016020810190611f369190614759565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016114b3565b60026000868684818110611f8b57611f8b61387f565b9050602002016020810190611fa09190614759565b67ffffffffffffffff1681526020810191909152604001600090812090611fc7828261302a565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611fff600283016000613048565b505061203d8585838181106120165761201661387f565b905060200201602081019061202b9190614759565b60039067ffffffffffffffff16612c69565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f08585838181106120715761207161387f565b90506020020160208101906120869190614759565b60405167ffffffffffffffff909116815260200160405180910390a1600101611ec7565b5060005b818110156122545760008383838181106120ca576120ca61387f565b90506020028101906120dc9190614776565b6120ea9060208101906142b0565b6120f3906147aa565b905060008484848181106121095761210961387f565b905060200281019061211b9190614776565b612129906020810190614759565b90506121388260000151612c75565b816020015160ff16600003612179576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff811660009081526002602090815260409091208351805185936121a9928492910190613082565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055604082015160028201906121f6908261487c565b5061221091506003905067ffffffffffffffff8316612dc1565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051612242929190614996565b60405180910390a150506001016120ae565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146122ca576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006122d960048286886149b9565b6122e2916149e3565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa000000000000000000000000000000000000000000000000000000001480159061237857507fffffffff0000000000000000000000000000000000000000000000000000000081167f7524051a0000000000000000000000000000000000000000000000000000000014155b80156123c657507fffffffff0000000000000000000000000000000000000000000000000000000081167f5a837f970000000000000000000000000000000000000000000000000000000014155b15612421576040517f12ba286f0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016114b3565b60006124316024600487896149b9565b81019061243e9190614a2b565b90508263ffffffff16811461248f576040517f8a6e4ce800000000000000000000000000000000000000000000000000000000815263ffffffff8083166004830152841660248201526044016114b3565b6000803073ffffffffffffffffffffffffffffffffffffffff1688886040516124b9929190614a44565b6000604051808303816000865af19150503d80600081146124f6576040519150601f19603f3d011682016040523d82523d6000602084013e6124fb565b606091505b50915091508161250c573d60208201fd5b50505050505050505050565b333014612551576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000610422825490565b6060600061256a83612dcd565b9392505050565b806020015167ffffffffffffffff166000036125b9576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815160018111156125ce576125ce613220565b141580156125ef57506001815160018111156125ec576125ec613220565b14155b15612626576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080810151511580612663575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b1561269a576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a08101515115806126d75750604080516000602082015201604051602081830303815290604052805190602001208160a0015180519060200120145b1561270e576040517fdee9857400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516127299060039067ffffffffffffffff16612c51565b6127715760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016114b3565b60408082015160208084015167ffffffffffffffff1660009081526002909152919091206001015460ff9182169116818111156127e4576040517f2db2204000000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016114b3565b60c083015151610100811115612826576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612831836003613930565b8111612869576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808267ffffffffffffffff81111561288557612885613947565b6040519080825280602002602001820160405280156128ae578160200160208202803683370190505b50905060005b8381101561296e5760008760c0015182815181106128d4576128d461387f565b602002602001015190508060400151516000146128f957836128f581614a54565b9450505b602081015151158061290a57508051155b1561294357806040517f9fa403140000000000000000000000000000000000000000000000000000000081526004016114b39190614a8c565b806000015183838151811061295a5761295a61387f565b6020908102919091010152506001016128b4565b50600061297c856003613930565b612987906001613976565b9050808310156129cd576040517f548dd21f00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016114b3565b6129d682612c75565b50505050505050565b6040516000907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90612a3d907f45564d000000000000000000000000000000000000000000000000000000000090469030908a908a908990602001614a9f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612a7a918690602001614af8565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120167e0a0000000000000000000000000000000000000000000000000000000000001795945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016114b3565b3373ffffffffffffffffffffffffffffffffffffffff821603612bdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016114b3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600183016020526040812054151561256a565b600061256a8383612e29565b60005b8151811015612dbd5760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe848481518110612cd457612cd461387f565b60200260200101516040518263ffffffff1660e01b8152600401612cfa91815260200190565b600060405180830381865afa158015612d17573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612d5d9190810190614b91565b6080015103612db557818181518110612d7857612d7861387f565b60200260200101516040517f8907a4fa0000000000000000000000000000000000000000000000000000000081526004016114b391815260200190565b600101612c78565b5050565b600061256a8383612f1c565b606081600001805480602002602001604051908101604052809291908181526020018280548015612e1d57602002820191906000526020600020905b815481526020019060010190808311612e09575b50505050509050919050565b60008181526001830160205260408120548015612f12576000612e4d600183613989565b8554909150600090612e6190600190613989565b9050808214612ec6576000866000018281548110612e8157612e8161387f565b9060005260206000200154905080876000018481548110612ea457612ea461387f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ed757612ed7614c69565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610422565b6000915050610422565b6000818152600183016020526040812054612f6357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610422565b506000610422565b6040805160608101825260008082526020820152908101612fe26040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b905290565b6040518060400160405280600067ffffffffffffffff168152602001612fe2604051806060016040528060608152602001600060ff168152602001606081525090565b5080546000825590600052602060002090810190611eb991906130cd565b508054613054906138ae565b6000825580601f10613064575050565b601f016020900490600052602060002090810190611eb991906130cd565b8280548282559060005260206000209081019282156130bd579160200282015b828111156130bd5782518255916020019190600101906130a2565b506130c99291506130cd565b5090565b5b808211156130c957600081556001016130ce565b6000602082840312156130f457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461256a57600080fd5b60005b8381101561313f578181015183820152602001613127565b50506000910152565b60008151808452613160816020860160208601613124565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061256a6020830184613148565b63ffffffff81168114611eb957600080fd5b80356131c2816131a5565b919050565b60028110611eb957600080fd5b80356131c2816131c7565b6000806000606084860312156131f457600080fd5b83356131ff816131a5565b9250602084013561320f816131c7565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613286577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8051825260006020820151606060208501526132a96060850182613148565b9050604083015184820360408601526132c28282613148565b95945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015611c91577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301895261332483835161328a565b988401989250908301906001016132ea565b63ffffffff815116825260208101516020830152600060408201516060604085015261336660608501825161324f565b602081015167ffffffffffffffff8116608086015250604081015160ff811660a086015250606081015167ffffffffffffffff811660c08601525060808101516101008060e08701526133bd610160870183613148565b915060a08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08088850301838901526133f88483613148565b935060c08501519250808885030161012089015261341684846132cb565b935060e0850151945080888503016101408901525050506132c28183613148565b60408152600061344a6040830185613336565b905082151560208301529392505050565b6000806040838503121561346e57600080fd5b8235613479816131a5565b91506020830135613489816131c7565b809150509250929050565b6040815260006134a76040830185613336565b82810360208401526132c28185613336565b600080600080608085870312156134cf57600080fd5b84356134da816131a5565b935060208501356134ea816131c7565b93969395505050506040820135916060013590565b60006020828403121561351157600080fd5b813561256a816131a5565b6000806040838503121561352f57600080fd5b50508035926020909101359150565b805160608084528151908401819052600091602091908201906080860190845b8181101561357a5783518352928401929184019160010161355e565b505060ff60208601511660208701526040850151925085810360408701526135a28184613148565b9695505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101561363c578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff1684528701518784018790526136298785018261353e565b95880195935050908601906001016135d5565b509098975050505050505050565b6000806000806080858703121561366057600080fd5b843561366b816131a5565b9350602085013561367b816131c7565b9250604085013567ffffffffffffffff81111561369757600080fd5b850161010081880312156136aa57600080fd5b9396929550929360600135925050565b6000602082840312156136cc57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461256a57600080fd5b60008083601f84011261370257600080fd5b50813567ffffffffffffffff81111561371a57600080fd5b6020830191508360208260051b850101111561123557600080fd5b6000806000806040858703121561374b57600080fd5b843567ffffffffffffffff8082111561376357600080fd5b61376f888389016136f0565b9096509450602087013591508082111561378857600080fd5b50613795878288016136f0565b95989497509550505050565b67ffffffffffffffff81168114611eb957600080fd5b80356131c2816137a1565b600080600080600080608087890312156137db57600080fd5b863567ffffffffffffffff808211156137f357600080fd5b6137ff8a838b016136f0565b9098509650602089013591508082111561381857600080fd5b818901915089601f83011261382c57600080fd5b81358181111561383b57600080fd5b8a602082850101111561384d57600080fd5b602083019650809550505050613865604088016137b7565b9150613873606088016131b7565b90509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c908216806138c257607f821691505b6020821081036138fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761042257610422613901565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8082018082111561042257610422613901565b8181038181111561042257610422613901565b6040516060810167ffffffffffffffff811182821017156139bf576139bf613947565b60405290565b604051610100810167ffffffffffffffff811182821017156139bf576139bf613947565b60405160e0810167ffffffffffffffff811182821017156139bf576139bf613947565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5357613a53613947565b604052919050565b60ff81168114611eb957600080fd5b80356131c281613a5b565b600082601f830112613a8657600080fd5b813567ffffffffffffffff811115613aa057613aa0613947565b613ad160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613a0c565b818152846020838601011115613ae657600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115613b1d57613b1d613947565b5060051b60200190565b600082601f830112613b3857600080fd5b81356020613b4d613b4883613b03565b613a0c565b82815260059290921b84018101918181019086841115613b6c57600080fd5b8286015b84811015613c3457803567ffffffffffffffff80821115613b915760008081fd5b81890191506060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215613bca5760008081fd5b613bd261399c565b87840135815260408085013584811115613bec5760008081fd5b613bfa8e8b83890101613a75565b838b015250918401359183831115613c125760008081fd5b613c208d8a85880101613a75565b908201528652505050918301918301613b70565b509695505050505050565b60006101008236031215613c5257600080fd5b613c5a6139c5565b613c63836131d4565b8152613c71602084016137b7565b6020820152613c8260408401613a6a565b6040820152613c93606084016137b7565b6060820152608083013567ffffffffffffffff80821115613cb357600080fd5b613cbf36838701613a75565b608084015260a0850135915080821115613cd857600080fd5b613ce436838701613a75565b60a084015260c0850135915080821115613cfd57600080fd5b613d0936838701613b27565b60c084015260e0850135915080821115613d2257600080fd5b50613d2f36828601613a75565b60e08301525092915050565b600063ffffffff808316818103613d5457613d54613901565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d9357600080fd5b830160208101925035905067ffffffffffffffff811115613db357600080fd5b80360382131561123557600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e4057600080fd5b830160208101925035905067ffffffffffffffff811115613e6057600080fd5b8060051b360382131561123557600080fd5b60008383855260208086019550808560051b830101846000805b88811015613f4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868503018a5282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1893603018112613eec578283fd5b8801803585526060613f0087830183613d5e565b8289890152613f128389018284613dc2565b925050506040613f2481840184613d5e565b935087830382890152613f38838583613dc2565b9d89019d97505050938601935050600101613e8c565b509198975050505050505050565b6000610100613f7384613f6e856131d4565b61324f565b613f7f602084016137b7565b67ffffffffffffffff166020850152613f9a60408401613a6a565b60ff166040850152613fae606084016137b7565b67ffffffffffffffff166060850152613fca6080840184613d5e565b826080870152613fdd8387018284613dc2565b92505050613fee60a0840184613d5e565b85830360a0870152614001838284613dc2565b9250505061401260c0840184613e0b565b85830360c0870152614025838284613e72565b9250505061403660e0840184613d5e565b85830360e08701526135a2838284613dc2565b60208152600061256a6020830184613f5c565b60008135610422816137a1565b6000813561042281613a5b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140ab57600080fd5b83018035915067ffffffffffffffff8211156140c657600080fd5b60200191503681900382131561123557600080fd5b5b81811015612dbd57600081556001016140dc565b601f82111561412957806000526020600020601f840160051c810160208510156141175750805b612254601f850160051c8301826140db565b505050565b67ffffffffffffffff83111561414657614146613947565b61415a8361415483546138ae565b836140f0565b6000601f8411600181146141ac57600085156141765750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355612254565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156141fb57868501358255602094850194600190920191016141db565b5086821015614236577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261427d57600080fd5b83018035915067ffffffffffffffff82111561429857600080fd5b6020019150600581901b360382131561123557600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126142e457600080fd5b9190910192915050565b6142f881546138ae565b8015612dbd57601f81116001811461431257505060009055565b826000526020600020614330601f840160051c8201600183016140db565b60008085559055505050565b81358155600180820160206143546020860186614076565b67ffffffffffffffff81111561436c5761436c613947565b6143808161437a86546138ae565b866140f0565b6000601f8211600181146143d2576000831561439c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178655614465565b6000868152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841690835b8281101561441e5786850135825593870193908901908701614401565b5084821015614459577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19848701351681555b505060018360011b0186555b505050505050506144796040830183614076565b61448781836002860161412e565b50505050565b680100000000000000008311156144a6576144a6613947565b805483825580841015614525576003816003026003810483146144cb576144cb613901565b856003026003810487146144e1576144e1613901565b6000858152602081209283019291909101905b828210156145205780825561450b600183016142ee565b614517600283016142ee565b908301906144f4565b505050505b5060008181526020812083915b858110156145635761454d61454784876142b0565b8361433c565b6020929092019160039190910190600101614532565b505050505050565b8135614576816131c7565b600281106145ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541660ff82168117835550506146246145ea6020840161405c565b82547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178255565b61466e61463360408401614069565b82547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178255565b6146c061467d6060840161405c565b82547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178255565b6146cd6080830183614076565b6146db81836001860161412e565b50506146ea60a0830183614076565b6146f881836002860161412e565b505061470760c0830183614248565b61471581836003860161448d565b505061472460e0830183614076565b61448781836004860161412e565b63ffffffff831681526040602082015260006147516040830184613f5c565b949350505050565b60006020828403121561476b57600080fd5b813561256a816137a1565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126142e457600080fd5b6000606082360312156147bc57600080fd5b6147c461399c565b823567ffffffffffffffff808211156147dc57600080fd5b9084019036601f8301126147ef57600080fd5b813560206147ff613b4883613b03565b82815260059290921b8401810191818101903684111561481e57600080fd5b948201945b8386101561483c57853582529482019490820190614823565b86525061484a878201613a6a565b9085015250604085013591508082111561486357600080fd5b5061487036828601613a75565b60408301525092915050565b815167ffffffffffffffff81111561489657614896613947565b6148aa816148a484546138ae565b846140f0565b602080601f8311600181146148fd57600084156148c75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614563565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561494a5788860151825594840194600190910190840161492b565b508582101561498657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83168152604060208201526000614751604083018461353e565b600080858511156149c957600080fd5b838611156149d657600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614a235780818660040360031b1b83161692505b505092915050565b600060208284031215614a3d57600080fd5b5035919050565b8183823760009101908152919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a8557614a85613901565b5060010190565b60208152600061256a602083018461328a565b8681526020810186905273ffffffffffffffffffffffffffffffffffffffff8516604082015263ffffffff848116606083015260c0820190614ae4608084018661324f565b80841660a084015250979650505050505050565b60008351614b0a818460208801613124565b835190830190614b1e818360208801613124565b01949350505050565b80516131c2816131a5565b600082601f830112614b4357600080fd5b81516020614b53613b4883613b03565b8083825260208201915060208460051b870101935086841115614b7557600080fd5b602086015b84811015613c345780518352918301918301614b7a565b600060208284031215614ba357600080fd5b815167ffffffffffffffff80821115614bbb57600080fd5b9083019060e08286031215614bcf57600080fd5b614bd76139e9565b614be083614b27565b8152614bee60208401614b27565b6020820152614bff60408401614b27565b6040820152606083015160608201526080830151608082015260a083015182811115614c2a57600080fd5b614c3687828601614b32565b60a08301525060c083015182811115614c4e57600080fd5b614c5a87828601614b32565b60c08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ Bin: "0x60a06040526006805463ffffffff191690553480156200001e57600080fd5b5060405162004f2938038062004f298339810160408190526200004191620001b3565b3380600081620000985760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000cb57620000cb8162000108565b5050506001600160a01b038116620000f6576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001e5565b336001600160a01b03821603620001625760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008f565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001c657600080fd5b81516001600160a01b0381168114620001de57600080fd5b9392505050565b608051614d1a6200020f60003960008181610180015281816122360152612cfd0152614d1a6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063b74b235611610081578063f2fde38b11610066578063f2fde38b14610356578063f442c89a14610369578063fba64a7c1461037c57600080fd5b8063b74b235614610323578063bae4e0fa1461034357600080fd5b80638318ed5d116100b25780638318ed5d146102d15780638da5cb5b146102f2578063922ea4061461031057600080fd5b806379ba5097146102c15780637ac0d41e146102c957600080fd5b80633df45a72116101245780635a837f97116101095780635a837f97146102785780635f1edd9c1461028d5780637524051a146102ae57600080fd5b80633df45a721461022f5780634851d5491461025057600080fd5b806301ffc9a714610156578063020330e61461017e578063181f5a77146101c557806333d9704a1461020e575b600080fd5b610169610164366004613157565b61038f565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6102016040518060400160405280601281526020017f43434950486f6d6520312e362e302d646576000000000000000000000000000081525081565b6040516101759190613207565b61022161021c366004613254565b610428565b6040516101759291906134ac565b61024261023d3660046134d0565b610922565b604051610175929190613509565b61026361025e3660046134d0565b611222565b60408051928352602083019190915201610175565b61028b61028636600461352e565b611318565b005b6102a061029b3660046134d0565b61162b565b604051908152602001610175565b61028b6102bc366004613254565b6116a2565b61028b61188d565b6102a061198a565b6102016102df366004613574565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff166101a0565b6102a061031e3660046134d0565b61199b565b610336610331366004613591565b6119ec565b6040516101759190613621565b6102a06103513660046136bf565b611c6d565b61028b61036436600461372f565b611e6b565b61028b6103773660046137aa565b611e7f565b61028b61038a366004613837565b61221e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea72100000000000000000000000000000000000000000000000000000000148061042257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610430612fe0565b6000805b60028110156109145763ffffffff86166000908152600560205260408120859187600181111561046657610466613295565b600181111561047757610477613295565b81526020019081526020016000208260028110610496576104966138f4565b60070201600101541480156104aa57508315155b1561090c5763ffffffff86166000908152600560205260408120908660018111156104d7576104d7613295565b60018111156104e8576104e8613295565b81526020019081526020016000208160028110610507576105076138f4565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054939592949386938501929190829060ff168781111561056057610560613295565b600181111561057157610571613295565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916105c990613923565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590613923565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050815260200160028201805461065b90613923565b80601f016020809104026020016040519081016040528092919081815260200182805461068790613923565b80156106d45780601f106106a9576101008083540402835291602001916106d4565b820191906000526020600020905b8154815290600101906020018083116106b757829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561086257838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461073f90613923565b80601f016020809104026020016040519081016040528092919081815260200182805461076b90613923565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b505050505081526020016002820180546107d190613923565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd90613923565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b50505050508152505081526020019060010190610702565b50505050815260200160048201805461087a90613923565b80601f01602080910402602001604051908101604052809291908181526020018280546108a690613923565b80156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b505050505081525050815250509150925092505061091a565b600101610434565b50600090505b935093915050565b61092a612fe0565b610932612fe0565b63ffffffff841660009081526005602052604081208185600181111561095a5761095a613295565b600181111561096b5761096b613295565b815260200190815260200160002061098386866124db565b63ffffffff1660028110610999576109996138f4565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff909116908111156109f4576109f4613295565b6001811115610a0557610a05613295565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610a5d90613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8990613923565b8015610ad65780601f10610aab57610100808354040283529160200191610ad6565b820191906000526020600020905b815481529060010190602001808311610ab957829003601f168201915b50505050508152602001600282018054610aef90613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1b90613923565b8015610b685780601f10610b3d57610100808354040283529160200191610b68565b820191906000526020600020905b815481529060010190602001808311610b4b57829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015610cf6578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054610bd390613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610bff90613923565b8015610c4c5780601f10610c2157610100808354040283529160200191610c4c565b820191906000526020600020905b815481529060010190602001808311610c2f57829003601f168201915b50505050508152602001600282018054610c6590613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9190613923565b8015610cde5780601f10610cb357610100808354040283529160200191610cde565b820191906000526020600020905b815481529060010190602001808311610cc157829003601f168201915b50505050508152505081526020019060010190610b96565b505050508152602001600482018054610d0e90613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3a90613923565b8015610d875780601f10610d5c57610100808354040283529160200191610d87565b820191906000526020600020905b815481529060010190602001808311610d6a57829003601f168201915b50505091909252505050905250602081015190915015610da5578092505b63ffffffff8516600090815260056020526040812081866001811115610dcd57610dcd613295565b6001811115610dde57610dde613295565b8152602001908152602001600020610df68787612532565b63ffffffff1660028110610e0c57610e0c6138f4565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff90911690811115610e6757610e67613295565b6001811115610e7857610e78613295565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610ed090613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610efc90613923565b8015610f495780601f10610f1e57610100808354040283529160200191610f49565b820191906000526020600020905b815481529060010190602001808311610f2c57829003601f168201915b50505050508152602001600282018054610f6290613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8e90613923565b8015610fdb5780601f10610fb057610100808354040283529160200191610fdb565b820191906000526020600020905b815481529060010190602001808311610fbe57829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561116957838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461104690613923565b80601f016020809104026020016040519081016040528092919081815260200182805461107290613923565b80156110bf5780601f10611094576101008083540402835291602001916110bf565b820191906000526020600020905b8154815290600101906020018083116110a257829003601f168201915b505050505081526020016002820180546110d890613923565b80601f016020809104026020016040519081016040528092919081815260200182805461110490613923565b80156111515780601f1061112657610100808354040283529160200191611151565b820191906000526020600020905b81548152906001019060200180831161113457829003601f168201915b50505050508152505081526020019060010190611009565b50505050815260200160048201805461118190613923565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad90613923565b80156111fa5780601f106111cf576101008083540402835291602001916111fa565b820191906000526020600020905b8154815290600101906020018083116111dd57829003601f168201915b50505091909252505050905250602081015190915015611218578092505b50505b9250929050565b63ffffffff8216600090815260056020526040812081908184600181111561124c5761124c613295565b600181111561125d5761125d613295565b815260200190815260200160002061127585856124db565b63ffffffff166002811061128b5761128b6138f4565b6007020160010154600560008663ffffffff1663ffffffff16815260200190815260200160002060008560018111156112c6576112c6613295565b60018111156112d7576112d7613295565b81526020019081526020016000206112ef8686612532565b63ffffffff1660028110611305576113056138f4565b6007020160010154915091509250929050565b61132061258d565b8115801561132c575080155b15611363576040517f7b4d1e4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061136f8585612532565b63ffffffff86811660009081526005602052604081209290911692508491908660018111156113a0576113a0613295565b60018111156113b1576113b1613295565b815260200190815260200160002082600281106113d0576113d06138f4565b6007020160010154146114845763ffffffff851660009081526005602052604081209085600181111561140557611405613295565b600181111561141657611416613295565b81526020019081526020016000208160028110611435576114356138f4565b6007020160010154836040517f93df584c00000000000000000000000000000000000000000000000000000000815260040161147b929190918252602082015260400190565b60405180910390fd5b63ffffffff85166000908152600560205260408120818660018111156114ac576114ac613295565b60018111156114bd576114bd613295565b81526020019081526020016000206114d587876124db565b63ffffffff16600281106114eb576114eb6138f4565b6007020190508281600101541461153e5760018101546040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101919091526024810184905260440161147b565b6000600180830182905563ffffffff881682526007602052604082209091878381111561156d5761156d613295565b600181111561157e5761157e613295565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000811663ffffffff918216939093181691909117905582156115f85760405183907f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b890600090a25b60405184907ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e90600090a2505050505050565b63ffffffff821660009081526005602052604081208183600181111561165357611653613295565b600181111561166457611664613295565b815260200190815260200160002061167c84846124db565b63ffffffff1660028110611692576116926138f4565b6007020160010154905092915050565b6116aa61258d565b806116e1576040517f0849d8cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116ed8484612532565b63ffffffff858116600090815260056020526040812092909116925083919085600181111561171e5761171e613295565b600181111561172f5761172f613295565b8152602001908152602001600020826002811061174e5761174e6138f4565b6007020160010154146117f95763ffffffff841660009081526005602052604081209084600181111561178357611783613295565b600181111561179457611794613295565b815260200190815260200160002081600281106117b3576117b36138f4565b6007020160010154826040517f93df584c00000000000000000000000000000000000000000000000000000000815260040161147b929190918252602082015260400190565b60405182907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a263ffffffff841660009081526005602052604081209084600181111561184c5761184c613295565b600181111561185d5761185d613295565b8152602001908152602001600020816002811061187c5761187c6138f4565b600702016001016000905550505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161147b565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600061199660036125c8565b905090565b63ffffffff82166000908152600560205260408120818360018111156119c3576119c3613295565b60018111156119d4576119d4613295565b815260200190815260200160002061167c8484612532565b606060006119fa60036125c8565b90506000611a0884866139a5565b9050831580611a175750818110155b15611a57576040805160008082526020820190925290611a4d565b611a3a61305c565b815260200190600190039081611a325790505b5092505050610422565b6000611a6385836139eb565b905082811115611a705750815b6000611a7c83836139fe565b67ffffffffffffffff811115611a9457611a946139bc565b604051908082528060200260200182016040528015611acd57816020015b611aba61305c565b815260200190600190039081611ab25790505b5090506000611adc60036125d2565b9050835b83811015611c60576000828281518110611afc57611afc6138f4565b60209081029190910181015160408051808201825267ffffffffffffffff831680825260009081526002855282902082518154608081880283018101909552606082018181529597509295860194909391928492849190840182828015611b8257602002820191906000526020600020905b815481526020019060010190808311611b6e575b5050509183525050600182015460ff166020820152600282018054604090920191611bac90613923565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd890613923565b8015611c255780601f10611bfa57610100808354040283529160200191611c25565b820191906000526020600020905b815481529060010190602001808311611c0857829003601f168201915b50505091909252505050905284611c3c88856139fe565b81518110611c4c57611c4c6138f4565b602090810291909101015250600101611ae0565b5090979650505050505050565b6000611c7761258d565b611c88611c8384613cb4565b6125e6565b6000611c94868661199b565b9050828114611cd9576040517f93df584c000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440161147b565b8015611d0b5760405183907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a25b60068054600091908290611d249063ffffffff16613db0565b91906101000a81548163ffffffff021916908363ffffffff16021790559050611d6e878787604051602001611d5991906140be565b60405160208183030381529060405284612a54565b63ffffffff881660009081526005602052604081209194509081886001811115611d9a57611d9a613295565b6001811115611dab57611dab613295565b8152602001908152602001600020611dc38989612532565b63ffffffff1660028110611dd957611dd96138f4565b600702016001810185905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff841617815590508560028201611e2382826145e0565b905050837f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c68388604051611e589291906147a7565b60405180910390a2505050949350505050565b611e73612b50565b611e7c81612bd1565b50565b611e87612b50565b60005b8381101561206d57611ece858583818110611ea757611ea76138f4565b9050602002016020810190611ebc91906147ce565b60039067ffffffffffffffff16612cc6565b611f3857848482818110611ee457611ee46138f4565b9050602002016020810190611ef991906147ce565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161147b565b60026000868684818110611f4e57611f4e6138f4565b9050602002016020810190611f6391906147ce565b67ffffffffffffffff1681526020810191909152604001600090812090611f8a828261309f565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611fc26002830160006130bd565b5050612000858583818110611fd957611fd96138f4565b9050602002016020810190611fee91906147ce565b60039067ffffffffffffffff16612cde565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110612034576120346138f4565b905060200201602081019061204991906147ce565b60405167ffffffffffffffff909116815260200160405180910390a1600101611e8a565b5060005b8181101561221757600083838381811061208d5761208d6138f4565b905060200281019061209f91906147eb565b6120ad906020810190614325565b6120b69061481f565b905060008484848181106120cc576120cc6138f4565b90506020028101906120de91906147eb565b6120ec9060208101906147ce565b90506120fb8260000151612cea565b816020015160ff1660000361213c576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8116600090815260026020908152604090912083518051859361216c9284929101906130f7565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055604082015160028201906121b990826148f1565b506121d391506003905067ffffffffffffffff8316612e36565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051612205929190614a0b565b60405180910390a15050600101612071565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461228d576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061229c6004828688614a2e565b6122a591614a58565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa000000000000000000000000000000000000000000000000000000001480159061233b57507fffffffff0000000000000000000000000000000000000000000000000000000081167f7524051a0000000000000000000000000000000000000000000000000000000014155b801561238957507fffffffff0000000000000000000000000000000000000000000000000000000081167f5a837f970000000000000000000000000000000000000000000000000000000014155b156123e4576040517f12ba286f0000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008216600482015260240161147b565b60006123f4602460048789614a2e565b8101906124019190614aa0565b90508263ffffffff168114612452576040517f8a6e4ce800000000000000000000000000000000000000000000000000000000815263ffffffff80831660048301528416602482015260440161147b565b6000803073ffffffffffffffffffffffffffffffffffffffff16888860405161247c929190614ab9565b6000604051808303816000865af19150503d80600081146124b9576040519150601f19603f3d011682016040523d82523d6000602084013e6124be565b606091505b5091509150816124cf573d60208201fd5b50505050505050505050565b63ffffffff821660009081526007602052604081208183600181111561250357612503613295565b600181111561251457612514613295565b815260208101919091526040016000205463ffffffff169392505050565b63ffffffff821660009081526007602052604081208183600181111561255a5761255a613295565b600181111561256b5761256b613295565b815260208101919091526040016000205463ffffffff16600118905092915050565b3330146125c6576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000610422825490565b606060006125df83612e42565b9392505050565b806020015167ffffffffffffffff1660000361262e576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600181111561264357612643613295565b14158015612664575060018151600181111561266157612661613295565b14155b1561269b576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60808101515115806126d8575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b1561270f576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a081015151158061274c5750604080516000602082015201604051602081830303815290604052805190602001208160a0015180519060200120145b15612783576040517fdee9857400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015161279e9060039067ffffffffffffffff16612cc6565b6127e65760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161147b565b60408082015160208084015167ffffffffffffffff1660009081526002909152919091206001015460ff918216911681811115612859576040517f2db22040000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161147b565b60c08301515161010081111561289b576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a68360036139a5565b81116128de576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808267ffffffffffffffff8111156128fa576128fa6139bc565b604051908082528060200260200182016040528015612923578160200160208202803683370190505b50905060005b838110156129e35760008760c001518281518110612949576129496138f4565b6020026020010151905080604001515160001461296e578361296a81614ac9565b9450505b602081015151158061297f57508051155b156129b857806040517f9fa4031400000000000000000000000000000000000000000000000000000000815260040161147b9190614b01565b80600001518383815181106129cf576129cf6138f4565b602090810291909101015250600101612929565b5060006129f18560036139a5565b6129fc9060016139eb565b905080831015612a42576040517f548dd21f000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161147b565b612a4b82612cea565b50505050505050565b6040516000907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90612ab2907f45564d000000000000000000000000000000000000000000000000000000000090469030908a908a908990602001614b14565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612aef918690602001614b6d565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120167e0a0000000000000000000000000000000000000000000000000000000000001795945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161147b565b3373ffffffffffffffffffffffffffffffffffffffff821603612c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161147b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260018301602052604081205415156125df565b60006125df8383612e9e565b60005b8151811015612e325760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe848481518110612d4957612d496138f4565b60200260200101516040518263ffffffff1660e01b8152600401612d6f91815260200190565b600060405180830381865afa158015612d8c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612dd29190810190614c06565b6080015103612e2a57818181518110612ded57612ded6138f4565b60200260200101516040517f8907a4fa00000000000000000000000000000000000000000000000000000000815260040161147b91815260200190565b600101612ced565b5050565b60006125df8383612f91565b606081600001805480602002602001604051908101604052809291908181526020018280548015612e9257602002820191906000526020600020905b815481526020019060010190808311612e7e575b50505050509050919050565b60008181526001830160205260408120548015612f87576000612ec26001836139fe565b8554909150600090612ed6906001906139fe565b9050808214612f3b576000866000018281548110612ef657612ef66138f4565b9060005260206000200154905080876000018481548110612f1957612f196138f4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612f4c57612f4c614cde565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610422565b6000915050610422565b6000818152600183016020526040812054612fd857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610422565b506000610422565b60408051606081018252600080825260208201529081016130576040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b905290565b6040518060400160405280600067ffffffffffffffff168152602001613057604051806060016040528060608152602001600060ff168152602001606081525090565b5080546000825590600052602060002090810190611e7c9190613142565b5080546130c990613923565b6000825580601f106130d9575050565b601f016020900490600052602060002090810190611e7c9190613142565b828054828255906000526020600020908101928215613132579160200282015b82811115613132578251825591602001919060010190613117565b5061313e929150613142565b5090565b5b8082111561313e5760008155600101613143565b60006020828403121561316957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146125df57600080fd5b60005b838110156131b457818101518382015260200161319c565b50506000910152565b600081518084526131d5816020860160208601613199565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006125df60208301846131bd565b63ffffffff81168114611e7c57600080fd5b80356132378161321a565b919050565b60028110611e7c57600080fd5b80356132378161323c565b60008060006060848603121561326957600080fd5b83356132748161321a565b925060208401356132848161323c565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106132fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b80518252600060208201516060602085015261331e60608501826131bd565b90506040830151848203604086015261333782826131bd565b95945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015611c60577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030189526133998383516132ff565b9884019892509083019060010161335f565b63ffffffff81511682526020810151602083015260006040820151606060408501526133db6060850182516132c4565b602081015167ffffffffffffffff8116608086015250604081015160ff811660a086015250606081015167ffffffffffffffff811660c08601525060808101516101008060e08701526134326101608701836131bd565b915060a08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa080888503018389015261346d84836131bd565b935060c08501519250808885030161012089015261348b8484613340565b935060e08501519450808885030161014089015250505061333781836131bd565b6040815260006134bf60408301856133ab565b905082151560208301529392505050565b600080604083850312156134e357600080fd5b82356134ee8161321a565b915060208301356134fe8161323c565b809150509250929050565b60408152600061351c60408301856133ab565b828103602084015261333781856133ab565b6000806000806080858703121561354457600080fd5b843561354f8161321a565b9350602085013561355f8161323c565b93969395505050506040820135916060013590565b60006020828403121561358657600080fd5b81356125df8161321a565b600080604083850312156135a457600080fd5b50508035926020909101359150565b805160608084528151908401819052600091602091908201906080860190845b818110156135ef578351835292840192918401916001016135d3565b505060ff602086015116602087015260408501519250858103604087015261361781846131bd565b9695505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156136b1578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff16845287015187840187905261369e878501826135b3565b958801959350509086019060010161364a565b509098975050505050505050565b600080600080608085870312156136d557600080fd5b84356136e08161321a565b935060208501356136f08161323c565b9250604085013567ffffffffffffffff81111561370c57600080fd5b8501610100818803121561371f57600080fd5b9396929550929360600135925050565b60006020828403121561374157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146125df57600080fd5b60008083601f84011261377757600080fd5b50813567ffffffffffffffff81111561378f57600080fd5b6020830191508360208260051b850101111561121b57600080fd5b600080600080604085870312156137c057600080fd5b843567ffffffffffffffff808211156137d857600080fd5b6137e488838901613765565b909650945060208701359150808211156137fd57600080fd5b5061380a87828801613765565b95989497509550505050565b67ffffffffffffffff81168114611e7c57600080fd5b803561323781613816565b6000806000806000806080878903121561385057600080fd5b863567ffffffffffffffff8082111561386857600080fd5b6138748a838b01613765565b9098509650602089013591508082111561388d57600080fd5b818901915089601f8301126138a157600080fd5b8135818111156138b057600080fd5b8a60208285010111156138c257600080fd5b6020830196508095505050506138da6040880161382c565b91506138e86060880161322c565b90509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061393757607f821691505b602082108103613970577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761042257610422613976565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8082018082111561042257610422613976565b8181038181111561042257610422613976565b6040516060810167ffffffffffffffff81118282101715613a3457613a346139bc565b60405290565b604051610100810167ffffffffffffffff81118282101715613a3457613a346139bc565b60405160e0810167ffffffffffffffff81118282101715613a3457613a346139bc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613ac857613ac86139bc565b604052919050565b60ff81168114611e7c57600080fd5b803561323781613ad0565b600082601f830112613afb57600080fd5b813567ffffffffffffffff811115613b1557613b156139bc565b613b4660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613a81565b818152846020838601011115613b5b57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115613b9257613b926139bc565b5060051b60200190565b600082601f830112613bad57600080fd5b81356020613bc2613bbd83613b78565b613a81565b82815260059290921b84018101918181019086841115613be157600080fd5b8286015b84811015613ca957803567ffffffffffffffff80821115613c065760008081fd5b81890191506060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215613c3f5760008081fd5b613c47613a11565b87840135815260408085013584811115613c615760008081fd5b613c6f8e8b83890101613aea565b838b015250918401359183831115613c875760008081fd5b613c958d8a85880101613aea565b908201528652505050918301918301613be5565b509695505050505050565b60006101008236031215613cc757600080fd5b613ccf613a3a565b613cd883613249565b8152613ce66020840161382c565b6020820152613cf760408401613adf565b6040820152613d086060840161382c565b6060820152608083013567ffffffffffffffff80821115613d2857600080fd5b613d3436838701613aea565b608084015260a0850135915080821115613d4d57600080fd5b613d5936838701613aea565b60a084015260c0850135915080821115613d7257600080fd5b613d7e36838701613b9c565b60c084015260e0850135915080821115613d9757600080fd5b50613da436828601613aea565b60e08301525092915050565b600063ffffffff808316818103613dc957613dc9613976565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e0857600080fd5b830160208101925035905067ffffffffffffffff811115613e2857600080fd5b80360382131561121b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613eb557600080fd5b830160208101925035905067ffffffffffffffff811115613ed557600080fd5b8060051b360382131561121b57600080fd5b60008383855260208086019550808560051b830101846000805b88811015613fc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868503018a5282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1893603018112613f61578283fd5b8801803585526060613f7587830183613dd3565b8289890152613f878389018284613e37565b925050506040613f9981840184613dd3565b935087830382890152613fad838583613e37565b9d89019d97505050938601935050600101613f01565b509198975050505050505050565b6000610100613fe884613fe385613249565b6132c4565b613ff46020840161382c565b67ffffffffffffffff16602085015261400f60408401613adf565b60ff1660408501526140236060840161382c565b67ffffffffffffffff16606085015261403f6080840184613dd3565b8260808701526140528387018284613e37565b9250505061406360a0840184613dd3565b85830360a0870152614076838284613e37565b9250505061408760c0840184613e80565b85830360c087015261409a838284613ee7565b925050506140ab60e0840184613dd3565b85830360e0870152613617838284613e37565b6020815260006125df6020830184613fd1565b6000813561042281613816565b6000813561042281613ad0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261412057600080fd5b83018035915067ffffffffffffffff82111561413b57600080fd5b60200191503681900382131561121b57600080fd5b5b81811015612e325760008155600101614151565b601f82111561419e57806000526020600020601f840160051c8101602085101561418c5750805b612217601f850160051c830182614150565b505050565b67ffffffffffffffff8311156141bb576141bb6139bc565b6141cf836141c98354613923565b83614165565b6000601f84116001811461422157600085156141eb5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355612217565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156142705786850135825560209485019460019092019101614250565b50868210156142ab577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126142f257600080fd5b83018035915067ffffffffffffffff82111561430d57600080fd5b6020019150600581901b360382131561121b57600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261435957600080fd5b9190910192915050565b61436d8154613923565b8015612e3257601f81116001811461438757505060009055565b8260005260206000206143a5601f840160051c820160018301614150565b60008085559055505050565b81358155600180820160206143c960208601866140eb565b67ffffffffffffffff8111156143e1576143e16139bc565b6143f5816143ef8654613923565b86614165565b6000601f82116001811461444757600083156144115750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b1786556144da565b6000868152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841690835b828110156144935786850135825593870193908901908701614476565b50848210156144ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19848701351681555b505060018360011b0186555b505050505050506144ee60408301836140eb565b6144fc8183600286016141a3565b50505050565b6801000000000000000083111561451b5761451b6139bc565b80548382558084101561459a5760038160030260038104831461454057614540613976565b8560030260038104871461455657614556613976565b6000858152602081209283019291909101905b828210156145955780825561458060018301614363565b61458c60028301614363565b90830190614569565b505050505b5060008181526020812083915b858110156145d8576145c26145bc8487614325565b836143b1565b60209290920191600391909101906001016145a7565b505050505050565b81356145eb8161323c565b60028110614622577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541660ff821681178355505061469961465f602084016140d1565b82547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178255565b6146e36146a8604084016140de565b82547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178255565b6147356146f2606084016140d1565b82547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178255565b61474260808301836140eb565b6147508183600186016141a3565b505061475f60a08301836140eb565b61476d8183600286016141a3565b505061477c60c08301836142bd565b61478a818360038601614502565b505061479960e08301836140eb565b6144fc8183600486016141a3565b63ffffffff831681526040602082015260006147c66040830184613fd1565b949350505050565b6000602082840312156147e057600080fd5b81356125df81613816565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261435957600080fd5b60006060823603121561483157600080fd5b614839613a11565b823567ffffffffffffffff8082111561485157600080fd5b9084019036601f83011261486457600080fd5b81356020614874613bbd83613b78565b82815260059290921b8401810191818101903684111561489357600080fd5b948201945b838610156148b157853582529482019490820190614898565b8652506148bf878201613adf565b908501525060408501359150808211156148d857600080fd5b506148e536828601613aea565b60408301525092915050565b815167ffffffffffffffff81111561490b5761490b6139bc565b61491f816149198454613923565b84614165565b602080601f831160018114614972576000841561493c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556145d8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156149bf578886015182559484019460019091019084016149a0565b50858210156149fb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff831681526040602082015260006147c660408301846135b3565b60008085851115614a3e57600080fd5b83861115614a4b57600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614a985780818660040360031b1b83161692505b505092915050565b600060208284031215614ab257600080fd5b5035919050565b8183823760009101908152919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614afa57614afa613976565b5060010190565b6020815260006125df60208301846132ff565b8681526020810186905273ffffffffffffffffffffffffffffffffffffffff8516604082015263ffffffff848116606083015260c0820190614b5960808401866132c4565b80841660a084015250979650505050505050565b60008351614b7f818460208801613199565b835190830190614b93818360208801613199565b01949350505050565b80516132378161321a565b600082601f830112614bb857600080fd5b81516020614bc8613bbd83613b78565b8083825260208201915060208460051b870101935086841115614bea57600080fd5b602086015b84811015613ca95780518352918301918301614bef565b600060208284031215614c1857600080fd5b815167ffffffffffffffff80821115614c3057600080fd5b9083019060e08286031215614c4457600080fd5b614c4c613a5e565b614c5583614b9c565b8152614c6360208401614b9c565b6020820152614c7460408401614b9c565b6040820152606083015160608201526080830151608082015260a083015182811115614c9f57600080fd5b614cab87828601614ba7565b60a08301525060c083015182811115614cc357600080fd5b614ccf87828601614ba7565b60c08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var CCIPHomeABI = CCIPHomeMetaData.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 6d9c6b97f5..4223fee2fc 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -5,7 +5,7 @@ burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoo
burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6333d0314d0bd29e75ea5e05fe62a4516ade0c6db91c30b6f93645035db52ed8
burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 1ed5c299f928529081dc01b7a46db2b5e6728001767863495a7675d8db99a9e2
ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin 2e6fa009821d30a24efdc9f9d14b2269fb9a51cb7d536ea8b2d29d97dd8b591c
-ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin 87de30d71a511f936bdeecb01a88a70ad3f323117202ebb17cdbdc84d65a3857
+ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin c570b86f8ae7697d3478e70625e06f0f682e75c1f0b7538f4b6f581b0d294b2b
ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin f3b3c1df101be295808e6e7698cd9646e95c46a5a1c955459767e8189838c09e
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin 274d87db70b643e00ab0a7e7845bb4b791f3b613bfc87708d33fc5a8369e2a41
commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin f7128dcc2ee6dbcbc976288abcc16970ffb19b59412c5202ef6b259d2007f801
From 04ad1e80f6c31799c7ff699b50545ef2763bb2b7 Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Mon, 7 Oct 2024 12:02:22 +0200
Subject: [PATCH 25/32] fix typo (#1486)
Closes #1482
---
contracts/src/v0.8/ccip/pools/TokenPool.sol | 2 +-
contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/contracts/src/v0.8/ccip/pools/TokenPool.sol b/contracts/src/v0.8/ccip/pools/TokenPool.sol
index b12a12ca7a..ebd613134a 100644
--- a/contracts/src/v0.8/ccip/pools/TokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/TokenPool.sol
@@ -57,7 +57,7 @@ abstract contract TokenPool is IPoolV1, OwnerIsCreator {
struct ChainUpdate {
uint64 remoteChainSelector; // ──╮ Remote chain selector
bool allowed; // ────────────────╯ Whether the chain should be enabled
- bytes remotePoolAddress; // Address of the remote pool, ABI encoded in the case of a remove EVM chain.
+ bytes remotePoolAddress; // Address of the remote pool, ABI encoded in the case of a remote EVM chain.
bytes remoteTokenAddress; // Address of the remote token, ABI encoded in the case of a remote EVM chain.
RateLimiter.Config outboundRateLimiterConfig; // Outbound rate limited config, meaning the rate limits for all of the onRamps for the given chain
RateLimiter.Config inboundRateLimiterConfig; // Inbound rate limited config, meaning the rate limits for all of the offRamps for the given chain
diff --git a/contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol b/contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol
index 3aaacfe22a..5a1bf5021d 100644
--- a/contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol
@@ -54,7 +54,7 @@ abstract contract MultiTokenPool is IPoolV1, OwnerIsCreator {
struct ChainUpdate {
uint64 remoteChainSelector; // ──╮ Remote chain selector
bool allowed; // ────────────────╯ Whether the chain is allowed
- bytes remotePoolAddress; // Address of the remote pool, ABI encoded in the case of a remove EVM chain.
+ bytes remotePoolAddress; // Address of the remote pool, ABI encoded in the case of a remote EVM chain.
bytes remoteTokenAddress; // Address of the remote token, ABI encoded in the case of a remote EVM chain.
RateLimiter.Config outboundRateLimiterConfig; // Outbound rate limited config, meaning the rate limits for all of the onRamps for the given chain
RateLimiter.Config inboundRateLimiterConfig; // Inbound rate limited config, meaning the rate limits for all of the offRamps for the given chain
From f77ff217862989836e5bc18c74d92543245cf528 Mon Sep 17 00:00:00 2001
From: Suryansh <39276431+0xsuryansh@users.noreply.github.com>
Date: Mon, 7 Oct 2024 17:39:41 +0530
Subject: [PATCH 26/32] feat: add getter to return all source chain config
(#1477)
## Motivation
The current offchain initialization process involves calling
getSourceChainConfig(sourceChainSelector), which retrieves
configurations for a specific source chain selector. However, there's no
mechanism to fetch a complete list of supported source chains during the
initialization phase. This limitation complicates the process, as the
full list of source chain selectors is not readily available.
## Solution
To address this, the proposed solution introduces an enumerable set of
all source chain selectors. By implementing a getAllSourceChainConfig()
function, we can easily retrieve the complete list of source chains
on-chain. This eliminates the need for additional rounds of OCR gossip
to share known source chains, simplifying initialization and improving
efficiency.
---------
Signed-off-by: 0xsuryansh
Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com>
Co-authored-by: Rens Rooimans
---
contracts/gas-snapshots/ccip.gas-snapshot | 228 +++++++++---------
contracts/src/v0.8/ccip/offRamp/OffRamp.sol | 20 ++
.../v0.8/ccip/test/helpers/OffRampHelper.sol | 7 +
.../src/v0.8/ccip/test/offRamp/OffRamp.t.sol | 27 ++-
.../ccip/generated/offramp/offramp.go | 29 ++-
...rapper-dependency-versions-do-not-edit.txt | 2 +-
6 files changed, 186 insertions(+), 127 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 7da740eb01..ec36725f6a 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -562,18 +562,18 @@ MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275)
MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933)
MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049)
MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233701)
-MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501786)
+MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501791)
NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778)
NonceManager_NonceIncrementation:test_incrementNoncesInboundAndOutbound_Success() (gas: 71901)
-NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 262159)
-NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 265836)
-NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 329824)
-NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 300784)
+NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 262171)
+NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 265848)
+NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 329848)
+NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 300818)
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249120)
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237027)
-NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153748)
+NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153760)
NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 169036)
NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 221191)
NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126745)
@@ -610,119 +610,119 @@ OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51689)
OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23511)
OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39707)
OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20584)
-OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5656596)
-OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 469391)
-OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 99637)
-OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12591)
-OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 205322)
-OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 101437)
-OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 111307)
-OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13441)
-OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 72702)
-OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15497)
-OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 177979)
-OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 335646)
-OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 278912)
-OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169308)
-OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189031)
-OffRamp_batchExecute:test_SingleReport_Success() (gas: 157132)
-OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554208)
-OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10600)
-OffRamp_ccipReceive:test_Reverts() (gas: 15385)
+OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5913989)
+OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 626106)
+OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 166490)
+OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 16763)
+OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 272148)
+OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 168572)
+OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 181027)
+OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13463)
+OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 72746)
+OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15519)
+OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 177991)
+OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 335638)
+OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 278904)
+OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169320)
+OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189033)
+OffRamp_batchExecute:test_SingleReport_Success() (gas: 157144)
+OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554256)
+OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10622)
+OffRamp_ccipReceive:test_Reverts() (gas: 15407)
OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905)
OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64099)
-OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68124)
+OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68173)
OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291)
OffRamp_commit:test_InvalidRootRevert() (gas: 63356)
-OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6260756)
-OffRamp_commit:test_NoConfig_Revert() (gas: 5844428)
+OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6674717)
+OffRamp_commit:test_NoConfig_Revert() (gas: 6258389)
OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 113042)
OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 121403)
OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 113063)
OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 355198)
-OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 164351)
-OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 139364)
+OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 164400)
+OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 139413)
OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 146555)
OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59858)
-OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 232074)
+OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 232042)
OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 125409)
OffRamp_commit:test_Unhealthy_Revert() (gas: 58633)
-OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206729)
+OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206713)
OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51722)
-OffRamp_constructor:test_Constructor_Success() (gas: 5845416)
-OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 135514)
-OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 102949)
-OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 100843)
-OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 161040)
-OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 100763)
-OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 100801)
+OffRamp_constructor:test_Constructor_Success() (gas: 6219782)
+OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 135943)
+OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103375)
+OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101269)
+OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 161468)
+OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 101189)
+OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101227)
OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17639)
-OffRamp_execute:test_LargeBatch_Success() (gas: 3426635)
-OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 373095)
-OffRamp_execute:test_MultipleReports_Success() (gas: 301009)
-OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6669661)
-OffRamp_execute:test_NoConfig_Revert() (gas: 5894136)
+OffRamp_execute:test_LargeBatch_Success() (gas: 3426335)
+OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 372990)
+OffRamp_execute:test_MultipleReports_Success() (gas: 300979)
+OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7083612)
+OffRamp_execute:test_NoConfig_Revert() (gas: 6308087)
OffRamp_execute:test_NonArray_Revert() (gas: 27562)
-OffRamp_execute:test_SingleReport_Success() (gas: 176364)
-OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148382)
-OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6672410)
+OffRamp_execute:test_SingleReport_Success() (gas: 176354)
+OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148372)
+OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7086361)
OffRamp_execute:test_ZeroReports_Revert() (gas: 17361)
-OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18511)
-OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244057)
-OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20759)
-OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205094)
-OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49316)
-OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48760)
-OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 218081)
-OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85349)
-OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274194)
-OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 91809)
-OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28260)
-OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 22062)
-OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481748)
-OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48372)
-OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33959)
-OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28436)
-OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 188084)
-OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198518)
-OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40741)
-OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 413233)
-OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 249776)
-OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 193590)
-OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 213624)
-OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249506)
-OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 142151)
-OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409289)
-OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58293)
-OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73868)
-OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583401)
-OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 532115)
-OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33717)
-OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549738)
-OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549752)
-OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460495)
-OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135910)
-OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165615)
-OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3868658)
-OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 120474)
-OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 89178)
-OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 81284)
-OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 74161)
-OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173244)
-OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 214189)
-OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 27152)
-OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 165098)
-OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 27689)
-OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55260)
-OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 498614)
-OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 316158)
-OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245360)
-OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165602)
-OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 227234)
-OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 227774)
-OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 781510)
-OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347431)
-OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37634)
+OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18533)
+OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244079)
+OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20781)
+OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205116)
+OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49306)
+OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48750)
+OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 218028)
+OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85296)
+OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274196)
+OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 91724)
+OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28282)
+OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 22084)
+OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481794)
+OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48394)
+OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33981)
+OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28458)
+OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 188096)
+OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198552)
+OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40763)
+OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 413245)
+OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 249800)
+OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 193614)
+OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 213648)
+OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249550)
+OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 142163)
+OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409313)
+OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58315)
+OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73890)
+OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583427)
+OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 532141)
+OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33739)
+OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549786)
+OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549800)
+OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460521)
+OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135944)
+OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165649)
+OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3885554)
+OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 120606)
+OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 89288)
+OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 81016)
+OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 74027)
+OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173167)
+OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 214124)
+OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 27085)
+OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 164696)
+OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 27622)
+OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55193)
+OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 498549)
+OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 316061)
+OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245222)
+OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165525)
+OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 227169)
+OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 227709)
+OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 781365)
+OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347346)
+OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37656)
OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404)
OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342)
OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752)
@@ -733,17 +733,17 @@ OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381)
OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903)
OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62751)
OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79790)
-OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174512)
-OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176424)
-OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187723)
-OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11269)
-OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13884)
-OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 46421)
-OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24463)
-OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219355)
-OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227977)
-OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295350)
-OffRamp_trialExecute:test_trialExecute_Success() (gas: 277894)
+OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174468)
+OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176380)
+OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187679)
+OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11291)
+OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13906)
+OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 46378)
+OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24420)
+OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219377)
+OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227999)
+OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295396)
+OffRamp_trialExecute:test_trialExecute_Success() (gas: 277896)
OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842)
OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18030)
OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67426)
diff --git a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
index e457157b45..14d5ae5c75 100644
--- a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
@@ -21,6 +21,7 @@ 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.
@@ -32,6 +33,7 @@ import {ERC165Checker} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts
contract OffRamp is ITypeAndVersion, MultiOCR3Base {
using ERC165Checker for address;
using EnumerableMapAddresses for EnumerableMapAddresses.AddressToAddressMap;
+ using EnumerableSet for EnumerableSet.UintSet;
error ZeroChainSelectorNotAllowed();
error ExecutionError(bytes32 messageId, bytes err);
@@ -156,6 +158,9 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
// DYNAMIC CONFIG
DynamicConfig internal s_dynamicConfig;
+ /// @notice Set of source chain selectors
+ EnumerableSet.UintSet internal s_sourceChainSelectors;
+
/// @notice SourceChainConfig per chain
/// (forms lane configurations from sourceChainSelector => StaticConfig.chainSelector)
mapping(uint64 sourceChainSelector => SourceChainConfig sourceChainConfig) private s_sourceChainConfigs;
@@ -919,6 +924,18 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
return s_sourceChainConfigs[sourceChainSelector];
}
+ /// @notice Returns all source chain configs
+ /// @return sourceChainConfigs The source chain configs corresponding to all the supported chain selectors
+ function getAllSourceChainConfigs() external view returns (uint64[] memory, SourceChainConfig[] memory) {
+ SourceChainConfig[] memory sourceChainConfigs = new SourceChainConfig[](s_sourceChainSelectors.length());
+ uint64[] memory sourceChainSelectors = new uint64[](s_sourceChainSelectors.length());
+ for (uint256 i = 0; i < s_sourceChainSelectors.length(); ++i) {
+ sourceChainSelectors[i] = uint64(s_sourceChainSelectors.at(i));
+ sourceChainConfigs[i] = s_sourceChainConfigs[sourceChainSelectors[i]];
+ }
+ return (sourceChainSelectors, sourceChainConfigs);
+ }
+
/// @notice Updates source configs
/// @param sourceChainConfigUpdates Source chain configs
function applySourceChainConfigUpdates(SourceChainConfigArgs[] memory sourceChainConfigUpdates) external onlyOwner {
@@ -962,6 +979,9 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
currentConfig.isEnabled = sourceConfigUpdate.isEnabled;
currentConfig.router = sourceConfigUpdate.router;
+ // We don't need to check the return value, as inserting the item twice has no effect.
+ s_sourceChainSelectors.add(sourceChainSelector);
+
emit SourceChainConfigSet(sourceChainSelector, currentConfig);
}
}
diff --git a/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol
index 0e9352a9ef..d84e23fe2f 100644
--- a/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol
@@ -1,12 +1,15 @@
// SPDX-License-Identifier: BUSL-1.1
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";
import {Internal} from "../../libraries/Internal.sol";
import {OffRamp} from "../../offRamp/OffRamp.sol";
import {IgnoreContractSize} from "./IgnoreContractSize.sol";
contract OffRampHelper is OffRamp, IgnoreContractSize {
+ using EnumerableSet for EnumerableSet.UintSet;
+
mapping(uint64 sourceChainSelector => uint256 overrideTimestamp) private s_sourceChainVerificationOverride;
constructor(
@@ -104,4 +107,8 @@ contract OffRampHelper is OffRamp, IgnoreContractSize {
function setRootTimestamp(uint64 sourceChainSelector, bytes32 root, uint256 timestamp) external {
s_roots[sourceChainSelector][root] = timestamp;
}
+
+ function getSourceChainSelectors() external view returns (uint256[] memory chainSelectors) {
+ return s_sourceChainSelectors.values();
+ }
}
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol
index c344294494..9cf0321a85 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol
@@ -67,6 +67,10 @@ contract OffRamp_constructor is OffRampSetup {
onRamp: sourceChainConfigs[1].onRamp
});
+ uint64[] memory expectedSourceChainSelectors = new uint64[](2);
+ expectedSourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1;
+ expectedSourceChainSelectors[1] = SOURCE_CHAIN_SELECTOR_1 + 1;
+
vm.expectEmit();
emit OffRamp.StaticConfigSet(staticConfig);
@@ -123,17 +127,21 @@ contract OffRamp_constructor is OffRampSetup {
MultiOCR3Base.OCRConfig memory gotOCRConfig = s_offRamp.latestConfigDetails(uint8(Internal.OCRPluginType.Execution));
_assertOCRConfigEquality(expectedOCRConfig, gotOCRConfig);
- _assertSourceChainConfigEquality(
- s_offRamp.getSourceChainConfig(SOURCE_CHAIN_SELECTOR_1), expectedSourceChainConfig1
- );
- _assertSourceChainConfigEquality(
- s_offRamp.getSourceChainConfig(SOURCE_CHAIN_SELECTOR_1 + 1), expectedSourceChainConfig2
- );
+ (uint64[] memory actualSourceChainSelectors, OffRamp.SourceChainConfig[] memory actualSourceChainConfigs) =
+ s_offRamp.getAllSourceChainConfigs();
+
+ _assertSourceChainConfigEquality(actualSourceChainConfigs[0], expectedSourceChainConfig1);
+ _assertSourceChainConfigEquality(actualSourceChainConfigs[1], expectedSourceChainConfig2);
// OffRamp initial values
assertEq("OffRamp 1.6.0-dev", s_offRamp.typeAndVersion());
assertEq(OWNER, s_offRamp.owner());
assertEq(0, s_offRamp.getLatestPriceSequenceNumber());
+
+ // assertion for source chain selector
+ for (uint256 i = 0; i < expectedSourceChainSelectors.length; i++) {
+ assertEq(expectedSourceChainSelectors[i], actualSourceChainSelectors[i]);
+ }
}
// Revert
@@ -3005,7 +3013,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
Vm.Log[] memory logEntries = vm.getRecordedLogs();
assertEq(logEntries.length, 0);
- // assertEq(s_offRamp.getSourceChainSelectors().length, 0);
+ assertEq(s_offRamp.getSourceChainSelectors().length, 0);
}
function test_AddNewChain_Success() public {
@@ -3058,9 +3066,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
_assertSourceChainConfigEquality(s_offRamp.getSourceChainConfig(SOURCE_CHAIN_SELECTOR_1), expectedSourceChainConfig);
- // uint64[] memory resultSourceChainSelectors = s_offRamp.getSourceChainSelectors();
- // assertEq(resultSourceChainSelectors.length, 1);
- // assertEq(resultSourceChainSelectors[0], SOURCE_CHAIN_SELECTOR_1);
+ uint256[] memory resultSourceChainSelectors = s_offRamp.getSourceChainSelectors();
+ assertEq(resultSourceChainSelectors.length, 1);
}
function test_AddMultipleChains_Success() public {
diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go
index fe30f8090f..b156130562 100644
--- a/core/gethwrappers/ccip/generated/offramp/offramp.go
+++ b/core/gethwrappers/ccip/generated/offramp/offramp.go
@@ -154,8 +154,8 @@ type OffRampStaticConfig struct {
}
var OffRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"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\":\"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\":[{\"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\":\"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\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationDisabled\",\"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\":\"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\":\"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\":\"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[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"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\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"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\":\"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.ExecutionReportSingleChain[]\",\"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\":\"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: "0x6101206040523480156200001257600080fd5b50604051620067de380380620067de833981016040819052620000359162000806565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f1816200036d565b50505062000b8d565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586166001600160c01b03199094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b60005b8151811015620005ba57600082828151811062000391576200039162000943565b60200260200101519050600081602001519050806001600160401b0316600003620003cf5760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b0316620003f8576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b03811660009081526006602052604090206060830151600182018054620004269062000959565b905060000362000489578154600160a81b600160e81b031916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620004c8565b8154600160a81b90046001600160401b0316600114620004c857604051632105803760e11b81526001600160401b038416600482015260240162000083565b80511580620004fe5750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b156200051d576040516342bcdf7f60e11b815260040160405180910390fd5b600182016200052d8282620009ea565b50604080850151835486516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178355516001600160401b038416907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b90620005a290859062000ab6565b60405180910390a25050505080600101905062000370565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620005f957620005f9620005be565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200062a576200062a620005be565b604052919050565b80516001600160401b03811681146200064a57600080fd5b919050565b6001600160a01b03811681146200066557600080fd5b50565b6000601f83601f8401126200067c57600080fd5b825160206001600160401b03808311156200069b576200069b620005be565b8260051b620006ac838201620005ff565b9384528681018301938381019089861115620006c757600080fd5b84890192505b85831015620007f957825184811115620006e75760008081fd5b89016080601f19828d038101821315620007015760008081fd5b6200070b620005d4565b888401516200071a816200064f565b815260406200072b85820162000632565b8a8301526060808601518015158114620007455760008081fd5b838301529385015193898511156200075d5760008081fd5b84860195508f603f8701126200077557600094508485fd5b8a8601519450898511156200078e576200078e620005be565b6200079f8b858f88011601620005ff565b93508484528f82868801011115620007b75760008081fd5b60005b85811015620007d7578681018301518582018d01528b01620007ba565b5060009484018b019490945250918201528352509184019190840190620006cd565b9998505050505050505050565b60008060008385036101008112156200081e57600080fd5b60808112156200082d57600080fd5b62000837620005d4565b620008428662000632565b8152602086015162000854816200064f565b6020820152604086015162000869816200064f565b604082015260608601516200087e816200064f565b606082810191909152909450607f19820112156200089b57600080fd5b50604051606081016001600160401b038082118383101715620008c257620008c2620005be565b8160405260808701519150620008d8826200064f565b90825260a08601519063ffffffff82168214620008f457600080fd5b81602084015260c087015191506200090c826200064f565b6040830182905260e0870151929450808311156200092957600080fd5b5050620009398682870162000668565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200096e57607f821691505b6020821081036200098f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009e5576000816000526020600020601f850160051c81016020861015620009c05750805b601f850160051c820191505b81811015620009e157828155600101620009cc565b5050505b505050565b81516001600160401b0381111562000a065762000a06620005be565b62000a1e8162000a17845462000959565b8462000995565b602080601f83116001811462000a56576000841562000a3d5750858301515b600019600386901b1c1916600185901b178555620009e1565b600085815260208120601f198616915b8281101562000a875788860151825594840194600190910190840162000a66565b508582101562000aa65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000b0b8162000959565b8060a089015260c0600183166000811462000b2f576001811462000b4c5762000b7e565b60ff19841660c08b015260c083151560051b8b0101945062000b7e565b85600052602060002060005b8481101562000b755781548c820185015290880190890162000b58565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615bdb62000c036000396000818161022c01526129d50152600081816101fd0152612c9a0152600081816101ce015281816105580152818161070a015261239601526000818161019f01526125d5015260008181611ac70152611afa0152615bdb6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80636f9e320f116100cd578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e146104bc578063f2fde38b146104dc578063f716f99f146104ef57600080fd5b8063c673e58414610458578063ccd37ba31461047857600080fd5b806379ba5097116100b257806379ba50971461042757806385572ffb1461042f5780638da5cb5b1461043d57600080fd5b80636f9e320f146103825780637437ff9f1461039557600080fd5b8063311cd513116101245780635e36480c116101095780635e36480c1461033c5780635e7bb0081461035c57806360987c201461036f57600080fd5b8063311cd5131461030e5780633f4b04aa1461032157600080fd5b806304666f9c1461015657806306285c691461016b578063181f5a77146102b25780632d04ab76146102fb575b600080fd5b610169610164366004613ba0565b610502565b005b61025c60408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160401b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102a9919081516001600160401b031681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6102ee6040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102a99190613d0e565b610169610309366004613dbe565b610516565b61016961031c366004613e70565b610a1d565b6009546040516001600160401b0390911681526020016102a9565b61034f61034a366004613ec3565b610a86565b6040516102a99190613f20565b61016961036a366004614489565b610adb565b61016961037d3660046146cd565b610d6a565b610169610390366004614761565b61104a565b6103f1604080516060810182526000808252602082018190529181019190915250604080516060810182526004546001600160a01b038082168352600160a01b90910463ffffffff166020830152600554169181019190915290565b6040805182516001600160a01b03908116825260208085015163ffffffff169083015292820151909216908201526060016102a9565b61016961105b565b6101696101513660046147d0565b6000546040516001600160a01b0390911681526020016102a9565b61046b61046636600461481b565b61110c565b6040516102a9919061487b565b6104ae6104863660046148f0565b6001600160401b03919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102a9565b6104cf6104ca36600461491a565b61126a565b6040516102a99190614935565b6101696104ea366004614982565b611376565b6101696104fd366004614a07565b611387565b61050a6113c9565b61051381611425565b50565b600061052487890189614d5c565b602081015151909150156105c157602081015160408083015160608401519151638d8741cb60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693638d8741cb93610590933093909190600401614f91565b60006040518083038186803b1580156105a857600080fd5b505afa1580156105bc573d6000803e3d6000fd5b505050505b805151511515806105d757508051602001515115155b156106a35760095460208a0135906001600160401b038083169116101561067b576009805467ffffffffffffffff19166001600160401b038316179055600480548351604051633937306f60e01b81526001600160a01b0390921692633937306f926106449291016150de565b600060405180830381600087803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b505050506106a1565b8160200151516000036106a157604051632261116760e01b815260040160405180910390fd5b505b60005b81602001515181101561095e576000826020015182815181106106cb576106cb61500c565b60209081029190910101518051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610751573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077591906150f1565b156107a357604051637edeb53960e11b81526001600160401b03821660048201526024015b60405180910390fd5b60006107ae82611678565b9050806001016040516107c19190615148565b6040518091039020836020015180519060200120146107fe5782602001518160010160405163b80d8fa960e01b815260040161079a92919061523b565b60408301518154600160a81b90046001600160401b03908116911614158061083f575082606001516001600160401b031683604001516001600160401b0316115b1561088457825160408085015160608601519151636af0786b60e11b81526001600160401b03938416600482015290831660248201529116604482015260640161079a565b6080830151806108a75760405163504570e360e01b815260040160405180910390fd5b83516001600160401b03166000908152600860209081526040808320848452909152902054156108ff5783516040516332cf0cbf60e01b81526001600160401b0390911660048201526024810182905260440161079a565b606084015161090f906001615276565b825467ffffffffffffffff60a81b1916600160a81b6001600160401b039283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016106a6565b50602081015181516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e49261099692909161529d565b60405180910390a1610a1260008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92506116c4915050565b505050505050505050565b610a5d610a2c828401846152c2565b6040805160008082526020820190925290610a57565b6060815260200190600190039081610a425790505b506119bd565b604080516000808252602082019092529050610a806001858585858660006116c4565b50505050565b6000610a94600160046152f6565b6002610aa160808561531f565b6001600160401b0316610ab49190615345565b610abe8585611a7f565b901c166003811115610ad257610ad2613ef6565b90505b92915050565b610ae3611ac4565b815181518114610b06576040516320f8fd5960e21b815260040160405180910390fd5b60005b81811015610d5a576000848281518110610b2557610b2561500c565b60200260200101519050600081602001515190506000858481518110610b4d57610b4d61500c565b6020026020010151905080518214610b78576040516320f8fd5960e21b815260040160405180910390fd5b60005b82811015610d4b576000828281518110610b9757610b9761500c565b6020026020010151600001519050600085602001518381518110610bbd57610bbd61500c565b6020026020010151905081600014610c11578060800151821015610c11578551815151604051633a98d46360e11b81526001600160401b03909216600483015260248201526044810183905260640161079a565b838381518110610c2357610c2361500c565b602002602001015160200151518160a001515114610c7057805180516060909101516040516370a193fd60e01b815260048101929092526001600160401b0316602482015260440161079a565b60005b8160a0015151811015610d3d576000858581518110610c9457610c9461500c565b6020026020010151602001518281518110610cb157610cb161500c565b602002602001015163ffffffff16905080600014610d345760008360a001518381518110610ce157610ce161500c565b60200260200101516040015163ffffffff16905080821015610d32578351516040516348e617b360e01b8152600481019190915260248101849052604481018290526064810183905260840161079a565b505b50600101610c73565b505050806001019050610b7b565b50505050806001019050610b09565b50610d6583836119bd565b505050565b333014610d8a576040516306e34e6560e31b815260040160405180910390fd5b6040805160008082526020820190925281610dc7565b6040805180820190915260008082526020820152815260200190600190039081610da05790505b5060a08701515190915015610dfd57610dfa8660a001518760200151886060015189600001516020015189898989611b2c565b90505b6040805160a081018252875151815287516020908101516001600160401b031681830152808901518351600094840192610e38929101613d0e565b60408051601f19818403018152918152908252898101516020830152018390526005549091506001600160a01b03168015610f13576040516308d450a160e01b81526001600160a01b038216906308d450a190610e999085906004016153fd565b600060405180830381600087803b158015610eb357600080fd5b505af1925050508015610ec4575060015b610f13573d808015610ef2576040519150601f19603f3d011682016040523d82523d6000602084013e610ef7565b606091505b50806040516309c2532560e01b815260040161079a9190613d0e565b604088015151158015610f2857506080880151155b80610f3f575060608801516001600160a01b03163b155b80610f6657506060880151610f64906001600160a01b03166385572ffb60e01b611cdd565b155b15610f7357505050611043565b87516020908101516001600160401b03166000908152600690915260408082205460808b015160608c01519251633cf9798360e01b815284936001600160a01b0390931692633cf9798392610fd19289926113889291600401615410565b6000604051808303816000875af1158015610ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611018919081019061544c565b50915091508161103d57806040516302a35ba360e21b815260040161079a9190613d0e565b50505050505b5050505050565b6110526113c9565b61051381611cf9565b6001546001600160a01b031633146110b55760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161079a565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61114f6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c0820152948552918201805484518184028101840190955280855292938583019390928301828280156111f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116111da575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561125a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161123c575b5050505050815250509050919050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b03878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b9092049092169483019490945260018401805493949293918401916112f69061510e565b80601f01602080910402602001604051908101604052809291908181526020018280546113229061510e565b801561125a5780601f106113445761010080835404028352916020019161125a565b820191906000526020600020905b81548152906001019060200180831161135257505050919092525091949350505050565b61137e6113c9565b61051381611dd8565b61138f6113c9565b60005b81518110156113c5576113bd8282815181106113b0576113b061500c565b6020026020010151611e81565b600101611392565b5050565b6000546001600160a01b031633146114235760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161079a565b565b60005b81518110156113c55760008282815181106114455761144561500c565b60200260200101519050600081602001519050806001600160401b03166000036114825760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166114aa576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260066020526040902060608301516001820180546114d69061510e565b905060000361153857815467ffffffffffffffff60a81b1916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611575565b8154600160a81b90046001600160401b031660011461157557604051632105803760e11b81526001600160401b038416600482015260240161079a565b805115806115aa5750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b156115c8576040516342bcdf7f60e11b815260040160405180910390fd5b600182016115d68282615531565b50604080850151835486516001600160a01b03166001600160a01b0319921515600160a01b02929092167fffffffffffffffffffffff00000000000000000000000000000000000000000090911617178355516001600160401b038416907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906116619085906155f0565b60405180910390a250505050806001019050611428565b6001600160401b03811660009081526006602052604081208054600160a01b900460ff16610ad55760405163ed053c5960e01b81526001600160401b038416600482015260240161079a565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906117238760a461563e565b905082606001511561176b57845161173c906020615345565b8651611749906020615345565b6117549060a061563e565b61175e919061563e565b611768908261563e565b90505b36811461179457604051638e1192e160e01b81526004810182905236602482015260440161079a565b50815181146117c35781516040516324f7d61360e21b815260048101919091526024810182905260440161079a565b6117cb611ac4565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561181957611819613ef6565b600281111561182a5761182a613ef6565b905250905060028160200151600281111561184757611847613ef6565b14801561189b5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff16815481106118835761188361500c565b6000918252602090912001546001600160a01b031633145b6118b857604051631b41e11d60e31b815260040160405180910390fd5b508160600151156119685760208201516118d3906001615651565b60ff168551146118f6576040516371253a2560e01b815260040160405180910390fd5b83518551146119185760405163a75d88af60e01b815260040160405180910390fd5b6000878760405161192a92919061566a565b604051908190038120611941918b9060200161567a565b6040516020818303038152906040528051906020012090506119668a828888886121ab565b505b6040805182815260208a8101356001600160401b03169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b81516000036119de5760405162bf199760e01b815260040160405180910390fd5b80516040805160008082526020820190925291159181611a21565b6040805180820190915260008152606060208201528152602001906001900390816119f95790505b50905060005b845181101561104357611a77858281518110611a4557611a4561500c565b602002602001015184611a7157858381518110611a6457611a6461500c565b6020026020010151612368565b83612368565b600101611a27565b6001600160401b038216600090815260076020526040812081611aa360808561568e565b6001600160401b031681526020810191909152604001600020549392505050565b467f00000000000000000000000000000000000000000000000000000000000000001461142357604051630f01ce8560e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161079a565b606088516001600160401b03811115611b4757611b476139e2565b604051908082528060200260200182016040528015611b8c57816020015b6040805180820190915260008082526020820152815260200190600190039081611b655790505b509050811560005b8a51811015611ccf5781611c2c57848482818110611bb457611bb461500c565b9050602002016020810190611bc991906156b4565b63ffffffff1615611c2c57848482818110611be657611be661500c565b9050602002016020810190611bfb91906156b4565b8b8281518110611c0d57611c0d61500c565b60200260200101516040019063ffffffff16908163ffffffff16815250505b611caa8b8281518110611c4157611c4161500c565b60200260200101518b8b8b8b8b87818110611c5e57611c5e61500c565b9050602002810190611c7091906156cf565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612c5f92505050565b838281518110611cbc57611cbc61500c565b6020908102919091010152600101611b94565b505098975050505050505050565b6000611ce883612f3f565b8015610ad25750610ad28383612f8a565b80516001600160a01b0316611d21576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586167fffffffffffffffff0000000000000000000000000000000000000000000000009094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b336001600160a01b03821603611e305760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161079a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003611eac576000604051631b3fab5160e11b815260040161079a9190615715565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003611efd576060840151600182018054911515620100000262ff000019909216919091179055611f39565b6060840151600182015460ff6201000090910416151590151514611f39576040516321fd80df60e21b815260ff8416600482015260240161079a565b60a084015180516101001015611f65576001604051631b3fab5160e11b815260040161079a9190615715565b8051600003611f8a576005604051631b3fab5160e11b815260040161079a9190615715565b611ff08484600301805480602002602001604051908101604052809291908181526020018280548015611fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fc8575b505050505061302c565b8460600151156121205761205e8484600201805480602002602001604051908101604052809291908181526020018280548015611fe6576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611fc857505050505061302c565b60808501518051610100101561208a576002604051631b3fab5160e11b815260040161079a9190615715565b604086015161209a90600361572f565b60ff168151116120c0576003604051631b3fab5160e11b815260040161079a9190615715565b8151815110156120e6576001604051631b3fab5160e11b815260040161079a9190615715565b805160018401805461ff00191661010060ff8416021790556121119060028601906020840190613968565b5061211e85826001613095565b505b61212c84826002613095565b80516121419060038501906020840190613968565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361219a9389939260028a0192919061574b565b60405180910390a1611043846131f0565b8251600090815b8181101561235e5760006001888684602081106121d1576121d161500c565b6121de91901a601b615651565b8985815181106121f0576121f061500c565b602002602001015189868151811061220a5761220a61500c565b602002602001015160405160008152602001604052604051612248949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561226a573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b038516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156122cb576122cb613ef6565b60028111156122dc576122dc613ef6565b90525090506001816020015160028111156122f9576122f9613ef6565b1461231757604051636518c33d60e11b815260040160405180910390fd5b8051600160ff9091161b85161561234157604051633d9ef1f160e21b815260040160405180910390fd5b806000015160ff166001901b8517945050508060010190506121b2565b5050505050505050565b81518151604051632cbc26bb60e01b8152608083901b67ffffffffffffffff60801b166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156123e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240991906150f1565b1561247a57801561243857604051637edeb53960e11b81526001600160401b038316600482015260240161079a565b6040516001600160401b03831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b600061248583611678565b60010180546124939061510e565b80601f01602080910402602001604051908101604052809291908181526020018280546124bf9061510e565b801561250c5780601f106124e15761010080835404028352916020019161250c565b820191906000526020600020905b8154815290600101906020018083116124ef57829003601f168201915b5050506020880151519293505050600081900361253b5760405162bf199760e01b815260040160405180910390fd5b8560400151518114612560576040516357e0e08360e01b815260040160405180910390fd5b6000816001600160401b0381111561257a5761257a6139e2565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b50905060005b82811015612747576000886020015182815181106125c9576125c961500c565b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160401b03168160000151604001516001600160401b0316146126405780516040908101519051631c21951160e11b81526001600160401b03909116600482015260240161079a565b866001600160401b03168160000151602001516001600160401b03161461269457805160200151604051636c95f1eb60e01b81526001600160401b03808a166004830152909116602482015260440161079a565b612721817f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f836000015160200151846000015160400151898051906020012060405160200161270694939291909384526001600160401b03928316602085015291166040830152606082015260800190565b60405160208183030381529060405280519060200120613247565b8383815181106127335761273361500c565b6020908102919091010152506001016125a9565b50600061275e86838a606001518b6080015161334f565b90508060000361278c57604051633ee8bd3f60e11b81526001600160401b038716600482015260240161079a565b60005b83811015610a125760005a905060008a6020015183815181106127b4576127b461500c565b6020026020010151905060006127d28a836000015160600151610a86565b905060008160038111156127e8576127e8613ef6565b14806128055750600381600381111561280357612803613ef6565b145b61285b57815160600151604080516001600160401b03808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a1505050612c57565b6060891561293a578b85815181106128755761287561500c565b6020908102919091018101510151600454909150600090600160a01b900463ffffffff166128a388426152f6565b11905080806128c3575060038360038111156128c1576128c1613ef6565b145b6128eb576040516354e7e43160e11b81526001600160401b038d16600482015260240161079a565b8c86815181106128fd576128fd61500c565b602002602001015160000151600014612934578c86815181106129225761292261500c565b60209081029190910101515160808501525b506129a6565b600082600381111561294e5761294e613ef6565b146129a657825160600151604080516001600160401b03808f16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe65120910160405180910390a150505050612c57565b8251608001516001600160401b031615612a7f5760008260038111156129ce576129ce613ef6565b03612a7f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e0e03cae8c85600001516080015186602001516040518463ffffffff1660e01b8152600401612a2f939291906157fd565b6020604051808303816000875af1158015612a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7291906150f1565b612a7f5750505050612c57565b60008d604001518681518110612a9757612a9761500c565b6020026020010151905080518460a001515114612ae157835160600151604051631cfe6d8b60e01b81526001600160401b03808f166004830152909116602482015260440161079a565b612af58c856000015160600151600161338c565b600080612b03868486613431565b91509150612b1a8e8760000151606001518461338c565b8c15612b71576003826003811115612b3457612b34613ef6565b03612b71576000856003811115612b4d57612b4d613ef6565b14612b7157855151604051632b11b8d960e01b815261079a91908390600401615829565b6002826003811115612b8557612b85613ef6565b14612bca576003826003811115612b9e57612b9e613ef6565b14612bca578d866000015160600151836040516349362d1f60e11b815260040161079a93929190615842565b8560000151600001518660000151606001516001600160401b03168f6001600160401b03167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8d8c81518110612c2257612c2261500c565b602002602001015186865a612c37908f6152f6565b604051612c479493929190615867565b60405180910390a4505050505050505b60010161278f565b6040805180820190915260008082526020820152602086015160405163bbe4f6db60e01b81526001600160a01b0380831660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015612ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d07919061589e565b90506001600160a01b0381161580612d365750612d346001600160a01b03821663aff2afbf60e01b611cdd565b155b15612d5f5760405163ae9b4ce960e01b81526001600160a01b038216600482015260240161079a565b600080612d7788858c6040015163ffffffff166134e5565b915091506000806000612e2a6040518061010001604052808e81526020018c6001600160401b031681526020018d6001600160a01b031681526020018f608001518152602001896001600160a01b031681526020018f6000015181526020018f6060015181526020018b815250604051602401612df491906158bb565b60408051601f198184030181529190526020810180516001600160e01b0316633907753760e01b179052878661138860846135c8565b92509250925082612e50578160405163e1cd550960e01b815260040161079a9190613d0e565b8151602014612e7f578151604051631e3be00960e21b815260206004820152602481019190915260440161079a565b600082806020019051810190612e959190615987565b9050866001600160a01b03168c6001600160a01b031614612f11576000612ec68d8a612ec1868a6152f6565b6134e5565b50905086811080612ee0575081612edd88836152f6565b14155b15612f0f5760405163a966e21f60e01b815260048101839052602481018890526044810182905260640161079a565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b6000612f52826301ffc9a760e01b612f8a565b8015610ad55750612f83827fffffffff00000000000000000000000000000000000000000000000000000000612f8a565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03166301ffc9a760e01b178152825192935060009283928392909183918a617530fa92503d91506000519050828015613015575060208210155b80156130215750600081115b979650505050505050565b60005b8151811015610d655760ff8316600090815260036020526040812083519091908490849081106130615761306161500c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff1916905560010161302f565b60005b8251811015610a805760008382815181106130b5576130b561500c565b60200260200101519050600060028111156130d2576130d2613ef6565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561311157613111613ef6565b14613132576004604051631b3fab5160e11b815260040161079a9190615715565b6001600160a01b0381166131595760405163d6c62c9b60e01b815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561317f5761317f613ef6565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff1916176101008360028111156131dc576131dc613ef6565b021790555090505050806001019050613098565b60ff81166105135760ff8082166000908152600260205260409020600101546201000090041661323357604051631e8ed32560e21b815260040160405180910390fd5b6009805467ffffffffffffffff1916905550565b8151805160608085015190830151608080870151940151604051600095869588956132ab95919490939192916020019485526001600160a01b039390931660208501526001600160401b039182166040850152606084015216608082015260a00190565b604051602081830303815290604052805190602001208560200151805190602001208660400151805190602001208760a001516040516020016132ee9190615a41565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b60008061335d8585856136a2565b6001600160401b038716600090815260086020908152604080832093835292905220549150505b949350505050565b6000600261339b60808561531f565b6001600160401b03166133ae9190615345565b905060006133bc8585611a7f565b9050816133cb600160046152f6565b901b1916818360038111156133e2576133e2613ef6565b6001600160401b03871660009081526007602052604081209190921b9290921791829161341060808861568e565b6001600160401b031681526020810191909152604001600020555050505050565b604051630304c3e160e51b815260009060609030906360987c209061345e90889088908890600401615ad8565b600060405180830381600087803b15801561347857600080fd5b505af1925050508015613489575060015b6134c8573d8080156134b7576040519150601f19603f3d011682016040523d82523d6000602084013e6134bc565b606091505b506003925090506134dd565b50506040805160208101909152600081526002905b935093915050565b60008060008060006135468860405160240161351091906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166370a0823160e01b179052888861138860846135c8565b9250925092508261356c578160405163e1cd550960e01b815260040161079a9190613d0e565b602082511461359b578151604051631e3be00960e21b815260206004820152602481019190915260440161079a565b818060200190518101906135af9190615987565b6135b982886152f6565b94509450505050935093915050565b6000606060008361ffff166001600160401b038111156135ea576135ea6139e2565b6040519080825280601f01601f191660200182016040528015613614576020820181803683370190505b509150863b61362e5763030ed58f60e21b60005260046000fd5b5a8581101561364857632be8ca8b60e21b60005260046000fd5b8590036040810481038710613668576337c3be2960e01b60005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d8481111561368b5750835b808352806000602085013e50955095509592505050565b82518251600091908183036136ca57604051630469ac9960e21b815260040160405180910390fd5b61010182118015906136de57506101018111155b6136fb576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613725576040516309bde33960e01b815260040160405180910390fd5b8060000361375257866000815181106137405761374061500c565b60200260200101519350505050613920565b6000816001600160401b0381111561376c5761376c6139e2565b604051908082528060200260200182016040528015613795578160200160208202803683370190505b50905060008080805b858110156138bf5760006001821b8b8116036137f957888510156137e2578c5160018601958e9181106137d3576137d361500c565b6020026020010151905061381b565b85516001850194879181106137d3576137d361500c565b8b5160018401938d9181106138105761381061500c565b602002602001015190505b60008986101561384b578d5160018701968f91811061383c5761383c61500c565b6020026020010151905061386d565b86516001860195889181106138625761386261500c565b602002602001015190505b8285111561388e576040516309bde33960e01b815260040160405180910390fd5b6138988282613927565b8784815181106138aa576138aa61500c565b6020908102919091010152505060010161379e565b5060018503821480156138d157508683145b80156138dc57508581145b6138f9576040516309bde33960e01b815260040160405180910390fd5b83600186038151811061390e5761390e61500c565b60200260200101519750505050505050505b9392505050565b600081831061393f5761393a8284613945565b610ad2565b610ad283835b604080516001602082015290810183905260608101829052600090608001613331565b8280548282559060005260206000209081019282156139bd579160200282015b828111156139bd57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613988565b506139c99291506139cd565b5090565b5b808211156139c957600081556001016139ce565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613a1a57613a1a6139e2565b60405290565b60405160a081016001600160401b0381118282101715613a1a57613a1a6139e2565b60405160c081016001600160401b0381118282101715613a1a57613a1a6139e2565b604080519081016001600160401b0381118282101715613a1a57613a1a6139e2565b604051601f8201601f191681016001600160401b0381118282101715613aae57613aae6139e2565b604052919050565b60006001600160401b03821115613acf57613acf6139e2565b5060051b60200190565b6001600160a01b038116811461051357600080fd5b80356001600160401b0381168114613b0557600080fd5b919050565b801515811461051357600080fd5b8035613b0581613b0a565b60006001600160401b03821115613b3c57613b3c6139e2565b50601f01601f191660200190565b600082601f830112613b5b57600080fd5b8135613b6e613b6982613b23565b613a86565b818152846020838601011115613b8357600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215613bb357600080fd5b82356001600160401b0380821115613bca57600080fd5b818501915085601f830112613bde57600080fd5b8135613bec613b6982613ab6565b81815260059190911b83018401908481019088831115613c0b57600080fd5b8585015b83811015613cb157803585811115613c275760008081fd5b86016080818c03601f1901811315613c3f5760008081fd5b613c476139f8565b89830135613c5481613ad9565b81526040613c63848201613aee565b8b830152606080850135613c7681613b0a565b83830152928401359289841115613c8f57600091508182fd5b613c9d8f8d86880101613b4a565b908301525085525050918601918601613c0f565b5098975050505050505050565b60005b83811015613cd9578181015183820152602001613cc1565b50506000910152565b60008151808452613cfa816020860160208601613cbe565b601f01601f19169290920160200192915050565b602081526000610ad26020830184613ce2565b8060608101831015610ad557600080fd5b60008083601f840112613d4457600080fd5b5081356001600160401b03811115613d5b57600080fd5b602083019150836020828501011115613d7357600080fd5b9250929050565b60008083601f840112613d8c57600080fd5b5081356001600160401b03811115613da357600080fd5b6020830191508360208260051b8501011115613d7357600080fd5b60008060008060008060008060e0898b031215613dda57600080fd5b613de48a8a613d21565b975060608901356001600160401b0380821115613e0057600080fd5b613e0c8c838d01613d32565b909950975060808b0135915080821115613e2557600080fd5b613e318c838d01613d7a565b909750955060a08b0135915080821115613e4a57600080fd5b50613e578b828c01613d7a565b999c989b50969995989497949560c00135949350505050565b600080600060808486031215613e8557600080fd5b613e8f8585613d21565b925060608401356001600160401b03811115613eaa57600080fd5b613eb686828701613d32565b9497909650939450505050565b60008060408385031215613ed657600080fd5b613edf83613aee565b9150613eed60208401613aee565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110613f1c57613f1c613ef6565b9052565b60208101610ad58284613f0c565b600060a08284031215613f4057600080fd5b613f48613a20565b905081358152613f5a60208301613aee565b6020820152613f6b60408301613aee565b6040820152613f7c60608301613aee565b6060820152613f8d60808301613aee565b608082015292915050565b8035613b0581613ad9565b803563ffffffff81168114613b0557600080fd5b600082601f830112613fc857600080fd5b81356020613fd8613b6983613ab6565b82815260059290921b84018101918181019086841115613ff757600080fd5b8286015b848110156140c75780356001600160401b038082111561401b5760008081fd5b9088019060a0828b03601f19018113156140355760008081fd5b61403d613a20565b878401358381111561404f5760008081fd5b61405d8d8a83880101613b4a565b82525060408085013561406f81613ad9565b828a01526060614080868201613fa3565b8284015260809150818601358581111561409a5760008081fd5b6140a88f8c838a0101613b4a565b9184019190915250919093013590830152508352918301918301613ffb565b509695505050505050565b600061014082840312156140e557600080fd5b6140ed613a42565b90506140f98383613f2e565b815260a08201356001600160401b038082111561411557600080fd5b61412185838601613b4a565b602084015260c084013591508082111561413a57600080fd5b61414685838601613b4a565b604084015261415760e08501613f98565b6060840152610100840135608084015261012084013591508082111561417c57600080fd5b5061418984828501613fb7565b60a08301525092915050565b600082601f8301126141a657600080fd5b813560206141b6613b6983613ab6565b82815260059290921b840181019181810190868411156141d557600080fd5b8286015b848110156140c75780356001600160401b038111156141f85760008081fd5b6142068986838b01016140d2565b8452509183019183016141d9565b600082601f83011261422557600080fd5b81356020614235613b6983613ab6565b82815260059290921b8401810191818101908684111561425457600080fd5b8286015b848110156140c75780356001600160401b038082111561427757600080fd5b818901915089603f83011261428b57600080fd5b8582013561429b613b6982613ab6565b81815260059190911b830160400190878101908c8311156142bb57600080fd5b604085015b838110156142f4578035858111156142d757600080fd5b6142e68f6040838a0101613b4a565b8452509189019189016142c0565b50875250505092840192508301614258565b600082601f83011261431757600080fd5b81356020614327613b6983613ab6565b8083825260208201915060208460051b87010193508684111561434957600080fd5b602086015b848110156140c7578035835291830191830161434e565b600082601f83011261437657600080fd5b81356020614386613b6983613ab6565b82815260059290921b840181019181810190868411156143a557600080fd5b8286015b848110156140c75780356001600160401b03808211156143c95760008081fd5b9088019060a0828b03601f19018113156143e35760008081fd5b6143eb613a20565b6143f6888501613aee565b81526040808501358481111561440c5760008081fd5b61441a8e8b83890101614195565b8a84015250606080860135858111156144335760008081fd5b6144418f8c838a0101614214565b838501525060809150818601358581111561445c5760008081fd5b61446a8f8c838a0101614306565b91840191909152509190930135908301525083529183019183016143a9565b6000806040838503121561449c57600080fd5b6001600160401b03833511156144b157600080fd5b6144be8484358501614365565b91506001600160401b03602084013511156144d857600080fd5b6020830135830184601f8201126144ee57600080fd5b6144fb613b698235613ab6565b81358082526020808301929160051b84010187101561451957600080fd5b602083015b6020843560051b8501018110156146bf576001600160401b038135111561454457600080fd5b87603f82358601011261455657600080fd5b614569613b696020833587010135613ab6565b81358501602081810135808452908301929160059190911b016040018a101561459157600080fd5b604083358701015b83358701602081013560051b016040018110156146af576001600160401b03813511156145c557600080fd5b833587018135016040818d03603f190112156145e057600080fd5b6145e8613a64565b604082013581526001600160401b036060830135111561460757600080fd5b8c605f60608401358401011261461c57600080fd5b6040606083013583010135614633613b6982613ab6565b808282526020820191508f60608460051b606088013588010101111561465857600080fd5b6060808601358601015b60608460051b60608801358801010181101561468f5761468181613fa3565b835260209283019201614662565b508060208501525050508085525050602083019250602081019050614599565b508452506020928301920161451e565b508093505050509250929050565b6000806000806000606086880312156146e557600080fd5b85356001600160401b03808211156146fc57600080fd5b61470889838a016140d2565b9650602088013591508082111561471e57600080fd5b61472a89838a01613d7a565b9096509450604088013591508082111561474357600080fd5b5061475088828901613d7a565b969995985093965092949392505050565b60006060828403121561477357600080fd5b604051606081018181106001600160401b0382111715614795576147956139e2565b60405282356147a381613ad9565b81526147b160208401613fa3565b602082015260408301356147c481613ad9565b60408201529392505050565b6000602082840312156147e257600080fd5b81356001600160401b038111156147f857600080fd5b820160a0818503121561392057600080fd5b803560ff81168114613b0557600080fd5b60006020828403121561482d57600080fd5b610ad28261480a565b60008151808452602080850194506020840160005b838110156148705781516001600160a01b03168752958201959082019060010161484b565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a08401526148ca60e0840182614836565b90506040840151601f198483030160c08501526148e78282614836565b95945050505050565b6000806040838503121561490357600080fd5b61490c83613aee565b946020939093013593505050565b60006020828403121561492c57600080fd5b610ad282613aee565b602081526001600160a01b0382511660208201526020820151151560408201526001600160401b0360408301511660608201526000606083015160808084015261338460a0840182613ce2565b60006020828403121561499457600080fd5b813561392081613ad9565b600082601f8301126149b057600080fd5b813560206149c0613b6983613ab6565b8083825260208201915060208460051b8701019350868411156149e257600080fd5b602086015b848110156140c75780356149fa81613ad9565b83529183019183016149e7565b60006020808385031215614a1a57600080fd5b82356001600160401b0380821115614a3157600080fd5b818501915085601f830112614a4557600080fd5b8135614a53613b6982613ab6565b81815260059190911b83018401908481019088831115614a7257600080fd5b8585015b83811015613cb157803585811115614a8d57600080fd5b860160c0818c03601f19011215614aa45760008081fd5b614aac613a42565b8882013581526040614abf81840161480a565b8a8301526060614ad081850161480a565b8284015260809150614ae3828501613b18565b9083015260a08381013589811115614afb5760008081fd5b614b098f8d8388010161499f565b838501525060c0840135915088821115614b235760008081fd5b614b318e8c8487010161499f565b9083015250845250918601918601614a76565b80356001600160e01b0381168114613b0557600080fd5b600082601f830112614b6c57600080fd5b81356020614b7c613b6983613ab6565b82815260069290921b84018101918181019086841115614b9b57600080fd5b8286015b848110156140c75760408189031215614bb85760008081fd5b614bc0613a64565b614bc982613aee565b8152614bd6858301614b44565b81860152835291830191604001614b9f565b600082601f830112614bf957600080fd5b81356020614c09613b6983613ab6565b82815260059290921b84018101918181019086841115614c2857600080fd5b8286015b848110156140c75780356001600160401b0380821115614c4c5760008081fd5b9088019060a0828b03601f1901811315614c665760008081fd5b614c6e613a20565b614c79888501613aee565b815260408085013584811115614c8f5760008081fd5b614c9d8e8b83890101613b4a565b8a8401525060609350614cb1848601613aee565b908201526080614cc2858201613aee565b93820193909352920135908201528352918301918301614c2c565b600082601f830112614cee57600080fd5b81356020614cfe613b6983613ab6565b82815260069290921b84018101918181019086841115614d1d57600080fd5b8286015b848110156140c75760408189031215614d3a5760008081fd5b614d42613a64565b813581528482013585820152835291830191604001614d21565b60006020808385031215614d6f57600080fd5b82356001600160401b0380821115614d8657600080fd5b9084019060808287031215614d9a57600080fd5b614da26139f8565b823582811115614db157600080fd5b83016040818903811315614dc457600080fd5b614dcc613a64565b823585811115614ddb57600080fd5b8301601f81018b13614dec57600080fd5b8035614dfa613b6982613ab6565b81815260069190911b8201890190898101908d831115614e1957600080fd5b928a01925b82841015614e695785848f031215614e365760008081fd5b614e3e613a64565b8435614e4981613ad9565b8152614e56858d01614b44565b818d0152825292850192908a0190614e1e565b845250505082870135915084821115614e8157600080fd5b614e8d8a838501614b5b565b81880152835250508284013582811115614ea657600080fd5b614eb288828601614be8565b85830152506040830135935081841115614ecb57600080fd5b614ed787858501614cdd565b6040820152606083013560608201528094505050505092915050565b600082825180855260208086019550808260051b84010181860160005b84811015614f8457601f19868403018952815160a06001600160401b03808351168652868301518288880152614f4883880182613ce2565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101614f10565b5090979650505050505050565b6001600160a01b038516815260006020608081840152614fb46080840187614ef3565b83810360408581019190915286518083528388019284019060005b81811015614ff457845180518452860151868401529385019391830191600101614fcf565b50508094505050505082606083015295945050505050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561507957835180516001600160a01b031684528501516001600160e01b0316858401529284019291850191600101615042565b50508583015187820388850152805180835290840192506000918401905b808310156150d257835180516001600160401b031683528501516001600160e01b031685830152928401926001929092019190850190615097565b50979650505050505050565b602081526000610ad26020830184615022565b60006020828403121561510357600080fd5b815161392081613b0a565b600181811c9082168061512257607f821691505b60208210810361514257634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546151568161510e565b6001828116801561516e5760018114615183576151b2565b60ff19841687528215158302870194506151b2565b8760005260208060002060005b858110156151a95781548a820152908401908201615190565b50505082870194505b50929695505050505050565b600081546151cb8161510e565b8085526020600183811680156151e8576001811461520257615230565b60ff1985168884015283151560051b880183019550615230565b866000528260002060005b858110156152285781548a820186015290830190840161520d565b890184019650505b505050505092915050565b60408152600061524e6040830185613ce2565b82810360208401526148e781856151be565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111561529657615296615260565b5092915050565b6040815260006152b06040830185614ef3565b82810360208401526148e78185615022565b6000602082840312156152d457600080fd5b81356001600160401b038111156152ea57600080fd5b61338484828501614365565b81810381811115610ad557610ad5615260565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b038084168061533957615339615309565b92169190910692915050565b8082028115828204841417610ad557610ad5615260565b80518252600060206001600160401b0381840151168185015260408084015160a0604087015261538f60a0870182613ce2565b9050606085015186820360608801526153a88282613ce2565b608087810151898303918a01919091528051808352908601935060009250908501905b808310156150d257835180516001600160a01b03168352860151868301529285019260019290920191908401906153cb565b602081526000610ad2602083018461535c565b608081526000615423608083018761535c565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561546157600080fd5b835161546c81613b0a565b60208501519093506001600160401b0381111561548857600080fd5b8401601f8101861361549957600080fd5b80516154a7613b6982613b23565b8181528760208385010111156154bc57600080fd5b6154cd826020830160208601613cbe565b809450505050604084015190509250925092565b601f821115610d65576000816000526020600020601f850160051c8101602086101561550a5750805b601f850160051c820191505b8181101561552957828155600101615516565b505050505050565b81516001600160401b0381111561554a5761554a6139e2565b61555e81615558845461510e565b846154e1565b602080601f831160018114615593576000841561557b5750858301515b600019600386901b1c1916600185901b178555615529565b600085815260208120601f198616915b828110156155c2578886015182559484019460019091019084016155a3565b50858210156155e05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208152600082546001600160a01b038116602084015260ff8160a01c16151560408401526001600160401b038160a81c16606084015250608080830152610ad260a08301600185016151be565b80820180821115610ad557610ad5615260565b60ff8181168382160190811115610ad557610ad5615260565b8183823760009101908152919050565b828152606082602083013760800192915050565b60006001600160401b03808416806156a8576156a8615309565b92169190910492915050565b6000602082840312156156c657600080fd5b610ad282613fa3565b6000808335601e198436030181126156e657600080fd5b8301803591506001600160401b0382111561570057600080fd5b602001915036819003821315613d7357600080fd5b602081016006831061572957615729613ef6565b91905290565b60ff818116838216029081169081811461529657615296615260565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b818110156157a35784546001600160a01b03168352600194850194928401920161577e565b50508481036060860152865180825290820192508187019060005b818110156157e35782516001600160a01b0316855293830193918301916001016157be565b50505060ff851660808501525090505b9695505050505050565b60006001600160401b038086168352808516602084015250606060408301526148e76060830184613ce2565b8281526040602082015260006133846040830184613ce2565b6001600160401b03848116825283166020820152606081016133846040830184613f0c565b8481526158776020820185613f0c565b60806040820152600061588d6080830185613ce2565b905082606083015295945050505050565b6000602082840312156158b057600080fd5b815161392081613ad9565b60208152600082516101008060208501526158da610120850183613ce2565b915060208501516158f660408601826001600160401b03169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161593060a08601826001600160a01b03169052565b5060a0850151601f19808685030160c087015261594d8483613ce2565b935060c08701519150808685030160e087015261596a8483613ce2565b935060e08701519150808685030183870152506157f38382613ce2565b60006020828403121561599957600080fd5b5051919050565b600082825180855260208086019550808260051b84010181860160005b84811015614f8457601f19868403018952815160a081518186526159e382870182613ce2565b9150506001600160a01b03868301511686860152604063ffffffff8184015116818701525060608083015186830382880152615a1f8382613ce2565b60809485015197909401969096525050988401989250908301906001016159bd565b602081526000610ad260208301846159a0565b60008282518085526020808601955060208260051b8401016020860160005b84811015614f8457601f19868403018952615a8f838351613ce2565b98840198925090830190600101615a73565b60008151808452602080850194506020840160005b8381101561487057815163ffffffff1687529582019590820190600101615ab6565b60608152600084518051606084015260208101516001600160401b0380821660808601528060408401511660a08601528060608401511660c08601528060808401511660e0860152505050602085015161014080610100850152615b406101a0850183613ce2565b91506040870151605f198086850301610120870152615b5f8483613ce2565b935060608901519150615b7c838701836001600160a01b03169052565b608089015161016087015260a0890151925080868503016101808701525050615ba582826159a0565b9150508281036020840152615bba8186615a54565b905082810360408401526157f38185615aa156fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"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\":\"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\":[{\"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\":\"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\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationDisabled\",\"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\":\"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\":\"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\":\"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[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"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\":\"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\":\"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.ExecutionReportSingleChain[]\",\"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\":\"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: "0x6101206040523480156200001257600080fd5b5060405162006c4638038062006c46833981016040819052620000359162000885565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f1816200036d565b50505062000c0c565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586166001600160c01b03199094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b60005b8151811015620005d0576000828281518110620003915762000391620009c2565b60200260200101519050600081602001519050806001600160401b0316600003620003cf5760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b0316620003f8576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260086020526040902060608301516001820180546200042690620009d8565b905060000362000489578154600160a81b600160e81b031916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620004c8565b8154600160a81b90046001600160401b0316600114620004c857604051632105803760e11b81526001600160401b038416600482015260240162000083565b80511580620004fe5750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b156200051d576040516342bcdf7f60e11b815260040160405180910390fd5b600182016200052d828262000a69565b506040840151825485516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b0319909116171782556200057c60066001600160401b038516620005d4565b50826001600160401b03167f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b83604051620005b8919062000b35565b60405180910390a25050505080600101905062000370565b5050565b6000620005e28383620005eb565b90505b92915050565b60008181526001830160205260408120546200063457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005e5565b506000620005e5565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200067857620006786200063d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006a957620006a96200063d565b604052919050565b80516001600160401b0381168114620006c957600080fd5b919050565b6001600160a01b0381168114620006e457600080fd5b50565b6000601f83601f840112620006fb57600080fd5b825160206001600160401b03808311156200071a576200071a6200063d565b8260051b6200072b8382016200067e565b93845286810183019383810190898611156200074657600080fd5b84890192505b858310156200087857825184811115620007665760008081fd5b89016080601f19828d038101821315620007805760008081fd5b6200078a62000653565b888401516200079981620006ce565b81526040620007aa858201620006b1565b8a8301526060808601518015158114620007c45760008081fd5b83830152938501519389851115620007dc5760008081fd5b84860195508f603f870112620007f457600094508485fd5b8a8601519450898511156200080d576200080d6200063d565b6200081e8b858f880116016200067e565b93508484528f82868801011115620008365760008081fd5b60005b8581101562000856578681018301518582018d01528b0162000839565b5060009484018b0194909452509182015283525091840191908401906200074c565b9998505050505050505050565b60008060008385036101008112156200089d57600080fd5b6080811215620008ac57600080fd5b620008b662000653565b620008c186620006b1565b81526020860151620008d381620006ce565b60208201526040860151620008e881620006ce565b60408201526060860151620008fd81620006ce565b606082810191909152909450607f19820112156200091a57600080fd5b50604051606081016001600160401b0380821183831017156200094157620009416200063d565b81604052608087015191506200095782620006ce565b90825260a08601519063ffffffff821682146200097357600080fd5b81602084015260c087015191506200098b82620006ce565b6040830182905260e087015192945080831115620009a857600080fd5b5050620009b886828701620006e7565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620009ed57607f821691505b60208210810362000a0e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a64576000816000526020600020601f850160051c8101602086101562000a3f5750805b601f850160051c820191505b8181101562000a605782815560010162000a4b565b5050505b505050565b81516001600160401b0381111562000a855762000a856200063d565b62000a9d8162000a968454620009d8565b8462000a14565b602080601f83116001811462000ad5576000841562000abc5750858301515b600019600386901b1c1916600185901b17855562000a60565b600085815260208120601f198616915b8281101562000b065788860151825594840194600190910190840162000ae5565b508582101562000b255787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000b8a81620009d8565b8060a089015260c0600183166000811462000bae576001811462000bcb5762000bfd565b60ff19841660c08b015260c083151560051b8b0101945062000bfd565b85600052602060002060005b8481101562000bf45781548c820185015290880190890162000bd7565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615fc462000c82600039600081816102470152612c970152600081816102180152612f860152600081816101e9015281816105890152818161073b01526126580152600081816101ba0152612897015260008181611d7d0152611db00152615fc46000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80636f9e320f116100cd578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e146104ed578063f2fde38b1461050d578063f716f99f1461052057600080fd5b8063c673e58414610489578063ccd37ba3146104a957600080fd5b806379ba5097116100b257806379ba50971461045857806385572ffb146104605780638da5cb5b1461046e57600080fd5b80636f9e320f146103b35780637437ff9f146103c657600080fd5b80633f4b04aa116101245780635e36480c116101095780635e36480c1461036d5780635e7bb0081461038d57806360987c20146103a057600080fd5b80633f4b04aa1461033c5780635215505b1461035757600080fd5b8063181f5a7711610155578063181f5a77146102cd5780632d04ab7614610316578063311cd5131461032957600080fd5b806304666f9c1461017157806306285c6914610186575b600080fd5b61018461017f366004613edb565b610533565b005b61027760408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160401b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102c4919081516001600160401b031681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103096040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102c49190614049565b6101846103243660046140f9565b610547565b6101846103373660046141ab565b610a4e565b600b546040516001600160401b0390911681526020016102c4565b61035f610ab7565b6040516102c4929190614245565b61038061037b3660046142e6565b610d12565b6040516102c49190614343565b61018461039b3660046148ac565b610d67565b6101846103ae366004614af0565b610ff6565b6101846103c1366004614b84565b6112d6565b610422604080516060810182526000808252602082018190529181019190915250604080516060810182526004546001600160a01b038082168352600160a01b90910463ffffffff166020830152600554169181019190915290565b6040805182516001600160a01b03908116825260208085015163ffffffff169083015292820151909216908201526060016102c4565b6101846112e7565b61018461016c366004614bf3565b6000546040516001600160a01b0390911681526020016102c4565b61049c610497366004614c3e565b611398565b6040516102c49190614c9e565b6104df6104b7366004614d13565b6001600160401b03919091166000908152600a60209081526040808320938352929052205490565b6040519081526020016102c4565b6105006104fb366004614d3d565b6114f6565b6040516102c49190614d58565b61018461051b366004614d6b565b611602565b61018461052e366004614df0565b611613565b61053b611655565b610544816116b1565b50565b600061055587890189615145565b602081015151909150156105f257602081015160408083015160608401519151638d8741cb60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693638d8741cb936105c193309390919060040161537a565b60006040518083038186803b1580156105d957600080fd5b505afa1580156105ed573d6000803e3d6000fd5b505050505b8051515115158061060857508051602001515115155b156106d457600b5460208a0135906001600160401b03808316911610156106ac57600b805467ffffffffffffffff19166001600160401b038316179055600480548351604051633937306f60e01b81526001600160a01b0390921692633937306f926106759291016154c7565b600060405180830381600087803b15801561068f57600080fd5b505af11580156106a3573d6000803e3d6000fd5b505050506106d2565b8160200151516000036106d257604051632261116760e01b815260040160405180910390fd5b505b60005b81602001515181101561098f576000826020015182815181106106fc576106fc6153f5565b60209081029190910101518051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a691906154da565b156107d457604051637edeb53960e11b81526001600160401b03821660048201526024015b60405180910390fd5b60006107df82611918565b9050806001016040516107f29190615531565b60405180910390208360200151805190602001201461082f5782602001518160010160405163b80d8fa960e01b81526004016107cb929190615624565b60408301518154600160a81b90046001600160401b039081169116141580610870575082606001516001600160401b031683604001516001600160401b0316115b156108b557825160408085015160608601519151636af0786b60e11b81526001600160401b0393841660048201529083166024820152911660448201526064016107cb565b6080830151806108d85760405163504570e360e01b815260040160405180910390fd5b83516001600160401b03166000908152600a60209081526040808320848452909152902054156109305783516040516332cf0cbf60e01b81526001600160401b039091166004820152602481018290526044016107cb565b606084015161094090600161565f565b825467ffffffffffffffff60a81b1916600160a81b6001600160401b0392831602179092559251166000908152600a6020908152604080832094835293905291909120429055506001016106d7565b50602081015181516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e4926109c7929091615686565b60405180910390a1610a4360008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250611964915050565b505050505050505050565b610a8e610a5d828401846156ab565b6040805160008082526020820190925290610a88565b6060815260200190600190039081610a735790505b50611c5d565b604080516000808252602082019092529050610ab1600185858585866000611964565b50505050565b6060806000610ac66006611d1f565b6001600160401b03811115610add57610add613d1d565b604051908082528060200260200182016040528015610b2e57816020015b6040805160808101825260008082526020808301829052928201526060808201528252600019909201910181610afb5790505b5090506000610b3d6006611d1f565b6001600160401b03811115610b5457610b54613d1d565b604051908082528060200260200182016040528015610b7d578160200160208202803683370190505b50905060005b610b8d6006611d1f565b811015610d0957610b9f600682611d29565b828281518110610bb157610bb16153f5565b60200260200101906001600160401b031690816001600160401b03168152505060086000838381518110610be757610be76153f5565b6020908102919091018101516001600160401b039081168352828201939093526040918201600020825160808101845281546001600160a01b038116825260ff600160a01b820416151593820193909352600160a81b90920490931691810191909152600182018054919291606084019190610c62906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8e906154f7565b8015610cdb5780601f10610cb057610100808354040283529160200191610cdb565b820191906000526020600020905b815481529060010190602001808311610cbe57829003601f168201915b505050505081525050838281518110610cf657610cf66153f5565b6020908102919091010152600101610b83565b50939092509050565b6000610d20600160046156df565b6002610d2d608085615708565b6001600160401b0316610d40919061572e565b610d4a8585611d35565b901c166003811115610d5e57610d5e614319565b90505b92915050565b610d6f611d7a565b815181518114610d92576040516320f8fd5960e21b815260040160405180910390fd5b60005b81811015610fe6576000848281518110610db157610db16153f5565b60200260200101519050600081602001515190506000858481518110610dd957610dd96153f5565b6020026020010151905080518214610e04576040516320f8fd5960e21b815260040160405180910390fd5b60005b82811015610fd7576000828281518110610e2357610e236153f5565b6020026020010151600001519050600085602001518381518110610e4957610e496153f5565b6020026020010151905081600014610e9d578060800151821015610e9d578551815151604051633a98d46360e11b81526001600160401b0390921660048301526024820152604481018390526064016107cb565b838381518110610eaf57610eaf6153f5565b602002602001015160200151518160a001515114610efc57805180516060909101516040516370a193fd60e01b815260048101929092526001600160401b031660248201526044016107cb565b60005b8160a0015151811015610fc9576000858581518110610f2057610f206153f5565b6020026020010151602001518281518110610f3d57610f3d6153f5565b602002602001015163ffffffff16905080600014610fc05760008360a001518381518110610f6d57610f6d6153f5565b60200260200101516040015163ffffffff16905080821015610fbe578351516040516348e617b360e01b815260048101919091526024810184905260448101829052606481018390526084016107cb565b505b50600101610eff565b505050806001019050610e07565b50505050806001019050610d95565b50610ff18383611c5d565b505050565b333014611016576040516306e34e6560e31b815260040160405180910390fd5b6040805160008082526020820190925281611053565b604080518082019091526000808252602082015281526020019060019003908161102c5790505b5060a08701515190915015611089576110868660a001518760200151886060015189600001516020015189898989611de2565b90505b6040805160a081018252875151815287516020908101516001600160401b0316818301528089015183516000948401926110c4929101614049565b60408051601f19818403018152918152908252898101516020830152018390526005549091506001600160a01b0316801561119f576040516308d450a160e01b81526001600160a01b038216906308d450a1906111259085906004016157e6565b600060405180830381600087803b15801561113f57600080fd5b505af1925050508015611150575060015b61119f573d80801561117e576040519150601f19603f3d011682016040523d82523d6000602084013e611183565b606091505b50806040516309c2532560e01b81526004016107cb9190614049565b6040880151511580156111b457506080880151155b806111cb575060608801516001600160a01b03163b155b806111f2575060608801516111f0906001600160a01b03166385572ffb60e01b611f93565b155b156111ff575050506112cf565b87516020908101516001600160401b03166000908152600890915260408082205460808b015160608c01519251633cf9798360e01b815284936001600160a01b0390931692633cf979839261125d92899261138892916004016157f9565b6000604051808303816000875af115801561127c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112a49190810190615835565b5091509150816112c957806040516302a35ba360e21b81526004016107cb9190614049565b50505050505b5050505050565b6112de611655565b61054481611faf565b6001546001600160a01b031633146113415760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107cb565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6113db6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561148457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611466575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156114e657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114c8575b5050505050815250509050919050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b03878116845260088352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b909204909216948301949094526001840180549394929391840191611582906154f7565b80601f01602080910402602001604051908101604052809291908181526020018280546115ae906154f7565b80156114e65780601f106115d0576101008083540402835291602001916114e6565b820191906000526020600020905b8154815290600101906020018083116115de57505050919092525091949350505050565b61160a611655565b6105448161208e565b61161b611655565b60005b81518110156116515761164982828151811061163c5761163c6153f5565b6020026020010151612137565b60010161161e565b5050565b6000546001600160a01b031633146116af5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107cb565b565b60005b81518110156116515760008282815181106116d1576116d16153f5565b60200260200101519050600081602001519050806001600160401b031660000361170e5760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b0316611736576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b03811660009081526008602052604090206060830151600182018054611762906154f7565b90506000036117c457815467ffffffffffffffff60a81b1916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611801565b8154600160a81b90046001600160401b031660011461180157604051632105803760e11b81526001600160401b03841660048201526024016107cb565b805115806118365750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b15611854576040516342bcdf7f60e11b815260040160405180910390fd5b60018201611862828261591a565b506040840151825485516001600160a01b03166001600160a01b0319921515600160a01b02929092167fffffffffffffffffffffff000000000000000000000000000000000000000000909116171782556118c760066001600160401b038516612461565b50826001600160401b03167f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b8360405161190191906159d9565b60405180910390a2505050508060010190506116b4565b6001600160401b03811660009081526008602052604081208054600160a01b900460ff16610d615760405163ed053c5960e01b81526001600160401b03841660048201526024016107cb565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906119c38760a4615a27565b9050826060015115611a0b5784516119dc90602061572e565b86516119e990602061572e565b6119f49060a0615a27565b6119fe9190615a27565b611a089082615a27565b90505b368114611a3457604051638e1192e160e01b8152600481018290523660248201526044016107cb565b5081518114611a635781516040516324f7d61360e21b81526004810191909152602481018290526044016107cb565b611a6b611d7a565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611ab957611ab9614319565b6002811115611aca57611aca614319565b9052509050600281602001516002811115611ae757611ae7614319565b148015611b3b5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611b2357611b236153f5565b6000918252602090912001546001600160a01b031633145b611b5857604051631b41e11d60e31b815260040160405180910390fd5b50816060015115611c08576020820151611b73906001615a3a565b60ff16855114611b96576040516371253a2560e01b815260040160405180910390fd5b8351855114611bb85760405163a75d88af60e01b815260040160405180910390fd5b60008787604051611bca929190615a53565b604051908190038120611be1918b90602001615a63565b604051602081830303815290604052805190602001209050611c068a8288888861246d565b505b6040805182815260208a8101356001600160401b03169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b8151600003611c7e5760405162bf199760e01b815260040160405180910390fd5b80516040805160008082526020820190925291159181611cc1565b604080518082019091526000815260606020820152815260200190600190039081611c995790505b50905060005b84518110156112cf57611d17858281518110611ce557611ce56153f5565b602002602001015184611d1157858381518110611d0457611d046153f5565b602002602001015161262a565b8361262a565b600101611cc7565b6000610d61825490565b6000610d5e8383612f21565b6001600160401b038216600090815260096020526040812081611d59608085615a77565b6001600160401b031681526020810191909152604001600020549392505050565b467f0000000000000000000000000000000000000000000000000000000000000000146116af57604051630f01ce8560e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107cb565b606088516001600160401b03811115611dfd57611dfd613d1d565b604051908082528060200260200182016040528015611e4257816020015b6040805180820190915260008082526020820152815260200190600190039081611e1b5790505b509050811560005b8a51811015611f855781611ee257848482818110611e6a57611e6a6153f5565b9050602002016020810190611e7f9190615a9d565b63ffffffff1615611ee257848482818110611e9c57611e9c6153f5565b9050602002016020810190611eb19190615a9d565b8b8281518110611ec357611ec36153f5565b60200260200101516040019063ffffffff16908163ffffffff16815250505b611f608b8281518110611ef757611ef76153f5565b60200260200101518b8b8b8b8b87818110611f1457611f146153f5565b9050602002810190611f269190615ab8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f4b92505050565b838281518110611f7257611f726153f5565b6020908102919091010152600101611e4a565b505098975050505050505050565b6000611f9e8361322b565b8015610d5e5750610d5e8383613276565b80516001600160a01b0316611fd7576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586167fffffffffffffffff0000000000000000000000000000000000000000000000009094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b336001600160a01b038216036120e65760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107cb565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003612162576000604051631b3fab5160e11b81526004016107cb9190615afe565b60208082015160ff808216600090815260029093526040832060018101549293909283921690036121b3576060840151600182018054911515620100000262ff0000199092169190911790556121ef565b6060840151600182015460ff62010000909104161515901515146121ef576040516321fd80df60e21b815260ff841660048201526024016107cb565b60a08401518051610100101561221b576001604051631b3fab5160e11b81526004016107cb9190615afe565b8051600003612240576005604051631b3fab5160e11b81526004016107cb9190615afe565b6122a6848460030180548060200260200160405190810160405280929190818152602001828054801561229c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161227e575b5050505050613318565b8460600151156123d657612314848460020180548060200260200160405190810160405280929190818152602001828054801561229c576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161227e575050505050613318565b608085015180516101001015612340576002604051631b3fab5160e11b81526004016107cb9190615afe565b6040860151612350906003615b18565b60ff16815111612376576003604051631b3fab5160e11b81526004016107cb9190615afe565b81518151101561239c576001604051631b3fab5160e11b81526004016107cb9190615afe565b805160018401805461ff00191661010060ff8416021790556123c79060028601906020840190613ca3565b506123d485826001613381565b505b6123e284826002613381565b80516123f79060038501906020840190613ca3565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936124509389939260028a01929190615b34565b60405180910390a16112cf846134dc565b6000610d5e8383613533565b8251600090815b81811015612620576000600188868460208110612493576124936153f5565b6124a091901a601b615a3a565b8985815181106124b2576124b26153f5565b60200260200101518986815181106124cc576124cc6153f5565b60200260200101516040516000815260200160405260405161250a949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561252c573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b0385168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561258d5761258d614319565b600281111561259e5761259e614319565b90525090506001816020015160028111156125bb576125bb614319565b146125d957604051636518c33d60e11b815260040160405180910390fd5b8051600160ff9091161b85161561260357604051633d9ef1f160e21b815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050612474565b5050505050505050565b81518151604051632cbc26bb60e01b8152608083901b67ffffffffffffffff60801b166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156126a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cb91906154da565b1561273c5780156126fa57604051637edeb53960e11b81526001600160401b03831660048201526024016107cb565b6040516001600160401b03831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b600061274783611918565b6001018054612755906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054612781906154f7565b80156127ce5780601f106127a3576101008083540402835291602001916127ce565b820191906000526020600020905b8154815290600101906020018083116127b157829003601f168201915b505050602088015151929350505060008190036127fd5760405162bf199760e01b815260040160405180910390fd5b8560400151518114612822576040516357e0e08360e01b815260040160405180910390fd5b6000816001600160401b0381111561283c5761283c613d1d565b604051908082528060200260200182016040528015612865578160200160208202803683370190505b50905060005b82811015612a095760008860200151828151811061288b5761288b6153f5565b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160401b03168160000151604001516001600160401b0316146129025780516040908101519051631c21951160e11b81526001600160401b0390911660048201526024016107cb565b866001600160401b03168160000151602001516001600160401b03161461295657805160200151604051636c95f1eb60e01b81526001600160401b03808a16600483015290911660248201526044016107cb565b6129e3817f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f83600001516020015184600001516040015189805190602001206040516020016129c894939291909384526001600160401b03928316602085015291166040830152606082015260800190565b60405160208183030381529060405280519060200120613582565b8383815181106129f5576129f56153f5565b60209081029190910101525060010161286b565b506000612a2086838a606001518b6080015161368a565b905080600003612a4e57604051633ee8bd3f60e11b81526001600160401b03871660048201526024016107cb565b60005b83811015610a435760005a905060008a602001518381518110612a7657612a766153f5565b602002602001015190506000612a948a836000015160600151610d12565b90506000816003811115612aaa57612aaa614319565b1480612ac757506003816003811115612ac557612ac5614319565b145b612b1d57815160600151604080516001600160401b03808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a1505050612f19565b60608915612bfc578b8581518110612b3757612b376153f5565b6020908102919091018101510151600454909150600090600160a01b900463ffffffff16612b6588426156df565b1190508080612b8557506003836003811115612b8357612b83614319565b145b612bad576040516354e7e43160e11b81526001600160401b038d1660048201526024016107cb565b8c8681518110612bbf57612bbf6153f5565b602002602001015160000151600014612bf6578c8681518110612be457612be46153f5565b60209081029190910101515160808501525b50612c68565b6000826003811115612c1057612c10614319565b14612c6857825160600151604080516001600160401b03808f16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe65120910160405180910390a150505050612f19565b8251608001516001600160401b031615612d41576000826003811115612c9057612c90614319565b03612d41577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e0e03cae8c85600001516080015186602001516040518463ffffffff1660e01b8152600401612cf193929190615be6565b6020604051808303816000875af1158015612d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3491906154da565b612d415750505050612f19565b60008d604001518681518110612d5957612d596153f5565b6020026020010151905080518460a001515114612da357835160600151604051631cfe6d8b60e01b81526001600160401b03808f16600483015290911660248201526044016107cb565b612db78c85600001516060015160016136c7565b600080612dc586848661376c565b91509150612ddc8e876000015160600151846136c7565b8c15612e33576003826003811115612df657612df6614319565b03612e33576000856003811115612e0f57612e0f614319565b14612e3357855151604051632b11b8d960e01b81526107cb91908390600401615c12565b6002826003811115612e4757612e47614319565b14612e8c576003826003811115612e6057612e60614319565b14612e8c578d866000015160600151836040516349362d1f60e11b81526004016107cb93929190615c2b565b8560000151600001518660000151606001516001600160401b03168f6001600160401b03167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8d8c81518110612ee457612ee46153f5565b602002602001015186865a612ef9908f6156df565b604051612f099493929190615c50565b60405180910390a4505050505050505b600101612a51565b6000826000018281548110612f3857612f386153f5565b9060005260206000200154905092915050565b6040805180820190915260008082526020820152602086015160405163bbe4f6db60e01b81526001600160a01b0380831660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015612fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff39190615c87565b90506001600160a01b038116158061302257506130206001600160a01b03821663aff2afbf60e01b611f93565b155b1561304b5760405163ae9b4ce960e01b81526001600160a01b03821660048201526024016107cb565b60008061306388858c6040015163ffffffff16613820565b9150915060008060006131166040518061010001604052808e81526020018c6001600160401b031681526020018d6001600160a01b031681526020018f608001518152602001896001600160a01b031681526020018f6000015181526020018f6060015181526020018b8152506040516024016130e09190615ca4565b60408051601f198184030181529190526020810180516001600160e01b0316633907753760e01b17905287866113886084613903565b9250925092508261313c578160405163e1cd550960e01b81526004016107cb9190614049565b815160201461316b578151604051631e3be00960e21b81526020600482015260248101919091526044016107cb565b6000828060200190518101906131819190615d70565b9050866001600160a01b03168c6001600160a01b0316146131fd5760006131b28d8a6131ad868a6156df565b613820565b509050868110806131cc5750816131c988836156df565b14155b156131fb5760405163a966e21f60e01b81526004810183905260248101889052604481018290526064016107cb565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b600061323e826301ffc9a760e01b613276565b8015610d61575061326f827fffffffff00000000000000000000000000000000000000000000000000000000613276565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03166301ffc9a760e01b178152825192935060009283928392909183918a617530fa92503d91506000519050828015613301575060208210155b801561330d5750600081115b979650505050505050565b60005b8151811015610ff15760ff83166000908152600360205260408120835190919084908490811061334d5761334d6153f5565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff1916905560010161331b565b60005b8251811015610ab15760008382815181106133a1576133a16153f5565b60200260200101519050600060028111156133be576133be614319565b60ff80871660009081526003602090815260408083206001600160a01b038716845290915290205461010090041660028111156133fd576133fd614319565b1461341e576004604051631b3fab5160e11b81526004016107cb9190615afe565b6001600160a01b0381166134455760405163d6c62c9b60e01b815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561346b5761346b614319565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff1916176101008360028111156134c8576134c8614319565b021790555090505050806001019050613384565b60ff81166105445760ff8082166000908152600260205260409020600101546201000090041661351f57604051631e8ed32560e21b815260040160405180910390fd5b600b805467ffffffffffffffff1916905550565b600081815260018301602052604081205461357a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d61565b506000610d61565b8151805160608085015190830151608080870151940151604051600095869588956135e695919490939192916020019485526001600160a01b039390931660208501526001600160401b039182166040850152606084015216608082015260a00190565b604051602081830303815290604052805190602001208560200151805190602001208660400151805190602001208760a001516040516020016136299190615e2a565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b6000806136988585856139dd565b6001600160401b0387166000908152600a6020908152604080832093835292905220549150505b949350505050565b600060026136d6608085615708565b6001600160401b03166136e9919061572e565b905060006136f78585611d35565b905081613706600160046156df565b901b19168183600381111561371d5761371d614319565b6001600160401b03871660009081526009602052604081209190921b9290921791829161374b608088615a77565b6001600160401b031681526020810191909152604001600020555050505050565b604051630304c3e160e51b815260009060609030906360987c209061379990889088908890600401615ec1565b600060405180830381600087803b1580156137b357600080fd5b505af19250505080156137c4575060015b613803573d8080156137f2576040519150601f19603f3d011682016040523d82523d6000602084013e6137f7565b606091505b50600392509050613818565b50506040805160208101909152600081526002905b935093915050565b60008060008060006138818860405160240161384b91906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166370a0823160e01b17905288886113886084613903565b925092509250826138a7578160405163e1cd550960e01b81526004016107cb9190614049565b60208251146138d6578151604051631e3be00960e21b81526020600482015260248101919091526044016107cb565b818060200190518101906138ea9190615d70565b6138f482886156df565b94509450505050935093915050565b6000606060008361ffff166001600160401b0381111561392557613925613d1d565b6040519080825280601f01601f19166020018201604052801561394f576020820181803683370190505b509150863b6139695763030ed58f60e21b60005260046000fd5b5a8581101561398357632be8ca8b60e21b60005260046000fd5b85900360408104810387106139a3576337c3be2960e01b60005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156139c65750835b808352806000602085013e50955095509592505050565b8251825160009190818303613a0557604051630469ac9960e21b815260040160405180910390fd5b6101018211801590613a1957506101018111155b613a36576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613a60576040516309bde33960e01b815260040160405180910390fd5b80600003613a8d5786600081518110613a7b57613a7b6153f5565b60200260200101519350505050613c5b565b6000816001600160401b03811115613aa757613aa7613d1d565b604051908082528060200260200182016040528015613ad0578160200160208202803683370190505b50905060008080805b85811015613bfa5760006001821b8b811603613b345788851015613b1d578c5160018601958e918110613b0e57613b0e6153f5565b60200260200101519050613b56565b8551600185019487918110613b0e57613b0e6153f5565b8b5160018401938d918110613b4b57613b4b6153f5565b602002602001015190505b600089861015613b86578d5160018701968f918110613b7757613b776153f5565b60200260200101519050613ba8565b8651600186019588918110613b9d57613b9d6153f5565b602002602001015190505b82851115613bc9576040516309bde33960e01b815260040160405180910390fd5b613bd38282613c62565b878481518110613be557613be56153f5565b60209081029190910101525050600101613ad9565b506001850382148015613c0c57508683145b8015613c1757508581145b613c34576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613c4957613c496153f5565b60200260200101519750505050505050505b9392505050565b6000818310613c7a57613c758284613c80565b610d5e565b610d5e83835b60408051600160208201529081018390526060810182905260009060800161366c565b828054828255906000526020600020908101928215613cf8579160200282015b82811115613cf857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613cc3565b50613d04929150613d08565b5090565b5b80821115613d045760008155600101613d09565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613d5557613d55613d1d565b60405290565b60405160a081016001600160401b0381118282101715613d5557613d55613d1d565b60405160c081016001600160401b0381118282101715613d5557613d55613d1d565b604080519081016001600160401b0381118282101715613d5557613d55613d1d565b604051601f8201601f191681016001600160401b0381118282101715613de957613de9613d1d565b604052919050565b60006001600160401b03821115613e0a57613e0a613d1d565b5060051b60200190565b6001600160a01b038116811461054457600080fd5b80356001600160401b0381168114613e4057600080fd5b919050565b801515811461054457600080fd5b8035613e4081613e45565b60006001600160401b03821115613e7757613e77613d1d565b50601f01601f191660200190565b600082601f830112613e9657600080fd5b8135613ea9613ea482613e5e565b613dc1565b818152846020838601011115613ebe57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215613eee57600080fd5b82356001600160401b0380821115613f0557600080fd5b818501915085601f830112613f1957600080fd5b8135613f27613ea482613df1565b81815260059190911b83018401908481019088831115613f4657600080fd5b8585015b83811015613fec57803585811115613f625760008081fd5b86016080818c03601f1901811315613f7a5760008081fd5b613f82613d33565b89830135613f8f81613e14565b81526040613f9e848201613e29565b8b830152606080850135613fb181613e45565b83830152928401359289841115613fca57600091508182fd5b613fd88f8d86880101613e85565b908301525085525050918601918601613f4a565b5098975050505050505050565b60005b83811015614014578181015183820152602001613ffc565b50506000910152565b60008151808452614035816020860160208601613ff9565b601f01601f19169290920160200192915050565b602081526000610d5e602083018461401d565b8060608101831015610d6157600080fd5b60008083601f84011261407f57600080fd5b5081356001600160401b0381111561409657600080fd5b6020830191508360208285010111156140ae57600080fd5b9250929050565b60008083601f8401126140c757600080fd5b5081356001600160401b038111156140de57600080fd5b6020830191508360208260051b85010111156140ae57600080fd5b60008060008060008060008060e0898b03121561411557600080fd5b61411f8a8a61405c565b975060608901356001600160401b038082111561413b57600080fd5b6141478c838d0161406d565b909950975060808b013591508082111561416057600080fd5b61416c8c838d016140b5565b909750955060a08b013591508082111561418557600080fd5b506141928b828c016140b5565b999c989b50969995989497949560c00135949350505050565b6000806000608084860312156141c057600080fd5b6141ca858561405c565b925060608401356001600160401b038111156141e557600080fd5b6141f18682870161406d565b9497909650939450505050565b6001600160a01b0381511682526020810151151560208301526001600160401b03604082015116604083015260006060820151608060608501526136bf608085018261401d565b604080825283519082018190526000906020906060840190828701845b828110156142875781516001600160401b031684529284019290840190600101614262565b50505083810382850152845180825282820190600581901b8301840187850160005b838110156142d757601f198684030185526142c58383516141fe565b948701949250908601906001016142a9565b50909998505050505050505050565b600080604083850312156142f957600080fd5b61430283613e29565b915061431060208401613e29565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b6004811061433f5761433f614319565b9052565b60208101610d61828461432f565b600060a0828403121561436357600080fd5b61436b613d5b565b90508135815261437d60208301613e29565b602082015261438e60408301613e29565b604082015261439f60608301613e29565b60608201526143b060808301613e29565b608082015292915050565b8035613e4081613e14565b803563ffffffff81168114613e4057600080fd5b600082601f8301126143eb57600080fd5b813560206143fb613ea483613df1565b82815260059290921b8401810191818101908684111561441a57600080fd5b8286015b848110156144ea5780356001600160401b038082111561443e5760008081fd5b9088019060a0828b03601f19018113156144585760008081fd5b614460613d5b565b87840135838111156144725760008081fd5b6144808d8a83880101613e85565b82525060408085013561449281613e14565b828a015260606144a38682016143c6565b828401526080915081860135858111156144bd5760008081fd5b6144cb8f8c838a0101613e85565b918401919091525091909301359083015250835291830191830161441e565b509695505050505050565b6000610140828403121561450857600080fd5b614510613d7d565b905061451c8383614351565b815260a08201356001600160401b038082111561453857600080fd5b61454485838601613e85565b602084015260c084013591508082111561455d57600080fd5b61456985838601613e85565b604084015261457a60e085016143bb565b6060840152610100840135608084015261012084013591508082111561459f57600080fd5b506145ac848285016143da565b60a08301525092915050565b600082601f8301126145c957600080fd5b813560206145d9613ea483613df1565b82815260059290921b840181019181810190868411156145f857600080fd5b8286015b848110156144ea5780356001600160401b0381111561461b5760008081fd5b6146298986838b01016144f5565b8452509183019183016145fc565b600082601f83011261464857600080fd5b81356020614658613ea483613df1565b82815260059290921b8401810191818101908684111561467757600080fd5b8286015b848110156144ea5780356001600160401b038082111561469a57600080fd5b818901915089603f8301126146ae57600080fd5b858201356146be613ea482613df1565b81815260059190911b830160400190878101908c8311156146de57600080fd5b604085015b83811015614717578035858111156146fa57600080fd5b6147098f6040838a0101613e85565b8452509189019189016146e3565b5087525050509284019250830161467b565b600082601f83011261473a57600080fd5b8135602061474a613ea483613df1565b8083825260208201915060208460051b87010193508684111561476c57600080fd5b602086015b848110156144ea5780358352918301918301614771565b600082601f83011261479957600080fd5b813560206147a9613ea483613df1565b82815260059290921b840181019181810190868411156147c857600080fd5b8286015b848110156144ea5780356001600160401b03808211156147ec5760008081fd5b9088019060a0828b03601f19018113156148065760008081fd5b61480e613d5b565b614819888501613e29565b81526040808501358481111561482f5760008081fd5b61483d8e8b838901016145b8565b8a84015250606080860135858111156148565760008081fd5b6148648f8c838a0101614637565b838501525060809150818601358581111561487f5760008081fd5b61488d8f8c838a0101614729565b91840191909152509190930135908301525083529183019183016147cc565b600080604083850312156148bf57600080fd5b6001600160401b03833511156148d457600080fd5b6148e18484358501614788565b91506001600160401b03602084013511156148fb57600080fd5b6020830135830184601f82011261491157600080fd5b61491e613ea48235613df1565b81358082526020808301929160051b84010187101561493c57600080fd5b602083015b6020843560051b850101811015614ae2576001600160401b038135111561496757600080fd5b87603f82358601011261497957600080fd5b61498c613ea46020833587010135613df1565b81358501602081810135808452908301929160059190911b016040018a10156149b457600080fd5b604083358701015b83358701602081013560051b01604001811015614ad2576001600160401b03813511156149e857600080fd5b833587018135016040818d03603f19011215614a0357600080fd5b614a0b613d9f565b604082013581526001600160401b0360608301351115614a2a57600080fd5b8c605f606084013584010112614a3f57600080fd5b6040606083013583010135614a56613ea482613df1565b808282526020820191508f60608460051b6060880135880101011115614a7b57600080fd5b6060808601358601015b60608460051b606088013588010101811015614ab257614aa4816143c6565b835260209283019201614a85565b5080602085015250505080855250506020830192506020810190506149bc565b5084525060209283019201614941565b508093505050509250929050565b600080600080600060608688031215614b0857600080fd5b85356001600160401b0380821115614b1f57600080fd5b614b2b89838a016144f5565b96506020880135915080821115614b4157600080fd5b614b4d89838a016140b5565b90965094506040880135915080821115614b6657600080fd5b50614b73888289016140b5565b969995985093965092949392505050565b600060608284031215614b9657600080fd5b604051606081018181106001600160401b0382111715614bb857614bb8613d1d565b6040528235614bc681613e14565b8152614bd4602084016143c6565b60208201526040830135614be781613e14565b60408201529392505050565b600060208284031215614c0557600080fd5b81356001600160401b03811115614c1b57600080fd5b820160a08185031215613c5b57600080fd5b803560ff81168114613e4057600080fd5b600060208284031215614c5057600080fd5b610d5e82614c2d565b60008151808452602080850194506020840160005b83811015614c935781516001600160a01b031687529582019590820190600101614c6e565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614ced60e0840182614c59565b90506040840151601f198483030160c0850152614d0a8282614c59565b95945050505050565b60008060408385031215614d2657600080fd5b614d2f83613e29565b946020939093013593505050565b600060208284031215614d4f57600080fd5b610d5e82613e29565b602081526000610d5e60208301846141fe565b600060208284031215614d7d57600080fd5b8135613c5b81613e14565b600082601f830112614d9957600080fd5b81356020614da9613ea483613df1565b8083825260208201915060208460051b870101935086841115614dcb57600080fd5b602086015b848110156144ea578035614de381613e14565b8352918301918301614dd0565b60006020808385031215614e0357600080fd5b82356001600160401b0380821115614e1a57600080fd5b818501915085601f830112614e2e57600080fd5b8135614e3c613ea482613df1565b81815260059190911b83018401908481019088831115614e5b57600080fd5b8585015b83811015613fec57803585811115614e7657600080fd5b860160c0818c03601f19011215614e8d5760008081fd5b614e95613d7d565b8882013581526040614ea8818401614c2d565b8a8301526060614eb9818501614c2d565b8284015260809150614ecc828501613e53565b9083015260a08381013589811115614ee45760008081fd5b614ef28f8d83880101614d88565b838501525060c0840135915088821115614f0c5760008081fd5b614f1a8e8c84870101614d88565b9083015250845250918601918601614e5f565b80356001600160e01b0381168114613e4057600080fd5b600082601f830112614f5557600080fd5b81356020614f65613ea483613df1565b82815260069290921b84018101918181019086841115614f8457600080fd5b8286015b848110156144ea5760408189031215614fa15760008081fd5b614fa9613d9f565b614fb282613e29565b8152614fbf858301614f2d565b81860152835291830191604001614f88565b600082601f830112614fe257600080fd5b81356020614ff2613ea483613df1565b82815260059290921b8401810191818101908684111561501157600080fd5b8286015b848110156144ea5780356001600160401b03808211156150355760008081fd5b9088019060a0828b03601f190181131561504f5760008081fd5b615057613d5b565b615062888501613e29565b8152604080850135848111156150785760008081fd5b6150868e8b83890101613e85565b8a840152506060935061509a848601613e29565b9082015260806150ab858201613e29565b93820193909352920135908201528352918301918301615015565b600082601f8301126150d757600080fd5b813560206150e7613ea483613df1565b82815260069290921b8401810191818101908684111561510657600080fd5b8286015b848110156144ea57604081890312156151235760008081fd5b61512b613d9f565b81358152848201358582015283529183019160400161510a565b6000602080838503121561515857600080fd5b82356001600160401b038082111561516f57600080fd5b908401906080828703121561518357600080fd5b61518b613d33565b82358281111561519a57600080fd5b830160408189038113156151ad57600080fd5b6151b5613d9f565b8235858111156151c457600080fd5b8301601f81018b136151d557600080fd5b80356151e3613ea482613df1565b81815260069190911b8201890190898101908d83111561520257600080fd5b928a01925b828410156152525785848f03121561521f5760008081fd5b615227613d9f565b843561523281613e14565b815261523f858d01614f2d565b818d0152825292850192908a0190615207565b84525050508287013591508482111561526a57600080fd5b6152768a838501614f44565b8188015283525050828401358281111561528f57600080fd5b61529b88828601614fd1565b858301525060408301359350818411156152b457600080fd5b6152c0878585016150c6565b6040820152606083013560608201528094505050505092915050565b600082825180855260208086019550808260051b84010181860160005b8481101561536d57601f19868403018952815160a06001600160401b038083511686528683015182888801526153318388018261401d565b604085810151841690890152606080860151909316928801929092525060809283015192909501919091525097830197908301906001016152f9565b5090979650505050505050565b6001600160a01b03851681526000602060808184015261539d60808401876152dc565b83810360408581019190915286518083528388019284019060005b818110156153dd578451805184528601518684015293850193918301916001016153b8565b50508094505050505082606083015295945050505050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561546257835180516001600160a01b031684528501516001600160e01b031685840152928401929185019160010161542b565b50508583015187820388850152805180835290840192506000918401905b808310156154bb57835180516001600160401b031683528501516001600160e01b031685830152928401926001929092019190850190615480565b50979650505050505050565b602081526000610d5e602083018461540b565b6000602082840312156154ec57600080fd5b8151613c5b81613e45565b600181811c9082168061550b57607f821691505b60208210810361552b57634e487b7160e01b600052602260045260246000fd5b50919050565b600080835461553f816154f7565b60018281168015615557576001811461556c5761559b565b60ff198416875282151583028701945061559b565b8760005260208060002060005b858110156155925781548a820152908401908201615579565b50505082870194505b50929695505050505050565b600081546155b4816154f7565b8085526020600183811680156155d157600181146155eb57615619565b60ff1985168884015283151560051b880183019550615619565b866000528260002060005b858110156156115781548a82018601529083019084016155f6565b890184019650505b505050505092915050565b604081526000615637604083018561401d565b8281036020840152614d0a81856155a7565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111561567f5761567f615649565b5092915050565b60408152600061569960408301856152dc565b8281036020840152614d0a818561540b565b6000602082840312156156bd57600080fd5b81356001600160401b038111156156d357600080fd5b6136bf84828501614788565b81810381811115610d6157610d61615649565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b0380841680615722576157226156f2565b92169190910692915050565b8082028115828204841417610d6157610d61615649565b80518252600060206001600160401b0381840151168185015260408084015160a0604087015261577860a087018261401d565b905060608501518682036060880152615791828261401d565b608087810151898303918a01919091528051808352908601935060009250908501905b808310156154bb57835180516001600160a01b03168352860151868301529285019260019290920191908401906157b4565b602081526000610d5e6020830184615745565b60808152600061580c6080830187615745565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561584a57600080fd5b835161585581613e45565b60208501519093506001600160401b0381111561587157600080fd5b8401601f8101861361588257600080fd5b8051615890613ea482613e5e565b8181528760208385010111156158a557600080fd5b6158b6826020830160208601613ff9565b809450505050604084015190509250925092565b601f821115610ff1576000816000526020600020601f850160051c810160208610156158f35750805b601f850160051c820191505b81811015615912578281556001016158ff565b505050505050565b81516001600160401b0381111561593357615933613d1d565b6159478161594184546154f7565b846158ca565b602080601f83116001811461597c57600084156159645750858301515b600019600386901b1c1916600185901b178555615912565b600085815260208120601f198616915b828110156159ab5788860151825594840194600190910190840161598c565b50858210156159c95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208152600082546001600160a01b038116602084015260ff8160a01c16151560408401526001600160401b038160a81c16606084015250608080830152610d5e60a08301600185016155a7565b80820180821115610d6157610d61615649565b60ff8181168382160190811115610d6157610d61615649565b8183823760009101908152919050565b828152606082602083013760800192915050565b60006001600160401b0380841680615a9157615a916156f2565b92169190910492915050565b600060208284031215615aaf57600080fd5b610d5e826143c6565b6000808335601e19843603018112615acf57600080fd5b8301803591506001600160401b03821115615ae957600080fd5b6020019150368190038213156140ae57600080fd5b6020810160068310615b1257615b12614319565b91905290565b60ff818116838216029081169081811461567f5761567f615649565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b81811015615b8c5784546001600160a01b031683526001948501949284019201615b67565b50508481036060860152865180825290820192508187019060005b81811015615bcc5782516001600160a01b031685529383019391830191600101615ba7565b50505060ff851660808501525090505b9695505050505050565b60006001600160401b03808616835280851660208401525060606040830152614d0a606083018461401d565b8281526040602082015260006136bf604083018461401d565b6001600160401b03848116825283166020820152606081016136bf604083018461432f565b848152615c60602082018561432f565b608060408201526000615c76608083018561401d565b905082606083015295945050505050565b600060208284031215615c9957600080fd5b8151613c5b81613e14565b6020815260008251610100806020850152615cc361012085018361401d565b91506020850151615cdf60408601826001600160401b03169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615d1960a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615d36848361401d565b935060c08701519150808685030160e0870152615d53848361401d565b935060e0870151915080868503018387015250615bdc838261401d565b600060208284031215615d8257600080fd5b5051919050565b600082825180855260208086019550808260051b84010181860160005b8481101561536d57601f19868403018952815160a08151818652615dcc8287018261401d565b9150506001600160a01b03868301511686860152604063ffffffff8184015116818701525060608083015186830382880152615e08838261401d565b6080948501519790940196909652505098840198925090830190600101615da6565b602081526000610d5e6020830184615d89565b60008282518085526020808601955060208260051b8401016020860160005b8481101561536d57601f19868403018952615e7883835161401d565b98840198925090830190600101615e5c565b60008151808452602080850194506020840160005b83811015614c9357815163ffffffff1687529582019590820190600101615e9f565b60608152600084518051606084015260208101516001600160401b0380821660808601528060408401511660a08601528060608401511660c08601528060808401511660e0860152505050602085015161014080610100850152615f296101a085018361401d565b91506040870151605f198086850301610120870152615f48848361401d565b935060608901519150615f65838701836001600160a01b03169052565b608089015161016087015260a0890151925080868503016101808701525050615f8e8282615d89565b9150508281036020840152615fa38186615e3d565b90508281036040840152615bdc8185615e8a56fea164736f6c6343000818000a",
}
var OffRampABI = OffRampMetaData.ABI
@@ -314,6 +314,29 @@ func (_OffRamp *OffRampCallerSession) CcipReceive(arg0 ClientAny2EVMMessage) err
return _OffRamp.Contract.CcipReceive(&_OffRamp.CallOpts, arg0)
}
+func (_OffRamp *OffRampCaller) GetAllSourceChainConfigs(opts *bind.CallOpts) ([]uint64, []OffRampSourceChainConfig, error) {
+ var out []interface{}
+ err := _OffRamp.contract.Call(opts, &out, "getAllSourceChainConfigs")
+
+ if err != nil {
+ return *new([]uint64), *new([]OffRampSourceChainConfig), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64)
+ out1 := *abi.ConvertType(out[1], new([]OffRampSourceChainConfig)).(*[]OffRampSourceChainConfig)
+
+ return out0, out1, err
+
+}
+
+func (_OffRamp *OffRampSession) GetAllSourceChainConfigs() ([]uint64, []OffRampSourceChainConfig, error) {
+ return _OffRamp.Contract.GetAllSourceChainConfigs(&_OffRamp.CallOpts)
+}
+
+func (_OffRamp *OffRampCallerSession) GetAllSourceChainConfigs() ([]uint64, []OffRampSourceChainConfig, error) {
+ return _OffRamp.Contract.GetAllSourceChainConfigs(&_OffRamp.CallOpts)
+}
+
func (_OffRamp *OffRampCaller) GetDynamicConfig(opts *bind.CallOpts) (OffRampDynamicConfig, error) {
var out []interface{}
err := _OffRamp.contract.Call(opts, &out, "getDynamicConfig")
@@ -2457,6 +2480,8 @@ func (_OffRamp *OffRamp) Address() common.Address {
type OffRampInterface interface {
CcipReceive(opts *bind.CallOpts, arg0 ClientAny2EVMMessage) error
+ GetAllSourceChainConfigs(opts *bind.CallOpts) ([]uint64, []OffRampSourceChainConfig, error)
+
GetDynamicConfig(opts *bind.CallOpts) (OffRampDynamicConfig, error)
GetExecutionState(opts *bind.CallOpts, sourceChainSelector uint64, sequenceNumber uint64) (uint8, error)
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 4223fee2fc..8d8ed108a8 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
@@ -23,7 +23,7 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo
multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin 0b541232e49727e947dc164eadf35963c66e67576f21baa0ecaa06a8833148ed
multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 04b6b261dd71925670bf4d904aaf7bf08543452009feefb88e07d4c49d12e969
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
-offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 8d788a8fe2ed337311672a1c832e211a191d3fa4327d9141bc8c0f47bb5e29b4
+offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin cff099545fa50fcfd411c16c9cac754a0ba71ef2590840c0732d42604224200f
onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin cdf282d410d2dc38e47b360d00ab69a262ab240577071a49c2be49aceea5f5fa
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b
price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2
From c4907f3e2dcbd2a55d5541d311e477288a6b0f13 Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Tue, 8 Oct 2024 15:29:44 +0200
Subject: [PATCH 27/32] Pool to support rebasing mint call (#1490)
This basic pool supports rebasing minting
---
contracts/gas-snapshots/ccip.gas-snapshot | 5 +-
.../scripts/native_solc_compile_all_ccip | 1 +
.../BurnWithFromMintRebasingTokenPool.sol | 49 +
.../ccip/pools/BurnWithFromMintTokenPool.sol | 6 +-
.../ccip/test/helpers/ERC20RebasingHelper.sol | 27 +
.../BurnWithFromMintRebasingTokenPool.t.sol | 87 +
...burn_with_from_mint_rebasing_token_pool.go | 2818 +++++++++++++++++
.../burn_with_from_mint_token_pool.go | 4 +-
...rapper-dependency-versions-do-not-edit.txt | 3 +-
core/gethwrappers/ccip/go_generate.go | 1 +
10 files changed, 2995 insertions(+), 6 deletions(-)
create mode 100644 contracts/src/v0.8/ccip/pools/BurnWithFromMintRebasingTokenPool.sol
create mode 100644 contracts/src/v0.8/ccip/test/helpers/ERC20RebasingHelper.sol
create mode 100644 contracts/src/v0.8/ccip/test/pools/BurnWithFromMintRebasingTokenPool.t.sol
create mode 100644 core/gethwrappers/ccip/generated/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index ec36725f6a..40e53aef0b 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -33,7 +33,10 @@ BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112391)
BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842)
BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271)
BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050)
-BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24170)
+BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24168)
+BurnWithFromMintTokenPool_releaseOrMint:test_Setup_Success() (gas: 24547)
+BurnWithFromMintTokenPool_releaseOrMint:test_releaseOrMint_NegativeMintAmount_reverts() (gas: 93840)
+BurnWithFromMintTokenPool_releaseOrMint:test_releaseOrMint_Success() (gas: 93423)
CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431)
CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334693)
CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 466117)
diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip
index a8f2b2f233..0274380cfe 100755
--- a/contracts/scripts/native_solc_compile_all_ccip
+++ b/contracts/scripts/native_solc_compile_all_ccip
@@ -86,6 +86,7 @@ compileContract ccip/pools/BurnWithFromMintTokenPool.sol
compileContract ccip/pools/LockReleaseTokenPoolAndProxy.sol
compileContract ccip/pools/BurnMintTokenPoolAndProxy.sol
compileContract ccip/pools/BurnWithFromMintTokenPoolAndProxy.sol
+compileContract ccip/pools/BurnWithFromMintRebasingTokenPool.sol
compileContract ccip/pools/TokenPool.sol
diff --git a/contracts/src/v0.8/ccip/pools/BurnWithFromMintRebasingTokenPool.sol b/contracts/src/v0.8/ccip/pools/BurnWithFromMintRebasingTokenPool.sol
new file mode 100644
index 0000000000..16acdb03b6
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/BurnWithFromMintRebasingTokenPool.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.24;
+
+import {IBurnMintERC20} from "../../shared/token/ERC20/IBurnMintERC20.sol";
+
+import {Pool} from "../libraries/Pool.sol";
+import {BurnWithFromMintTokenPool} from "./BurnWithFromMintTokenPool.sol";
+
+/// @notice This pool mints and burns a 3rd-party token.
+/// @dev This contract is a variant of BurnMintTokenPool that uses `burn(from, amount)`.
+/// @dev This contract supports minting tokens that do not mint the exact amount they are asked to mint. This can be
+/// used for rebasing tokens. NOTE: for true rebasing support, the lockOrBurn method must also be updated to support
+/// relaying the correct amount.
+contract BurnWithFromMintRebasingTokenPool is BurnWithFromMintTokenPool {
+ error NegativeMintAmount(uint256 amountBurned);
+
+ string public constant override typeAndVersion = "BurnWithFromMintRebasingTokenPool 1.5.0";
+
+ constructor(
+ IBurnMintERC20 token,
+ address[] memory allowlist,
+ address rmnProxy,
+ address router
+ ) BurnWithFromMintTokenPool(token, allowlist, rmnProxy, router) {}
+
+ /// @notice Mint tokens from the pool to the recipient
+ /// @dev The _validateReleaseOrMint check is an essential security check
+ function releaseOrMint(
+ Pool.ReleaseOrMintInV1 calldata releaseOrMintIn
+ ) external virtual override returns (Pool.ReleaseOrMintOutV1 memory) {
+ _validateReleaseOrMint(releaseOrMintIn);
+
+ uint256 balancePre = IBurnMintERC20(address(i_token)).balanceOf(releaseOrMintIn.receiver);
+
+ // Mint to the receiver
+ IBurnMintERC20(address(i_token)).mint(releaseOrMintIn.receiver, releaseOrMintIn.amount);
+
+ uint256 balancePost = IBurnMintERC20(address(i_token)).balanceOf(releaseOrMintIn.receiver);
+
+ // Mint should not reduce the number of tokens in the receiver, if it does it will revert the call.
+ if (balancePost < balancePre) {
+ revert NegativeMintAmount(balancePre - balancePost);
+ }
+
+ emit Minted(msg.sender, releaseOrMintIn.receiver, balancePost - balancePre);
+
+ return Pool.ReleaseOrMintOutV1({destinationAmount: balancePost - balancePre});
+ }
+}
diff --git a/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol b/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol
index 56e0ab1b25..b999be6981 100644
--- a/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol
@@ -18,8 +18,6 @@ import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok
contract BurnWithFromMintTokenPool is BurnMintTokenPoolAbstract, ITypeAndVersion {
using SafeERC20 for IBurnMintERC20;
- string public constant override typeAndVersion = "BurnWithFromMintTokenPool 1.5.0";
-
constructor(
IBurnMintERC20 token,
address[] memory allowlist,
@@ -35,4 +33,8 @@ contract BurnWithFromMintTokenPool is BurnMintTokenPoolAbstract, ITypeAndVersion
function _burn(uint256 amount) internal virtual override {
IBurnMintERC20(address(i_token)).burn(address(this), amount);
}
+
+ function typeAndVersion() external pure virtual override returns (string memory) {
+ return "BurnWithFromMintTokenPool 1.5.0";
+ }
}
diff --git a/contracts/src/v0.8/ccip/test/helpers/ERC20RebasingHelper.sol b/contracts/src/v0.8/ccip/test/helpers/ERC20RebasingHelper.sol
new file mode 100644
index 0000000000..e5ef16d060
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/helpers/ERC20RebasingHelper.sol
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.24;
+
+import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol";
+
+contract ERC20RebasingHelper is ERC20 {
+ uint16 public s_multiplierPercentage = 100;
+ bool public s_mintShouldBurn = false;
+
+ constructor() ERC20("Rebasing", "REB") {}
+
+ function mint(address to, uint256 amount) external {
+ if (!s_mintShouldBurn) {
+ _mint(to, amount * s_multiplierPercentage / 100);
+ return;
+ }
+ _burn(to, amount * s_multiplierPercentage / 100);
+ }
+
+ function setMultiplierPercentage(uint16 multiplierPercentage) external {
+ s_multiplierPercentage = multiplierPercentage;
+ }
+
+ function setMintShouldBurn(bool mintShouldBurn) external {
+ s_mintShouldBurn = mintShouldBurn;
+ }
+}
diff --git a/contracts/src/v0.8/ccip/test/pools/BurnWithFromMintRebasingTokenPool.t.sol b/contracts/src/v0.8/ccip/test/pools/BurnWithFromMintRebasingTokenPool.t.sol
new file mode 100644
index 0000000000..c88f030c56
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/pools/BurnWithFromMintRebasingTokenPool.t.sol
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.24;
+
+import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
+
+import {Pool} from "../../libraries/Pool.sol";
+import {BurnWithFromMintRebasingTokenPool} from "../../pools/BurnWithFromMintRebasingTokenPool.sol";
+import {BurnMintSetup} from "./BurnMintSetup.t.sol";
+
+import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
+import {ERC20RebasingHelper} from "../helpers/ERC20RebasingHelper.sol";
+
+contract BurnWithFromMintRebasingTokenPoolSetup is BurnMintSetup {
+ BurnWithFromMintRebasingTokenPool internal s_pool;
+ ERC20RebasingHelper internal s_rebasingToken;
+
+ function setUp() public virtual override {
+ BurnMintSetup.setUp();
+
+ s_rebasingToken = new ERC20RebasingHelper();
+
+ s_pool = new BurnWithFromMintRebasingTokenPool(
+ IBurnMintERC20(address(s_rebasingToken)), new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ );
+
+ _applyChainUpdates(address(s_pool));
+
+ deal(address(s_rebasingToken), OWNER, 1e18);
+
+ vm.startPrank(s_burnMintOffRamp);
+ }
+}
+
+contract BurnWithFromMintTokenPool_releaseOrMint is BurnWithFromMintRebasingTokenPoolSetup {
+ function test_Setup_Success() public view {
+ assertEq(address(s_rebasingToken), address(s_pool.getToken()));
+ assertEq(address(s_mockRMN), s_pool.getRmnProxy());
+ assertEq(false, s_pool.getAllowListEnabled());
+ assertEq(type(uint256).max, s_rebasingToken.allowance(address(s_pool), address(s_pool)));
+ assertEq("BurnWithFromMintRebasingTokenPool 1.5.0", s_pool.typeAndVersion());
+ }
+
+ function test_releaseOrMint_Success() public {
+ uint256 amount = 1000;
+ uint256 balancePre = s_rebasingToken.balanceOf(address(OWNER));
+
+ Pool.ReleaseOrMintOutV1 memory releaseOrMintOut = s_pool.releaseOrMint(_getReleaseOrMintIn(amount));
+
+ assertEq(amount, releaseOrMintOut.destinationAmount);
+ assertEq(balancePre + amount, s_rebasingToken.balanceOf(address(OWNER)));
+ }
+
+ function testFuzz_releaseOrMint_rebasing_success(uint16 multiplierPercentage) public {
+ uint256 amount = 1000;
+ uint256 expectedAmount = amount * multiplierPercentage / 100;
+ s_rebasingToken.setMultiplierPercentage(multiplierPercentage);
+
+ uint256 balancePre = s_rebasingToken.balanceOf(address(OWNER));
+
+ Pool.ReleaseOrMintOutV1 memory releaseOrMintOut = s_pool.releaseOrMint(_getReleaseOrMintIn(amount));
+
+ assertEq(expectedAmount, releaseOrMintOut.destinationAmount);
+ assertEq(balancePre + expectedAmount, s_rebasingToken.balanceOf(address(OWNER)));
+ }
+
+ function test_releaseOrMint_NegativeMintAmount_reverts() public {
+ uint256 amount = 1000;
+ s_rebasingToken.setMintShouldBurn(true);
+
+ vm.expectRevert(abi.encodeWithSelector(BurnWithFromMintRebasingTokenPool.NegativeMintAmount.selector, amount));
+
+ s_pool.releaseOrMint(_getReleaseOrMintIn(amount));
+ }
+
+ function _getReleaseOrMintIn(uint256 amount) internal view returns (Pool.ReleaseOrMintInV1 memory) {
+ return Pool.ReleaseOrMintInV1({
+ originalSender: bytes(""),
+ receiver: OWNER,
+ amount: amount,
+ localToken: address(s_rebasingToken),
+ remoteChainSelector: DEST_CHAIN_SELECTOR,
+ sourcePoolAddress: abi.encode(s_remoteBurnMintPool),
+ sourcePoolData: "",
+ offchainTokenData: ""
+ });
+ }
+}
diff --git a/core/gethwrappers/ccip/generated/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go b/core/gethwrappers/ccip/generated/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go
new file mode 100644
index 0000000000..899d3cd65d
--- /dev/null
+++ b/core/gethwrappers/ccip/generated/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go
@@ -0,0 +1,2818 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package burn_with_from_mint_rebasing_token_pool
+
+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 PoolLockOrBurnInV1 struct {
+ Receiver []byte
+ RemoteChainSelector uint64
+ OriginalSender common.Address
+ Amount *big.Int
+ LocalToken common.Address
+}
+
+type PoolLockOrBurnOutV1 struct {
+ DestTokenAddress []byte
+ DestPoolData []byte
+}
+
+type PoolReleaseOrMintInV1 struct {
+ OriginalSender []byte
+ RemoteChainSelector uint64
+ Receiver common.Address
+ Amount *big.Int
+ LocalToken common.Address
+ SourcePoolAddress []byte
+ SourcePoolData []byte
+ OffchainTokenData []byte
+}
+
+type PoolReleaseOrMintOutV1 struct {
+ DestinationAmount *big.Int
+}
+
+type RateLimiterConfig struct {
+ IsEnabled bool
+ Capacity *big.Int
+ Rate *big.Int
+}
+
+type RateLimiterTokenBucket struct {
+ Tokens *big.Int
+ LastUpdated uint32
+ IsEnabled bool
+ Capacity *big.Int
+ Rate *big.Int
+}
+
+type TokenPoolChainUpdate struct {
+ RemoteChainSelector uint64
+ Allowed bool
+ RemotePoolAddress []byte
+ RemoteTokenAddress []byte
+ OutboundRateLimiterConfig RateLimiterConfig
+ InboundRateLimiterConfig RateLimiterConfig
+}
+
+var BurnWithFromMintRebasingTokenPoolMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountBurned\",\"type\":\"uint256\"}],\"name\":\"NegativeMintAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60e06040523480156200001157600080fd5b5060405162004742380380620047428339810160408190526200003491620008c8565b83838383838383833380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000197565b5050506001600160a01b0384161580620000e757506001600160a01b038116155b80620000fa57506001600160a01b038216155b1562000119576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016c576040805160008152602081019091526200016c908462000242565b5062000189925050506001600160a01b038516306000196200039f565b505050505050505062000b04565b336001600160a01b03821603620001f15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c05162000263576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002ee576000838281518110620002875762000287620009d8565b60209081029190910101519050620002a160028262000485565b15620002e4576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010162000266565b5060005b81518110156200039a576000828281518110620003135762000313620009d8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200033f575062000391565b6200034c600282620004a5565b156200038f576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002f2565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004179190620009ee565b62000423919062000a1e565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200047f91869190620004bc16565b50505050565b60006200049c836001600160a01b0384166200058d565b90505b92915050565b60006200049c836001600160a01b03841662000691565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200050b906001600160a01b038516908490620006e3565b8051909150156200039a57808060200190518101906200052c919062000a34565b6200039a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b6000818152600183016020526040812054801562000686576000620005b460018362000a5f565b8554909150600090620005ca9060019062000a5f565b905080821462000636576000866000018281548110620005ee57620005ee620009d8565b9060005260206000200154905080876000018481548110620006145762000614620009d8565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200064a576200064a62000a75565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200049f565b60009150506200049f565b6000818152600183016020526040812054620006da575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200049f565b5060006200049f565b6060620006f48484600085620006fc565b949350505050565b6060824710156200075f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200077d919062000ab1565b60006040518083038185875af1925050503d8060008114620007bc576040519150601f19603f3d011682016040523d82523d6000602084013e620007c1565b606091505b509092509050620007d587838387620007e0565b979650505050505050565b60608315620008545782516000036200084c576001600160a01b0385163b6200084c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620006f4565b620006f483838151156200086b5781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000acf565b6001600160a01b03811681146200089d57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008c38162000887565b919050565b60008060008060808587031215620008df57600080fd5b8451620008ec8162000887565b602086810151919550906001600160401b03808211156200090c57600080fd5b818801915088601f8301126200092157600080fd5b815181811115620009365762000936620008a0565b8060051b604051601f19603f830116810181811085821117156200095e576200095e620008a0565b60405291825284820192508381018501918b8311156200097d57600080fd5b938501935b82851015620009a6576200099685620008b6565b8452938501939285019262000982565b809850505050505050620009bd60408601620008b6565b9150620009cd60608601620008b6565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156200049f576200049f62000a08565b60006020828403121562000a4757600080fd5b8151801515811462000a5857600080fd5b9392505050565b818103818111156200049f576200049f62000a08565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aa857818101518382015260200162000a8e565b50506000910152565b6000825162000ac581846020870162000a8b565b9190910192915050565b602081526000825180602084015262000af081604085016020870162000a8b565b601f01601f19169190910160400192915050565b60805160a05160c051613bb362000b8f600039600081816104a901528181611958015261233c015260008181610483015281816117890152611c0e0152600081816102050152818161025a015281816106ca015281816107a50152818161087b015281816116a901528181611b2e01528181611d26015281816122d201526125270152613bb36000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639a4575b9116100ee578063c4bffe2b11610097578063db6327dc11610071578063db6327dc1461046e578063dc0bd97114610481578063e0351e13146104a7578063f2fde38b146104cd57600080fd5b8063c4bffe2b14610433578063c75eea9c14610448578063cf7401f31461045b57600080fd5b8063b0f479a1116100c8578063b0f479a1146103ef578063b79465801461040d578063c0d786551461042057600080fd5b80639a4575b91461034b578063a7cd63b71461036b578063af58d59f1461038057600080fd5b806354c8a4f31161015b57806379ba50971161013557806379ba5097146102ff5780637d54534e146103075780638926f54f1461031a5780638da5cb5b1461032d57600080fd5b806354c8a4f3146102b95780636d3d1a58146102ce57806378a010b2146102ec57600080fd5b806321df0da71161018c57806321df0da714610203578063240028e81461024a578063390775371461029757600080fd5b806301ffc9a7146101b35780630a2fd493146101db578063181f5a77146101fb575b600080fd5b6101c66101c1366004612cca565b6104e0565b60405190151581526020015b60405180910390f35b6101ee6101e9366004612d29565b6105c5565b6040516101d29190612da8565b6101ee610675565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b6101c6610258366004612de8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102aa6102a5366004612e05565b610691565b604051905181526020016101d2565b6102cc6102c7366004612e8d565b610a15565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610225565b6102cc6102fa366004612ef9565b610a90565b6102cc610bff565b6102cc610315366004612de8565b610cfc565b6101c6610328366004612d29565b610d4b565b60005473ffffffffffffffffffffffffffffffffffffffff16610225565b61035e610359366004612f7c565b610d62565b6040516101d29190612fb7565b610373610e09565b6040516101d29190613017565b61039361038e366004612d29565b610e1a565b6040516101d2919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610225565b6101ee61041b366004612d29565b610eef565b6102cc61042e366004612de8565b610f1a565b61043b610ff5565b6040516101d29190613071565b610393610456366004612d29565b6110ad565b6102cc6104693660046131d9565b61117f565b6102cc61047c36600461321e565b611208565b7f0000000000000000000000000000000000000000000000000000000000000000610225565b7f00000000000000000000000000000000000000000000000000000000000000006101c6565b6102cc6104db366004612de8565b61168e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061057357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105bf57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906105f090613260565b80601f016020809104026020016040519081016040528092919081815260200182805461061c90613260565b80156106695780601f1061063e57610100808354040283529160200191610669565b820191906000526020600020905b81548152906001019060200180831161064c57829003601f168201915b50505050509050919050565b604051806060016040528060278152602001613b806027913981565b6040805160208101909152600081526106b16106ac8361335e565b6116a2565b600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166370a082316106ff6060860160408701612de8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610768573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078c9190613453565b905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166340c10f196107da6060860160408701612de8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608601356024820152604401600060405180830381600087803b15801561084a57600080fd5b505af115801561085e573d6000803e3d6000fd5b50600092505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690506370a082316108b26060870160408801612de8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561091b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093f9190613453565b90508181101561099157610953818361349b565b6040517f02164a2d00000000000000000000000000000000000000000000000000000000815260040161098891815260200190565b60405180910390fd5b6109a16060850160408601612de8565b73ffffffffffffffffffffffffffffffffffffffff16337f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f06109e3858561349b565b60405190815260200160405180910390a360405180602001604052808383610a0b919061349b565b9052949350505050565b610a1d6118d3565b610a8a8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061195692505050565b50505050565b610a986118d3565b610aa183610d4b565b610ae3576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610988565b67ffffffffffffffff831660009081526007602052604081206004018054610b0a90613260565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3690613260565b8015610b835780601f10610b5857610100808354040283529160200191610b83565b820191906000526020600020905b815481529060010190602001808311610b6657829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610bb28385836134fe565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610bf193929190613618565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610988565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d046118d3565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006105bf600567ffffffffffffffff8416611b0c565b6040805180820190915260608082526020820152610d87610d828361367c565b611b27565b610d948260600135611cf1565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610dee84602001602081019061041b9190612d29565b81526040805160208181019092526000815291015292915050565b6060610e156002611d9a565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105bf90611da7565b67ffffffffffffffff811660009081526007602052604090206005018054606091906105f090613260565b610f226118d3565b73ffffffffffffffffffffffffffffffffffffffff8116610f6f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b606060006110036005611d9a565b90506000815167ffffffffffffffff811115611021576110216130b3565b60405190808252806020026020018201604052801561104a578160200160208202803683370190505b50905060005b82518110156110a65782818151811061106b5761106b61371e565b60200260200101518282815181106110855761108561371e565b67ffffffffffffffff90921660209283029190910190910152600101611050565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105bf90611da7565b60085473ffffffffffffffffffffffffffffffffffffffff1633148015906111bf575060005473ffffffffffffffffffffffffffffffffffffffff163314155b156111f8576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610988565b611203838383611e59565b505050565b6112106118d3565b60005b8181101561120357600083838381811061122f5761122f61371e565b9050602002810190611241919061374d565b61124a9061378b565b905061125f8160800151826020015115611f43565b6112728160a00151826020015115611f43565b80602001511561156e5780516112949060059067ffffffffffffffff1661207c565b6112d95780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610988565b60408101515115806112ee5750606081015151155b15611325576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c17909116961515029590951790985590810151940151938116931690910291909117600382015591519091906004820190611506908261383f565b506060820151600582019061151b908261383f565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506115619493929190613959565b60405180910390a1611685565b80516115869060059067ffffffffffffffff16612088565b6115cb5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610988565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906116346004830182612c7c565b611642600583016000612c7c565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101611213565b6116966118d3565b61169f81612094565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146117375760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610988565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180991906139f2565b15611840576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61184d8160200151612189565b600061185c82602001516105c5565b9050805160001480611880575080805190602001208260a001518051906020012014155b156118bd578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016109889190612da8565b6118cf826020015183606001516122af565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610988565b565b7f00000000000000000000000000000000000000000000000000000000000000006119ad576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611a435760008382815181106119cd576119cd61371e565b602002602001015190506119eb8160026122f690919063ffffffff16565b15611a3a5760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016119b0565b5060005b8151811015611203576000828281518110611a6457611a6461371e565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611aa85750611b04565b611ab3600282612318565b15611b025760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611a47565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611bbc5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610988565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e91906139f2565b15611cc5576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd2816040015161233a565b611cdf81602001516123b9565b61169f81602001518260600151612507565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639dc29fac90604401600060405180830381600087803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b5050505050565b60606000611b208361254b565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611e3582606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611e19919061349b565b85608001516fffffffffffffffffffffffffffffffff166125a6565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611e6283610d4b565b611ea4576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610988565b611eaf826000611f43565b67ffffffffffffffff83166000908152600760205260409020611ed290836125d0565b611edd816000611f43565b67ffffffffffffffff83166000908152600760205260409020611f0390600201826125d0565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611f3693929190613a0f565b60405180910390a1505050565b81511561200a5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611f99575060408201516fffffffffffffffffffffffffffffffff16155b15611fd257816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016109889190613a92565b80156118cf576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580612043575060208201516fffffffffffffffffffffffffffffffff1615155b156118cf57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016109889190613a92565b6000611b208383612772565b6000611b2083836127c1565b3373ffffffffffffffffffffffffffffffffffffffff821603612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610988565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61219281610d4b565b6121d4576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610988565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612253573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227791906139f2565b61169f576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610988565b67ffffffffffffffff821660009081526007602052604090206118cf90600201827f00000000000000000000000000000000000000000000000000000000000000006128b4565b6000611b208373ffffffffffffffffffffffffffffffffffffffff84166127c1565b6000611b208373ffffffffffffffffffffffffffffffffffffffff8416612772565b7f00000000000000000000000000000000000000000000000000000000000000001561169f5761236b600282612c37565b61169f576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610988565b6123c281610d4b565b612404576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610988565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa15801561247d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a19190613ace565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461169f576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610988565b67ffffffffffffffff821660009081526007602052604090206118cf90827f00000000000000000000000000000000000000000000000000000000000000006128b4565b60608160000180548060200260200160405190810160405280929190818152602001828054801561066957602002820191906000526020600020905b8154815260200190600101908083116125875750505050509050919050565b60006125c5856125b68486613aeb565b6125c09087613b02565b612c66565b90505b949350505050565b81546000906125f990700100000000000000000000000000000000900463ffffffff164261349b565b9050801561269b5760018301548354612641916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166125a6565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546126c1916fffffffffffffffffffffffffffffffff9081169116612c66565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611f36908490613a92565b60008181526001830160205260408120546127b9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105bf565b5060006105bf565b600081815260018301602052604081205480156128aa5760006127e560018361349b565b85549091506000906127f99060019061349b565b905080821461285e5760008660000182815481106128195761281961371e565b906000526020600020015490508087600001848154811061283c5761283c61371e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061286f5761286f613b15565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105bf565b60009150506105bf565b825474010000000000000000000000000000000000000000900460ff1615806128db575081155b156128e557505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061292b90700100000000000000000000000000000000900463ffffffff164261349b565b905080156129eb578183111561296d576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546129a79083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166125a6565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612aa25773ffffffffffffffffffffffffffffffffffffffff8416612a4a576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610988565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610988565b84831015612bb55760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612ae6908261349b565b612af0878a61349b565b612afa9190613b02565b612b049190613b44565b905073ffffffffffffffffffffffffffffffffffffffff8616612b5d576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610988565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610988565b612bbf858461349b565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611b20565b6000818310612c755781611b20565b5090919050565b508054612c8890613260565b6000825580601f10612c98575050565b601f01602090049060005260206000209081019061169f91905b80821115612cc65760008155600101612cb2565b5090565b600060208284031215612cdc57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611b2057600080fd5b803567ffffffffffffffff81168114612d2457600080fd5b919050565b600060208284031215612d3b57600080fd5b611b2082612d0c565b6000815180845260005b81811015612d6a57602081850181015186830182015201612d4e565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000611b206020830184612d44565b73ffffffffffffffffffffffffffffffffffffffff8116811461169f57600080fd5b8035612d2481612dbb565b600060208284031215612dfa57600080fd5b8135611b2081612dbb565b600060208284031215612e1757600080fd5b813567ffffffffffffffff811115612e2e57600080fd5b82016101008185031215611b2057600080fd5b60008083601f840112612e5357600080fd5b50813567ffffffffffffffff811115612e6b57600080fd5b6020830191508360208260051b8501011115612e8657600080fd5b9250929050565b60008060008060408587031215612ea357600080fd5b843567ffffffffffffffff80821115612ebb57600080fd5b612ec788838901612e41565b90965094506020870135915080821115612ee057600080fd5b50612eed87828801612e41565b95989497509550505050565b600080600060408486031215612f0e57600080fd5b612f1784612d0c565b9250602084013567ffffffffffffffff80821115612f3457600080fd5b818601915086601f830112612f4857600080fd5b813581811115612f5757600080fd5b876020828501011115612f6957600080fd5b6020830194508093505050509250925092565b600060208284031215612f8e57600080fd5b813567ffffffffffffffff811115612fa557600080fd5b820160a08185031215611b2057600080fd5b602081526000825160406020840152612fd36060840182612d44565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084830301604085015261300e8282612d44565b95945050505050565b6020808252825182820181905260009190848201906040850190845b8181101561306557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613033565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561306557835167ffffffffffffffff168352928401929184019160010161308d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715613106576131066130b3565b60405290565b60405160c0810167ffffffffffffffff81118282101715613106576131066130b3565b801515811461169f57600080fd5b8035612d248161312f565b80356fffffffffffffffffffffffffffffffff81168114612d2457600080fd5b60006060828403121561317a57600080fd5b6040516060810181811067ffffffffffffffff8211171561319d5761319d6130b3565b60405290508082356131ae8161312f565b81526131bc60208401613148565b60208201526131cd60408401613148565b60408201525092915050565b600080600060e084860312156131ee57600080fd5b6131f784612d0c565b92506132068560208601613168565b91506132158560808601613168565b90509250925092565b6000806020838503121561323157600080fd5b823567ffffffffffffffff81111561324857600080fd5b61325485828601612e41565b90969095509350505050565b600181811c9082168061327457607f821691505b6020821081036132ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f8301126132c457600080fd5b813567ffffffffffffffff808211156132df576132df6130b3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613325576133256130b3565b8160405283815286602085880101111561333e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561337157600080fd5b6133796130e2565b823567ffffffffffffffff8082111561339157600080fd5b61339d368387016132b3565b83526133ab60208601612d0c565b60208401526133bc60408601612ddd565b6040840152606085013560608401526133d760808601612ddd565b608084015260a08501359150808211156133f057600080fd5b6133fc368387016132b3565b60a084015260c085013591508082111561341557600080fd5b613421368387016132b3565b60c084015260e085013591508082111561343a57600080fd5b50613447368286016132b3565b60e08301525092915050565b60006020828403121561346557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105bf576105bf61346c565b601f821115611203576000816000526020600020601f850160051c810160208610156134d75750805b601f850160051c820191505b818110156134f6578281556001016134e3565b505050505050565b67ffffffffffffffff831115613516576135166130b3565b61352a836135248354613260565b836134ae565b6000601f84116001811461357c57600085156135465750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611d93565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156135cb57868501358255602094850194600190920191016135ab565b5086821015613606577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60408152600061362b6040830186612d44565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561368e57600080fd5b60405160a0810167ffffffffffffffff82821081831117156136b2576136b26130b3565b8160405284359150808211156136c757600080fd5b506136d4368286016132b3565b8252506136e360208401612d0c565b602082015260408301356136f681612dbb565b604082015260608381013590820152608083013561371381612dbb565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261378157600080fd5b9190910192915050565b6000610140823603121561379e57600080fd5b6137a661310c565b6137af83612d0c565b81526137bd6020840161313d565b6020820152604083013567ffffffffffffffff808211156137dd57600080fd5b6137e9368387016132b3565b6040840152606085013591508082111561380257600080fd5b5061380f368286016132b3565b6060830152506138223660808501613168565b60808201526138343660e08501613168565b60a082015292915050565b815167ffffffffffffffff811115613859576138596130b3565b61386d816138678454613260565b846134ae565b602080601f8311600181146138c0576000841561388a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556134f6565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561390d578886015182559484019460019091019084016138ee565b508582101561394957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff8716835280602084015261397d81840187612d44565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506139bb9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e083015261300e565b600060208284031215613a0457600080fd5b8151611b208161312f565b67ffffffffffffffff8416815260e08101613a5b60208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526125c8565b606081016105bf82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b600060208284031215613ae057600080fd5b8151611b2081612dbb565b80820281158282048414176105bf576105bf61346c565b808201808211156105bf576105bf61346c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082613b7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fe4275726e5769746846726f6d4d696e745265626173696e67546f6b656e506f6f6c20312e352e30a164736f6c6343000818000a",
+}
+
+var BurnWithFromMintRebasingTokenPoolABI = BurnWithFromMintRebasingTokenPoolMetaData.ABI
+
+var BurnWithFromMintRebasingTokenPoolBin = BurnWithFromMintRebasingTokenPoolMetaData.Bin
+
+func DeployBurnWithFromMintRebasingTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, allowlist []common.Address, rmnProxy common.Address, router common.Address) (common.Address, *types.Transaction, *BurnWithFromMintRebasingTokenPool, error) {
+ parsed, err := BurnWithFromMintRebasingTokenPoolMetaData.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(BurnWithFromMintRebasingTokenPoolBin), backend, token, allowlist, rmnProxy, router)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &BurnWithFromMintRebasingTokenPool{address: address, abi: *parsed, BurnWithFromMintRebasingTokenPoolCaller: BurnWithFromMintRebasingTokenPoolCaller{contract: contract}, BurnWithFromMintRebasingTokenPoolTransactor: BurnWithFromMintRebasingTokenPoolTransactor{contract: contract}, BurnWithFromMintRebasingTokenPoolFilterer: BurnWithFromMintRebasingTokenPoolFilterer{contract: contract}}, nil
+}
+
+type BurnWithFromMintRebasingTokenPool struct {
+ address common.Address
+ abi abi.ABI
+ BurnWithFromMintRebasingTokenPoolCaller
+ BurnWithFromMintRebasingTokenPoolTransactor
+ BurnWithFromMintRebasingTokenPoolFilterer
+}
+
+type BurnWithFromMintRebasingTokenPoolCaller struct {
+ contract *bind.BoundContract
+}
+
+type BurnWithFromMintRebasingTokenPoolTransactor struct {
+ contract *bind.BoundContract
+}
+
+type BurnWithFromMintRebasingTokenPoolFilterer struct {
+ contract *bind.BoundContract
+}
+
+type BurnWithFromMintRebasingTokenPoolSession struct {
+ Contract *BurnWithFromMintRebasingTokenPool
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type BurnWithFromMintRebasingTokenPoolCallerSession struct {
+ Contract *BurnWithFromMintRebasingTokenPoolCaller
+ CallOpts bind.CallOpts
+}
+
+type BurnWithFromMintRebasingTokenPoolTransactorSession struct {
+ Contract *BurnWithFromMintRebasingTokenPoolTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type BurnWithFromMintRebasingTokenPoolRaw struct {
+ Contract *BurnWithFromMintRebasingTokenPool
+}
+
+type BurnWithFromMintRebasingTokenPoolCallerRaw struct {
+ Contract *BurnWithFromMintRebasingTokenPoolCaller
+}
+
+type BurnWithFromMintRebasingTokenPoolTransactorRaw struct {
+ Contract *BurnWithFromMintRebasingTokenPoolTransactor
+}
+
+func NewBurnWithFromMintRebasingTokenPool(address common.Address, backend bind.ContractBackend) (*BurnWithFromMintRebasingTokenPool, error) {
+ abi, err := abi.JSON(strings.NewReader(BurnWithFromMintRebasingTokenPoolABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindBurnWithFromMintRebasingTokenPool(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPool{address: address, abi: abi, BurnWithFromMintRebasingTokenPoolCaller: BurnWithFromMintRebasingTokenPoolCaller{contract: contract}, BurnWithFromMintRebasingTokenPoolTransactor: BurnWithFromMintRebasingTokenPoolTransactor{contract: contract}, BurnWithFromMintRebasingTokenPoolFilterer: BurnWithFromMintRebasingTokenPoolFilterer{contract: contract}}, nil
+}
+
+func NewBurnWithFromMintRebasingTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*BurnWithFromMintRebasingTokenPoolCaller, error) {
+ contract, err := bindBurnWithFromMintRebasingTokenPool(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolCaller{contract: contract}, nil
+}
+
+func NewBurnWithFromMintRebasingTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*BurnWithFromMintRebasingTokenPoolTransactor, error) {
+ contract, err := bindBurnWithFromMintRebasingTokenPool(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolTransactor{contract: contract}, nil
+}
+
+func NewBurnWithFromMintRebasingTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*BurnWithFromMintRebasingTokenPoolFilterer, error) {
+ contract, err := bindBurnWithFromMintRebasingTokenPool(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolFilterer{contract: contract}, nil
+}
+
+func bindBurnWithFromMintRebasingTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := BurnWithFromMintRebasingTokenPoolMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _BurnWithFromMintRebasingTokenPool.Contract.BurnWithFromMintRebasingTokenPoolCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.BurnWithFromMintRebasingTokenPoolTransactor.contract.Transfer(opts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.BurnWithFromMintRebasingTokenPoolTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _BurnWithFromMintRebasingTokenPool.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.contract.Transfer(opts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getAllowList")
+
+ if err != nil {
+ return *new([]common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetAllowList() ([]common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetAllowList(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetAllowList() ([]common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetAllowList(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getAllowListEnabled")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetAllowListEnabled() (bool, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetAllowListEnabled(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetAllowListEnabled() (bool, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetAllowListEnabled(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector)
+
+ if err != nil {
+ return *new(RateLimiterTokenBucket), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector)
+
+ if err != nil {
+ return *new(RateLimiterTokenBucket), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getRateLimitAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRateLimitAdmin(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRateLimitAdmin(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getRemotePool", remoteChainSelector)
+
+ if err != nil {
+ return *new([]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetRemotePool(remoteChainSelector uint64) ([]byte, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRemotePool(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetRemotePool(remoteChainSelector uint64) ([]byte, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRemotePool(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector)
+
+ if err != nil {
+ return *new([]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRemoteToken(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRemoteToken(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getRmnProxy")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetRmnProxy() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRmnProxy(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetRmnProxy() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRmnProxy(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getRouter")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetRouter() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRouter(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetRouter() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetRouter(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getSupportedChains")
+
+ if err != nil {
+ return *new([]uint64), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetSupportedChains() ([]uint64, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetSupportedChains(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetSupportedChains(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "getToken")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) GetToken() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetToken(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) GetToken() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.GetToken(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.IsSupportedChain(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.IsSupportedChain(&_BurnWithFromMintRebasingTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "isSupportedToken", token)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.IsSupportedToken(&_BurnWithFromMintRebasingTokenPool.CallOpts, token)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.IsSupportedToken(&_BurnWithFromMintRebasingTokenPool.CallOpts, token)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) Owner() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.Owner(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) Owner() (common.Address, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.Owner(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SupportsInterface(&_BurnWithFromMintRebasingTokenPool.CallOpts, interfaceId)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SupportsInterface(&_BurnWithFromMintRebasingTokenPool.CallOpts, interfaceId)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _BurnWithFromMintRebasingTokenPool.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) TypeAndVersion() (string, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.TypeAndVersion(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolCallerSession) TypeAndVersion() (string, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.TypeAndVersion(&_BurnWithFromMintRebasingTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) AcceptOwnership() (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.AcceptOwnership(&_BurnWithFromMintRebasingTokenPool.TransactOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.AcceptOwnership(&_BurnWithFromMintRebasingTokenPool.TransactOpts)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.ApplyAllowListUpdates(&_BurnWithFromMintRebasingTokenPool.TransactOpts, removes, adds)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.ApplyAllowListUpdates(&_BurnWithFromMintRebasingTokenPool.TransactOpts, removes, adds)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, chains []TokenPoolChainUpdate) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "applyChainUpdates", chains)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) ApplyChainUpdates(chains []TokenPoolChainUpdate) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.ApplyChainUpdates(&_BurnWithFromMintRebasingTokenPool.TransactOpts, chains)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) ApplyChainUpdates(chains []TokenPoolChainUpdate) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.ApplyChainUpdates(&_BurnWithFromMintRebasingTokenPool.TransactOpts, chains)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.LockOrBurn(&_BurnWithFromMintRebasingTokenPool.TransactOpts, lockOrBurnIn)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.LockOrBurn(&_BurnWithFromMintRebasingTokenPool.TransactOpts, lockOrBurnIn)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.ReleaseOrMint(&_BurnWithFromMintRebasingTokenPool.TransactOpts, releaseOrMintIn)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.ReleaseOrMint(&_BurnWithFromMintRebasingTokenPool.TransactOpts, releaseOrMintIn)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SetChainRateLimiterConfig(&_BurnWithFromMintRebasingTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SetChainRateLimiterConfig(&_BurnWithFromMintRebasingTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SetRateLimitAdmin(&_BurnWithFromMintRebasingTokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SetRateLimitAdmin(&_BurnWithFromMintRebasingTokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "setRemotePool", remoteChainSelector, remotePoolAddress)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) SetRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SetRemotePool(&_BurnWithFromMintRebasingTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) SetRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SetRemotePool(&_BurnWithFromMintRebasingTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "setRouter", newRouter)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SetRouter(&_BurnWithFromMintRebasingTokenPool.TransactOpts, newRouter)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.SetRouter(&_BurnWithFromMintRebasingTokenPool.TransactOpts, newRouter)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.TransferOwnership(&_BurnWithFromMintRebasingTokenPool.TransactOpts, to)
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintRebasingTokenPool.Contract.TransferOwnership(&_BurnWithFromMintRebasingTokenPool.TransactOpts, to)
+}
+
+type BurnWithFromMintRebasingTokenPoolAllowListAddIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolAllowListAdd
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolAllowListAddIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolAllowListAdd)
+ 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(BurnWithFromMintRebasingTokenPoolAllowListAdd)
+ 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 *BurnWithFromMintRebasingTokenPoolAllowListAddIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolAllowListAddIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolAllowListAdd struct {
+ Sender common.Address
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolAllowListAddIterator, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "AllowListAdd")
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolAllowListAddIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolAllowListAdd) (event.Subscription, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "AllowListAdd")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolAllowListAdd)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "AllowListAdd", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*BurnWithFromMintRebasingTokenPoolAllowListAdd, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolAllowListAdd)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolAllowListRemoveIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolAllowListRemove
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolAllowListRemoveIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolAllowListRemove)
+ 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(BurnWithFromMintRebasingTokenPoolAllowListRemove)
+ 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 *BurnWithFromMintRebasingTokenPoolAllowListRemoveIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolAllowListRemoveIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolAllowListRemove struct {
+ Sender common.Address
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolAllowListRemoveIterator, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "AllowListRemove")
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolAllowListRemoveIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolAllowListRemove) (event.Subscription, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "AllowListRemove")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolAllowListRemove)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "AllowListRemove", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*BurnWithFromMintRebasingTokenPoolAllowListRemove, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolAllowListRemove)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolBurnedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolBurned
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolBurnedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolBurned)
+ 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(BurnWithFromMintRebasingTokenPoolBurned)
+ 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 *BurnWithFromMintRebasingTokenPoolBurnedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolBurnedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolBurned struct {
+ Sender common.Address
+ Amount *big.Int
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnWithFromMintRebasingTokenPoolBurnedIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "Burned", senderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolBurnedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolBurned, sender []common.Address) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "Burned", 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(BurnWithFromMintRebasingTokenPoolBurned)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "Burned", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseBurned(log types.Log) (*BurnWithFromMintRebasingTokenPoolBurned, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolBurned)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "Burned", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolChainAddedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolChainAdded
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolChainAddedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolChainAdded)
+ 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(BurnWithFromMintRebasingTokenPoolChainAdded)
+ 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 *BurnWithFromMintRebasingTokenPoolChainAddedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolChainAddedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolChainAdded struct {
+ RemoteChainSelector uint64
+ RemoteToken []byte
+ OutboundRateLimiterConfig RateLimiterConfig
+ InboundRateLimiterConfig RateLimiterConfig
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolChainAddedIterator, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "ChainAdded")
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolChainAddedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolChainAdded) (event.Subscription, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "ChainAdded")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolChainAdded)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "ChainAdded", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseChainAdded(log types.Log) (*BurnWithFromMintRebasingTokenPoolChainAdded, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolChainAdded)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolChainConfiguredIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolChainConfigured
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolChainConfiguredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolChainConfigured)
+ 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(BurnWithFromMintRebasingTokenPoolChainConfigured)
+ 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 *BurnWithFromMintRebasingTokenPoolChainConfiguredIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolChainConfiguredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolChainConfigured struct {
+ RemoteChainSelector uint64
+ OutboundRateLimiterConfig RateLimiterConfig
+ InboundRateLimiterConfig RateLimiterConfig
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolChainConfiguredIterator, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "ChainConfigured")
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolChainConfiguredIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolChainConfigured) (event.Subscription, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "ChainConfigured")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolChainConfigured)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "ChainConfigured", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseChainConfigured(log types.Log) (*BurnWithFromMintRebasingTokenPoolChainConfigured, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolChainConfigured)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolChainRemovedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolChainRemoved
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolChainRemovedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolChainRemoved)
+ 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(BurnWithFromMintRebasingTokenPoolChainRemoved)
+ 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 *BurnWithFromMintRebasingTokenPoolChainRemovedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolChainRemovedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolChainRemoved struct {
+ RemoteChainSelector uint64
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolChainRemovedIterator, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "ChainRemoved")
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolChainRemovedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolChainRemoved) (event.Subscription, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "ChainRemoved")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolChainRemoved)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "ChainRemoved", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseChainRemoved(log types.Log) (*BurnWithFromMintRebasingTokenPoolChainRemoved, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolChainRemoved)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolConfigChangedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolConfigChanged
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolConfigChangedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolConfigChanged)
+ 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(BurnWithFromMintRebasingTokenPoolConfigChanged)
+ 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 *BurnWithFromMintRebasingTokenPoolConfigChangedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolConfigChangedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolConfigChanged struct {
+ Config RateLimiterConfig
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolConfigChangedIterator, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "ConfigChanged")
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolConfigChangedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolConfigChanged) (event.Subscription, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "ConfigChanged")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolConfigChanged)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "ConfigChanged", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseConfigChanged(log types.Log) (*BurnWithFromMintRebasingTokenPoolConfigChanged, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolConfigChanged)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolLockedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolLocked
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolLockedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolLocked)
+ 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(BurnWithFromMintRebasingTokenPoolLocked)
+ 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 *BurnWithFromMintRebasingTokenPoolLockedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolLockedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolLocked struct {
+ Sender common.Address
+ Amount *big.Int
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnWithFromMintRebasingTokenPoolLockedIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "Locked", senderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolLockedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolLocked, sender []common.Address) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "Locked", 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(BurnWithFromMintRebasingTokenPoolLocked)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "Locked", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseLocked(log types.Log) (*BurnWithFromMintRebasingTokenPoolLocked, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolLocked)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "Locked", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolMintedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolMinted
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolMintedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolMinted)
+ 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(BurnWithFromMintRebasingTokenPoolMinted)
+ 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 *BurnWithFromMintRebasingTokenPoolMintedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolMintedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolMinted struct {
+ Sender common.Address
+ Recipient common.Address
+ Amount *big.Int
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnWithFromMintRebasingTokenPoolMintedIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var recipientRule []interface{}
+ for _, recipientItem := range recipient {
+ recipientRule = append(recipientRule, recipientItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolMintedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var recipientRule []interface{}
+ for _, recipientItem := range recipient {
+ recipientRule = append(recipientRule, recipientItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolMinted)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "Minted", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseMinted(log types.Log) (*BurnWithFromMintRebasingTokenPoolMinted, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolMinted)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "Minted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolOwnershipTransferRequestedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested)
+ 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(BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested)
+ 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 *BurnWithFromMintRebasingTokenPoolOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnWithFromMintRebasingTokenPoolOwnershipTransferRequestedIterator, 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 := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolOwnershipTransferRequestedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested, 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 := _BurnWithFromMintRebasingTokenPool.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(BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested)
+ if err := _BurnWithFromMintRebasingTokenPool.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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolOwnershipTransferredIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolOwnershipTransferred)
+ 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(BurnWithFromMintRebasingTokenPoolOwnershipTransferred)
+ 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 *BurnWithFromMintRebasingTokenPoolOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnWithFromMintRebasingTokenPoolOwnershipTransferredIterator, 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 := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolOwnershipTransferredIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolOwnershipTransferred, 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 := _BurnWithFromMintRebasingTokenPool.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(BurnWithFromMintRebasingTokenPoolOwnershipTransferred)
+ if err := _BurnWithFromMintRebasingTokenPool.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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*BurnWithFromMintRebasingTokenPoolOwnershipTransferred, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolOwnershipTransferred)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolReleasedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolReleased
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolReleasedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolReleased)
+ 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(BurnWithFromMintRebasingTokenPoolReleased)
+ 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 *BurnWithFromMintRebasingTokenPoolReleasedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolReleasedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolReleased struct {
+ Sender common.Address
+ Recipient common.Address
+ Amount *big.Int
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnWithFromMintRebasingTokenPoolReleasedIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var recipientRule []interface{}
+ for _, recipientItem := range recipient {
+ recipientRule = append(recipientRule, recipientItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolReleasedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var recipientRule []interface{}
+ for _, recipientItem := range recipient {
+ recipientRule = append(recipientRule, recipientItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolReleased)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "Released", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseReleased(log types.Log) (*BurnWithFromMintRebasingTokenPoolReleased, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolReleased)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "Released", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolRemotePoolSetIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolRemotePoolSet
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolRemotePoolSetIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolRemotePoolSet)
+ 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(BurnWithFromMintRebasingTokenPoolRemotePoolSet)
+ 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 *BurnWithFromMintRebasingTokenPoolRemotePoolSetIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolRemotePoolSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolRemotePoolSet struct {
+ RemoteChainSelector uint64
+ PreviousPoolAddress []byte
+ RemotePoolAddress []byte
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterRemotePoolSet(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnWithFromMintRebasingTokenPoolRemotePoolSetIterator, error) {
+
+ var remoteChainSelectorRule []interface{}
+ for _, remoteChainSelectorItem := range remoteChainSelector {
+ remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "RemotePoolSet", remoteChainSelectorRule)
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolRemotePoolSetIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "RemotePoolSet", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchRemotePoolSet(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolRemotePoolSet, remoteChainSelector []uint64) (event.Subscription, error) {
+
+ var remoteChainSelectorRule []interface{}
+ for _, remoteChainSelectorItem := range remoteChainSelector {
+ remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem)
+ }
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "RemotePoolSet", remoteChainSelectorRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolRemotePoolSet)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "RemotePoolSet", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseRemotePoolSet(log types.Log) (*BurnWithFromMintRebasingTokenPoolRemotePoolSet, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolRemotePoolSet)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "RemotePoolSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolRouterUpdatedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolRouterUpdated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolRouterUpdatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolRouterUpdated)
+ 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(BurnWithFromMintRebasingTokenPoolRouterUpdated)
+ 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 *BurnWithFromMintRebasingTokenPoolRouterUpdatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolRouterUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolRouterUpdated struct {
+ OldRouter common.Address
+ NewRouter common.Address
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolRouterUpdatedIterator, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "RouterUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolRouterUpdatedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolRouterUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "RouterUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolRouterUpdated)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "RouterUpdated", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*BurnWithFromMintRebasingTokenPoolRouterUpdated, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolRouterUpdated)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type BurnWithFromMintRebasingTokenPoolTokensConsumedIterator struct {
+ Event *BurnWithFromMintRebasingTokenPoolTokensConsumed
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolTokensConsumedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(BurnWithFromMintRebasingTokenPoolTokensConsumed)
+ 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(BurnWithFromMintRebasingTokenPoolTokensConsumed)
+ 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 *BurnWithFromMintRebasingTokenPoolTokensConsumedIterator) Error() error {
+ return it.fail
+}
+
+func (it *BurnWithFromMintRebasingTokenPoolTokensConsumedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type BurnWithFromMintRebasingTokenPoolTokensConsumed struct {
+ Tokens *big.Int
+ Raw types.Log
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolTokensConsumedIterator, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.FilterLogs(opts, "TokensConsumed")
+ if err != nil {
+ return nil, err
+ }
+ return &BurnWithFromMintRebasingTokenPoolTokensConsumedIterator{contract: _BurnWithFromMintRebasingTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolTokensConsumed) (event.Subscription, error) {
+
+ logs, sub, err := _BurnWithFromMintRebasingTokenPool.contract.WatchLogs(opts, "TokensConsumed")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(BurnWithFromMintRebasingTokenPoolTokensConsumed)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "TokensConsumed", 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 (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*BurnWithFromMintRebasingTokenPoolTokensConsumed, error) {
+ event := new(BurnWithFromMintRebasingTokenPoolTokensConsumed)
+ if err := _BurnWithFromMintRebasingTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["AllowListAdd"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseAllowListAdd(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["AllowListRemove"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseAllowListRemove(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["Burned"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseBurned(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["ChainAdded"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseChainAdded(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["ChainConfigured"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseChainConfigured(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["ChainRemoved"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseChainRemoved(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["ConfigChanged"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseConfigChanged(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["Locked"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseLocked(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["Minted"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseMinted(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["OwnershipTransferRequested"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseOwnershipTransferRequested(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["OwnershipTransferred"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseOwnershipTransferred(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["Released"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseReleased(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["RemotePoolSet"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseRemotePoolSet(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["RouterUpdated"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseRouterUpdated(log)
+ case _BurnWithFromMintRebasingTokenPool.abi.Events["TokensConsumed"].ID:
+ return _BurnWithFromMintRebasingTokenPool.ParseTokensConsumed(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (BurnWithFromMintRebasingTokenPoolAllowListAdd) Topic() common.Hash {
+ return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8")
+}
+
+func (BurnWithFromMintRebasingTokenPoolAllowListRemove) Topic() common.Hash {
+ return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566")
+}
+
+func (BurnWithFromMintRebasingTokenPoolBurned) Topic() common.Hash {
+ return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7")
+}
+
+func (BurnWithFromMintRebasingTokenPoolChainAdded) Topic() common.Hash {
+ return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2")
+}
+
+func (BurnWithFromMintRebasingTokenPoolChainConfigured) Topic() common.Hash {
+ return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b")
+}
+
+func (BurnWithFromMintRebasingTokenPoolChainRemoved) Topic() common.Hash {
+ return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916")
+}
+
+func (BurnWithFromMintRebasingTokenPoolConfigChanged) Topic() common.Hash {
+ return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19")
+}
+
+func (BurnWithFromMintRebasingTokenPoolLocked) Topic() common.Hash {
+ return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008")
+}
+
+func (BurnWithFromMintRebasingTokenPoolMinted) Topic() common.Hash {
+ return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0")
+}
+
+func (BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (BurnWithFromMintRebasingTokenPoolOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (BurnWithFromMintRebasingTokenPoolReleased) Topic() common.Hash {
+ return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52")
+}
+
+func (BurnWithFromMintRebasingTokenPoolRemotePoolSet) Topic() common.Hash {
+ return common.HexToHash("0xdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf")
+}
+
+func (BurnWithFromMintRebasingTokenPoolRouterUpdated) Topic() common.Hash {
+ return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684")
+}
+
+func (BurnWithFromMintRebasingTokenPoolTokensConsumed) Topic() common.Hash {
+ return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a")
+}
+
+func (_BurnWithFromMintRebasingTokenPool *BurnWithFromMintRebasingTokenPool) Address() common.Address {
+ return _BurnWithFromMintRebasingTokenPool.address
+}
+
+type BurnWithFromMintRebasingTokenPoolInterface interface {
+ GetAllowList(opts *bind.CallOpts) ([]common.Address, error)
+
+ GetAllowListEnabled(opts *bind.CallOpts) (bool, error)
+
+ GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error)
+
+ GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error)
+
+ GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error)
+
+ GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
+
+ GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
+
+ GetRmnProxy(opts *bind.CallOpts) (common.Address, error)
+
+ GetRouter(opts *bind.CallOpts) (common.Address, error)
+
+ GetSupportedChains(opts *bind.CallOpts) ([]uint64, error)
+
+ GetToken(opts *bind.CallOpts) (common.Address, error)
+
+ IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error)
+
+ IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
+
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error)
+
+ ApplyChainUpdates(opts *bind.TransactOpts, chains []TokenPoolChainUpdate) (*types.Transaction, error)
+
+ LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error)
+
+ ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error)
+
+ SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error)
+
+ SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error)
+
+ SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
+
+ SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ FilterAllowListAdd(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolAllowListAddIterator, error)
+
+ WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolAllowListAdd) (event.Subscription, error)
+
+ ParseAllowListAdd(log types.Log) (*BurnWithFromMintRebasingTokenPoolAllowListAdd, error)
+
+ FilterAllowListRemove(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolAllowListRemoveIterator, error)
+
+ WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolAllowListRemove) (event.Subscription, error)
+
+ ParseAllowListRemove(log types.Log) (*BurnWithFromMintRebasingTokenPoolAllowListRemove, error)
+
+ FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnWithFromMintRebasingTokenPoolBurnedIterator, error)
+
+ WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolBurned, sender []common.Address) (event.Subscription, error)
+
+ ParseBurned(log types.Log) (*BurnWithFromMintRebasingTokenPoolBurned, error)
+
+ FilterChainAdded(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolChainAddedIterator, error)
+
+ WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolChainAdded) (event.Subscription, error)
+
+ ParseChainAdded(log types.Log) (*BurnWithFromMintRebasingTokenPoolChainAdded, error)
+
+ FilterChainConfigured(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolChainConfiguredIterator, error)
+
+ WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolChainConfigured) (event.Subscription, error)
+
+ ParseChainConfigured(log types.Log) (*BurnWithFromMintRebasingTokenPoolChainConfigured, error)
+
+ FilterChainRemoved(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolChainRemovedIterator, error)
+
+ WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolChainRemoved) (event.Subscription, error)
+
+ ParseChainRemoved(log types.Log) (*BurnWithFromMintRebasingTokenPoolChainRemoved, error)
+
+ FilterConfigChanged(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolConfigChangedIterator, error)
+
+ WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolConfigChanged) (event.Subscription, error)
+
+ ParseConfigChanged(log types.Log) (*BurnWithFromMintRebasingTokenPoolConfigChanged, error)
+
+ FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnWithFromMintRebasingTokenPoolLockedIterator, error)
+
+ WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolLocked, sender []common.Address) (event.Subscription, error)
+
+ ParseLocked(log types.Log) (*BurnWithFromMintRebasingTokenPoolLocked, error)
+
+ FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnWithFromMintRebasingTokenPoolMintedIterator, error)
+
+ WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error)
+
+ ParseMinted(log types.Log) (*BurnWithFromMintRebasingTokenPoolMinted, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnWithFromMintRebasingTokenPoolOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*BurnWithFromMintRebasingTokenPoolOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnWithFromMintRebasingTokenPoolOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*BurnWithFromMintRebasingTokenPoolOwnershipTransferred, error)
+
+ FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnWithFromMintRebasingTokenPoolReleasedIterator, error)
+
+ WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error)
+
+ ParseReleased(log types.Log) (*BurnWithFromMintRebasingTokenPoolReleased, error)
+
+ FilterRemotePoolSet(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnWithFromMintRebasingTokenPoolRemotePoolSetIterator, error)
+
+ WatchRemotePoolSet(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolRemotePoolSet, remoteChainSelector []uint64) (event.Subscription, error)
+
+ ParseRemotePoolSet(log types.Log) (*BurnWithFromMintRebasingTokenPoolRemotePoolSet, error)
+
+ FilterRouterUpdated(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolRouterUpdatedIterator, error)
+
+ WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolRouterUpdated) (event.Subscription, error)
+
+ ParseRouterUpdated(log types.Log) (*BurnWithFromMintRebasingTokenPoolRouterUpdated, error)
+
+ FilterTokensConsumed(opts *bind.FilterOpts) (*BurnWithFromMintRebasingTokenPoolTokensConsumedIterator, error)
+
+ WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintRebasingTokenPoolTokensConsumed) (event.Subscription, error)
+
+ ParseTokensConsumed(log types.Log) (*BurnWithFromMintRebasingTokenPoolTokensConsumed, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
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 9ba0cacd45..5ce5bf9f1d 100644
--- a/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go
+++ b/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go
@@ -82,8 +82,8 @@ type TokenPoolChainUpdate struct {
}
var BurnWithFromMintTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b506040516200450b3803806200450b8339810160408190526200003491620008c0565b8383838333806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200018f565b5050506001600160a01b0384161580620000e357506001600160a01b038116155b80620000f657506001600160a01b038216155b1562000115576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c05262000168576040805160008152602081019091526200016890846200023a565b5062000185925050506001600160a01b0385163060001962000397565b5050505062000afc565b336001600160a01b03821603620001e95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200025b576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002e65760008382815181106200027f576200027f620009d0565b60209081029190910101519050620002996002826200047d565b15620002dc576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200025e565b5060005b8151811015620003925760008282815181106200030b576200030b620009d0565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000337575062000389565b620003446002826200049d565b1562000387576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002ea565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040f9190620009e6565b6200041b919062000a16565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200047791869190620004b416565b50505050565b600062000494836001600160a01b03841662000585565b90505b92915050565b600062000494836001600160a01b03841662000689565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000503906001600160a01b038516908490620006db565b80519091501562000392578080602001905181019062000524919062000a2c565b620003925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b600081815260018301602052604081205480156200067e576000620005ac60018362000a57565b8554909150600090620005c29060019062000a57565b90508082146200062e576000866000018281548110620005e657620005e6620009d0565b90600052602060002001549050808760000184815481106200060c576200060c620009d0565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000642576200064262000a6d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000497565b600091505062000497565b6000818152600183016020526040812054620006d25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000497565b50600062000497565b6060620006ec8484600085620006f4565b949350505050565b606082471015620007575760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b0316858760405162000775919062000aa9565b60006040518083038185875af1925050503d8060008114620007b4576040519150601f19603f3d011682016040523d82523d6000602084013e620007b9565b606091505b509092509050620007cd87838387620007d8565b979650505050505050565b606083156200084c57825160000362000844576001600160a01b0385163b620008445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620006ec565b620006ec8383815115620008635781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000ac7565b6001600160a01b03811681146200089557600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008bb816200087f565b919050565b60008060008060808587031215620008d757600080fd5b8451620008e4816200087f565b602086810151919550906001600160401b03808211156200090457600080fd5b818801915088601f8301126200091957600080fd5b8151818111156200092e576200092e62000898565b8060051b604051601f19603f8301168101818110858211171562000956576200095662000898565b60405291825284820192508381018501918b8311156200097557600080fd5b938501935b828510156200099e576200098e85620008ae565b845293850193928501926200097a565b809850505050505050620009b560408601620008ae565b9150620009c560608601620008ae565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009f957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000497576200049762000a00565b60006020828403121562000a3f57600080fd5b8151801515811462000a5057600080fd5b9392505050565b8181038181111562000497576200049762000a00565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aa057818101518382015260200162000a86565b50506000910152565b6000825162000abd81846020870162000a83565b9190910192915050565b602081526000825180602084015262000ae881604085016020870162000a83565b601f01601f19169190910160400192915050565b60805160a05160c05161399262000b79600039600081816104dd01528181611777015261215b0152600081816104b7015281816115a80152611a2d0152600081816102390152818161028e015281816106e0015281816114c80152818161194d01528181611b45015281816120f1015261234601526139926000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639a4575b9116100ee578063c4bffe2b11610097578063db6327dc11610071578063db6327dc146104a2578063dc0bd971146104b5578063e0351e13146104db578063f2fde38b1461050157600080fd5b8063c4bffe2b14610467578063c75eea9c1461047c578063cf7401f31461048f57600080fd5b8063b0f479a1116100c8578063b0f479a114610423578063b794658014610441578063c0d786551461045457600080fd5b80639a4575b91461037f578063a7cd63b71461039f578063af58d59f146103b457600080fd5b806354c8a4f31161015b57806379ba50971161013557806379ba5097146103335780637d54534e1461033b5780638926f54f1461034e5780638da5cb5b1461036157600080fd5b806354c8a4f3146102ed5780636d3d1a581461030257806378a010b21461032057600080fd5b806321df0da71161018c57806321df0da714610237578063240028e81461027e57806339077537146102cb57600080fd5b806301ffc9a7146101b35780630a2fd493146101db578063181f5a77146101fb575b600080fd5b6101c66101c1366004612ae9565b610514565b60405190151581526020015b60405180910390f35b6101ee6101e9366004612b48565b6105f9565b6040516101d29190612bc7565b6101ee6040518060400160405280601f81526020017f4275726e5769746846726f6d4d696e74546f6b656e506f6f6c20312e352e300081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b6101c661028c366004612c07565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102de6102d9366004612c24565b6106a9565b604051905181526020016101d2565b6103006102fb366004612cac565b61082f565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610259565b61030061032e366004612d18565b6108aa565b610300610a1e565b610300610349366004612c07565b610b1b565b6101c661035c366004612b48565b610b6a565b60005473ffffffffffffffffffffffffffffffffffffffff16610259565b61039261038d366004612d9b565b610b81565b6040516101d29190612dd6565b6103a7610c28565b6040516101d29190612e36565b6103c76103c2366004612b48565b610c39565b6040516101d2919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610259565b6101ee61044f366004612b48565b610d0e565b610300610462366004612c07565b610d39565b61046f610e14565b6040516101d29190612e90565b6103c761048a366004612b48565b610ecc565b61030061049d366004612ff8565b610f9e565b6103006104b036600461303d565b611027565b7f0000000000000000000000000000000000000000000000000000000000000000610259565b7f00000000000000000000000000000000000000000000000000000000000000006101c6565b61030061050f366004612c07565b6114ad565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806105a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906106249061307f565b80601f01602080910402602001604051908101604052809291908181526020018280546106509061307f565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b50505050509050919050565b6040805160208101909152600081526106c96106c48361317d565b6114c1565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166340c10f196107156060850160408601612c07565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608501356024820152604401600060405180830381600087803b15801561078557600080fd5b505af1158015610799573d6000803e3d6000fd5b506107ae925050506060830160408401612c07565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0846060013560405161081091815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6108376116f2565b6108a48484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061177592505050565b50505050565b6108b26116f2565b6108bb83610b6a565b610902576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546109299061307f565b80601f01602080910402602001604051908101604052809291908181526020018280546109559061307f565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505067ffffffffffffffff86166000908152600760205260409020919250506004016109d18385836132c2565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610a10939291906133dc565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108f9565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b236116f2565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006105f3600567ffffffffffffffff841661192b565b6040805180820190915260608082526020820152610ba6610ba183613440565b611946565b610bb38260600135611b10565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610c0d84602001602081019061044f9190612b48565b81526040805160208181019092526000815291015292915050565b6060610c346002611bb9565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105f390611bc6565b67ffffffffffffffff811660009081526007602052604090206005018054606091906106249061307f565b610d416116f2565b73ffffffffffffffffffffffffffffffffffffffff8116610d8e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610e226005611bb9565b90506000815167ffffffffffffffff811115610e4057610e40612ed2565b604051908082528060200260200182016040528015610e69578160200160208202803683370190505b50905060005b8251811015610ec557828181518110610e8a57610e8a6134e2565b6020026020010151828281518110610ea457610ea46134e2565b67ffffffffffffffff90921660209283029190910190910152600101610e6f565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105f390611bc6565b60085473ffffffffffffffffffffffffffffffffffffffff163314801590610fde575060005473ffffffffffffffffffffffffffffffffffffffff163314155b15611017576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024016108f9565b611022838383611c78565b505050565b61102f6116f2565b60005b8181101561102257600083838381811061104e5761104e6134e2565b90506020028101906110609190613511565b6110699061354f565b905061107e8160800151826020015115611d62565b6110918160a00151826020015115611d62565b80602001511561138d5780516110b39060059067ffffffffffffffff16611e9b565b6110f85780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108f9565b604081015151158061110d5750606081015151155b15611144576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906113259082613603565b506060820151600582019061133a9082613603565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c29550611380949392919061371d565b60405180910390a16114a4565b80516113a59060059067ffffffffffffffff16611ea7565b6113ea5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108f9565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906114536004830182612a9b565b611461600583016000612a9b565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101611032565b6114b56116f2565b6114be81611eb3565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146115565760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108f9565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611604573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162891906137b6565b1561165f576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166c8160200151611fa8565b600061167b82602001516105f9565b905080516000148061169f575080805190602001208260a001518051906020012014155b156116dc578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016108f99190612bc7565b6116ee826020015183606001516120ce565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108f9565b565b7f00000000000000000000000000000000000000000000000000000000000000006117cc576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156118625760008382815181106117ec576117ec6134e2565b6020026020010151905061180a81600261211590919063ffffffff16565b156118595760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016117cf565b5060005b8151811015611022576000828281518110611883576118836134e2565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118c75750611923565b6118d2600282612137565b156119215760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611866565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146119db5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108f9565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad91906137b6565b15611ae4576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611af18160400151612159565b611afe81602001516121d8565b6114be81602001518260600151612326565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639dc29fac90604401600060405180830381600087803b158015611b9e57600080fd5b505af1158015611bb2573d6000803e3d6000fd5b5050505050565b6060600061193f8361236a565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c5482606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611c389190613802565b85608001516fffffffffffffffffffffffffffffffff166123c5565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611c8183610b6a565b611cc3576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016108f9565b611cce826000611d62565b67ffffffffffffffff83166000908152600760205260409020611cf190836123ef565b611cfc816000611d62565b67ffffffffffffffff83166000908152600760205260409020611d2290600201826123ef565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611d5593929190613815565b60405180910390a1505050565b815115611e295781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611db8575060408201516fffffffffffffffffffffffffffffffff16155b15611df157816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016108f99190613898565b80156116ee576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580611e62575060208201516fffffffffffffffffffffffffffffffff1615155b156116ee57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016108f99190613898565b600061193f8383612591565b600061193f83836125e0565b3373ffffffffffffffffffffffffffffffffffffffff821603611f32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108f9565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611fb181610b6a565b611ff3576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108f9565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612072573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209691906137b6565b6114be576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108f9565b67ffffffffffffffff821660009081526007602052604090206116ee90600201827f00000000000000000000000000000000000000000000000000000000000000006126d3565b600061193f8373ffffffffffffffffffffffffffffffffffffffff84166125e0565b600061193f8373ffffffffffffffffffffffffffffffffffffffff8416612591565b7f0000000000000000000000000000000000000000000000000000000000000000156114be5761218a600282612a56565b6114be576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108f9565b6121e181610b6a565b612223576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108f9565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa15801561229c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c091906138d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114be576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108f9565b67ffffffffffffffff821660009081526007602052604090206116ee90827f00000000000000000000000000000000000000000000000000000000000000006126d3565b60608160000180548060200260200160405190810160405280929190818152602001828054801561069d57602002820191906000526020600020905b8154815260200190600101908083116123a65750505050509050919050565b60006123e4856123d584866138f1565b6123df9087613908565b612a85565b90505b949350505050565b815460009061241890700100000000000000000000000000000000900463ffffffff1642613802565b905080156124ba5760018301548354612460916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166123c5565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546124e0916fffffffffffffffffffffffffffffffff9081169116612a85565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611d55908490613898565b60008181526001830160205260408120546125d8575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f3565b5060006105f3565b600081815260018301602052604081205480156126c9576000612604600183613802565b855490915060009061261890600190613802565b905080821461267d576000866000018281548110612638576126386134e2565b906000526020600020015490508087600001848154811061265b5761265b6134e2565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061268e5761268e61391b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105f3565b60009150506105f3565b825474010000000000000000000000000000000000000000900460ff1615806126fa575081155b1561270457505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061274a90700100000000000000000000000000000000900463ffffffff1642613802565b9050801561280a578183111561278c576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546127c69083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166123c5565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156128c15773ffffffffffffffffffffffffffffffffffffffff8416612869576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016108f9565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016108f9565b848310156129d45760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906129059082613802565b61290f878a613802565b6129199190613908565b612923919061394a565b905073ffffffffffffffffffffffffffffffffffffffff861661297c576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016108f9565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016108f9565b6129de8584613802565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561193f565b6000818310612a94578161193f565b5090919050565b508054612aa79061307f565b6000825580601f10612ab7575050565b601f0160209004906000526020600020908101906114be91905b80821115612ae55760008155600101612ad1565b5090565b600060208284031215612afb57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461193f57600080fd5b803567ffffffffffffffff81168114612b4357600080fd5b919050565b600060208284031215612b5a57600080fd5b61193f82612b2b565b6000815180845260005b81811015612b8957602081850181015186830182015201612b6d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061193f6020830184612b63565b73ffffffffffffffffffffffffffffffffffffffff811681146114be57600080fd5b8035612b4381612bda565b600060208284031215612c1957600080fd5b813561193f81612bda565b600060208284031215612c3657600080fd5b813567ffffffffffffffff811115612c4d57600080fd5b8201610100818503121561193f57600080fd5b60008083601f840112612c7257600080fd5b50813567ffffffffffffffff811115612c8a57600080fd5b6020830191508360208260051b8501011115612ca557600080fd5b9250929050565b60008060008060408587031215612cc257600080fd5b843567ffffffffffffffff80821115612cda57600080fd5b612ce688838901612c60565b90965094506020870135915080821115612cff57600080fd5b50612d0c87828801612c60565b95989497509550505050565b600080600060408486031215612d2d57600080fd5b612d3684612b2b565b9250602084013567ffffffffffffffff80821115612d5357600080fd5b818601915086601f830112612d6757600080fd5b813581811115612d7657600080fd5b876020828501011115612d8857600080fd5b6020830194508093505050509250925092565b600060208284031215612dad57600080fd5b813567ffffffffffffffff811115612dc457600080fd5b820160a0818503121561193f57600080fd5b602081526000825160406020840152612df26060840182612b63565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612e2d8282612b63565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e8457835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612e52565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e8457835167ffffffffffffffff1683529284019291840191600101612eac565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715612f2557612f25612ed2565b60405290565b60405160c0810167ffffffffffffffff81118282101715612f2557612f25612ed2565b80151581146114be57600080fd5b8035612b4381612f4e565b80356fffffffffffffffffffffffffffffffff81168114612b4357600080fd5b600060608284031215612f9957600080fd5b6040516060810181811067ffffffffffffffff82111715612fbc57612fbc612ed2565b6040529050808235612fcd81612f4e565b8152612fdb60208401612f67565b6020820152612fec60408401612f67565b60408201525092915050565b600080600060e0848603121561300d57600080fd5b61301684612b2b565b92506130258560208601612f87565b91506130348560808601612f87565b90509250925092565b6000806020838503121561305057600080fd5b823567ffffffffffffffff81111561306757600080fd5b61307385828601612c60565b90969095509350505050565b600181811c9082168061309357607f821691505b6020821081036130cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f8301126130e357600080fd5b813567ffffffffffffffff808211156130fe576130fe612ed2565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561314457613144612ed2565b8160405283815286602085880101111561315d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561319057600080fd5b613198612f01565b823567ffffffffffffffff808211156131b057600080fd5b6131bc368387016130d2565b83526131ca60208601612b2b565b60208401526131db60408601612bfc565b6040840152606085013560608401526131f660808601612bfc565b608084015260a085013591508082111561320f57600080fd5b61321b368387016130d2565b60a084015260c085013591508082111561323457600080fd5b613240368387016130d2565b60c084015260e085013591508082111561325957600080fd5b50613266368286016130d2565b60e08301525092915050565b601f821115611022576000816000526020600020601f850160051c8101602086101561329b5750805b601f850160051c820191505b818110156132ba578281556001016132a7565b505050505050565b67ffffffffffffffff8311156132da576132da612ed2565b6132ee836132e8835461307f565b83613272565b6000601f841160018114613340576000851561330a5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611bb2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561338f578685013582556020948501946001909201910161336f565b50868210156133ca577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006133ef6040830186612b63565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561345257600080fd5b60405160a0810167ffffffffffffffff828210818311171561347657613476612ed2565b81604052843591508082111561348b57600080fd5b50613498368286016130d2565b8252506134a760208401612b2b565b602082015260408301356134ba81612bda565b60408201526060838101359082015260808301356134d781612bda565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261354557600080fd5b9190910192915050565b6000610140823603121561356257600080fd5b61356a612f2b565b61357383612b2b565b815261358160208401612f5c565b6020820152604083013567ffffffffffffffff808211156135a157600080fd5b6135ad368387016130d2565b604084015260608501359150808211156135c657600080fd5b506135d3368286016130d2565b6060830152506135e63660808501612f87565b60808201526135f83660e08501612f87565b60a082015292915050565b815167ffffffffffffffff81111561361d5761361d612ed2565b6136318161362b845461307f565b84613272565b602080601f831160018114613684576000841561364e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132ba565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156136d1578886015182559484019460019091019084016136b2565b508582101561370d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff8716835280602084015261374181840187612b63565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff908116606087015290870151166080850152915061377f9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612e2d565b6000602082840312156137c857600080fd5b815161193f81612f4e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105f3576105f36137d3565b67ffffffffffffffff8416815260e0810161386160208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526123e7565b606081016105f382848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156138e657600080fd5b815161193f81612bda565b80820281158282048414176105f3576105f36137d3565b808201808211156105f3576105f36137d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082613980577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
+ Bin: "0x60e06040523480156200001157600080fd5b5060405162004508380380620045088339810160408190526200003491620008c0565b8383838333806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200018f565b5050506001600160a01b0384161580620000e357506001600160a01b038116155b80620000f657506001600160a01b038216155b1562000115576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c05262000168576040805160008152602081019091526200016890846200023a565b5062000185925050506001600160a01b0385163060001962000397565b5050505062000afc565b336001600160a01b03821603620001e95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200025b576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002e65760008382815181106200027f576200027f620009d0565b60209081029190910101519050620002996002826200047d565b15620002dc576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200025e565b5060005b8151811015620003925760008282815181106200030b576200030b620009d0565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000337575062000389565b620003446002826200049d565b1562000387576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002ea565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040f9190620009e6565b6200041b919062000a16565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200047791869190620004b416565b50505050565b600062000494836001600160a01b03841662000585565b90505b92915050565b600062000494836001600160a01b03841662000689565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000503906001600160a01b038516908490620006db565b80519091501562000392578080602001905181019062000524919062000a2c565b620003925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b600081815260018301602052604081205480156200067e576000620005ac60018362000a57565b8554909150600090620005c29060019062000a57565b90508082146200062e576000866000018281548110620005e657620005e6620009d0565b90600052602060002001549050808760000184815481106200060c576200060c620009d0565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000642576200064262000a6d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000497565b600091505062000497565b6000818152600183016020526040812054620006d25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000497565b50600062000497565b6060620006ec8484600085620006f4565b949350505050565b606082471015620007575760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b0316858760405162000775919062000aa9565b60006040518083038185875af1925050503d8060008114620007b4576040519150601f19603f3d011682016040523d82523d6000602084013e620007b9565b606091505b509092509050620007cd87838387620007d8565b979650505050505050565b606083156200084c57825160000362000844576001600160a01b0385163b620008445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620006ec565b620006ec8383815115620008635781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000ac7565b6001600160a01b03811681146200089557600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008bb816200087f565b919050565b60008060008060808587031215620008d757600080fd5b8451620008e4816200087f565b602086810151919550906001600160401b03808211156200090457600080fd5b818801915088601f8301126200091957600080fd5b8151818111156200092e576200092e62000898565b8060051b604051601f19603f8301168101818110858211171562000956576200095662000898565b60405291825284820192508381018501918b8311156200097557600080fd5b938501935b828510156200099e576200098e85620008ae565b845293850193928501926200097a565b809850505050505050620009b560408601620008ae565b9150620009c560608601620008ae565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009f957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000497576200049762000a00565b60006020828403121562000a3f57600080fd5b8151801515811462000a5057600080fd5b9392505050565b8181038181111562000497576200049762000a00565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aa057818101518382015260200162000a86565b50506000910152565b6000825162000abd81846020870162000a83565b9190910192915050565b602081526000825180602084015262000ae881604085016020870162000a83565b601f01601f19169190910160400192915050565b60805160a05160c05161398f62000b79600039600081816104da0152818161177401526121580152600081816104b4015281816115a50152611a2a0152600081816102360152818161028b015281816106dd015281816114c50152818161194a01528181611b42015281816120ee0152612343015261398f6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639a4575b9116100ee578063c4bffe2b11610097578063db6327dc11610071578063db6327dc1461049f578063dc0bd971146104b2578063e0351e13146104d8578063f2fde38b146104fe57600080fd5b8063c4bffe2b14610464578063c75eea9c14610479578063cf7401f31461048c57600080fd5b8063b0f479a1116100c8578063b0f479a114610420578063b79465801461043e578063c0d786551461045157600080fd5b80639a4575b91461037c578063a7cd63b71461039c578063af58d59f146103b157600080fd5b806354c8a4f31161015b57806379ba50971161013557806379ba5097146103305780637d54534e146103385780638926f54f1461034b5780638da5cb5b1461035e57600080fd5b806354c8a4f3146102ea5780636d3d1a58146102ff57806378a010b21461031d57600080fd5b806321df0da71161018c57806321df0da714610234578063240028e81461027b57806339077537146102c857600080fd5b806301ffc9a7146101b35780630a2fd493146101db578063181f5a77146101fb575b600080fd5b6101c66101c1366004612ae6565b610511565b60405190151581526020015b60405180910390f35b6101ee6101e9366004612b45565b6105f6565b6040516101d29190612bc4565b60408051808201909152601f81527f4275726e5769746846726f6d4d696e74546f6b656e506f6f6c20312e352e300060208201526101ee565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b6101c6610289366004612c04565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102db6102d6366004612c21565b6106a6565b604051905181526020016101d2565b6102fd6102f8366004612ca9565b61082c565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610256565b6102fd61032b366004612d15565b6108a7565b6102fd610a1b565b6102fd610346366004612c04565b610b18565b6101c6610359366004612b45565b610b67565b60005473ffffffffffffffffffffffffffffffffffffffff16610256565b61038f61038a366004612d98565b610b7e565b6040516101d29190612dd3565b6103a4610c25565b6040516101d29190612e33565b6103c46103bf366004612b45565b610c36565b6040516101d2919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610256565b6101ee61044c366004612b45565b610d0b565b6102fd61045f366004612c04565b610d36565b61046c610e11565b6040516101d29190612e8d565b6103c4610487366004612b45565b610ec9565b6102fd61049a366004612ff5565b610f9b565b6102fd6104ad36600461303a565b611024565b7f0000000000000000000000000000000000000000000000000000000000000000610256565b7f00000000000000000000000000000000000000000000000000000000000000006101c6565b6102fd61050c366004612c04565b6114aa565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806105a457507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105f057507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906106219061307c565b80601f016020809104026020016040519081016040528092919081815260200182805461064d9061307c565b801561069a5780601f1061066f5761010080835404028352916020019161069a565b820191906000526020600020905b81548152906001019060200180831161067d57829003601f168201915b50505050509050919050565b6040805160208101909152600081526106c66106c18361317a565b6114be565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166340c10f196107126060850160408601612c04565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608501356024820152604401600060405180830381600087803b15801561078257600080fd5b505af1158015610796573d6000803e3d6000fd5b506107ab925050506060830160408401612c04565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0846060013560405161080d91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6108346116ef565b6108a18484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061177292505050565b50505050565b6108af6116ef565b6108b883610b67565b6108ff576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546109269061307c565b80601f01602080910402602001604051908101604052809291908181526020018280546109529061307c565b801561099f5780601f106109745761010080835404028352916020019161099f565b820191906000526020600020905b81548152906001019060200180831161098257829003601f168201915b5050505067ffffffffffffffff86166000908152600760205260409020919250506004016109ce8385836132bf565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610a0d939291906133d9565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108f6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b206116ef565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006105f0600567ffffffffffffffff8416611928565b6040805180820190915260608082526020820152610ba3610b9e8361343d565b611943565b610bb08260600135611b0d565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610c0a84602001602081019061044c9190612b45565b81526040805160208181019092526000815291015292915050565b6060610c316002611bb6565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105f090611bc3565b67ffffffffffffffff811660009081526007602052604090206005018054606091906106219061307c565b610d3e6116ef565b73ffffffffffffffffffffffffffffffffffffffff8116610d8b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610e1f6005611bb6565b90506000815167ffffffffffffffff811115610e3d57610e3d612ecf565b604051908082528060200260200182016040528015610e66578160200160208202803683370190505b50905060005b8251811015610ec257828181518110610e8757610e876134df565b6020026020010151828281518110610ea157610ea16134df565b67ffffffffffffffff90921660209283029190910190910152600101610e6c565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105f090611bc3565b60085473ffffffffffffffffffffffffffffffffffffffff163314801590610fdb575060005473ffffffffffffffffffffffffffffffffffffffff163314155b15611014576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024016108f6565b61101f838383611c75565b505050565b61102c6116ef565b60005b8181101561101f57600083838381811061104b5761104b6134df565b905060200281019061105d919061350e565b6110669061354c565b905061107b8160800151826020015115611d5f565b61108e8160a00151826020015115611d5f565b80602001511561138a5780516110b09060059067ffffffffffffffff16611e98565b6110f55780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108f6565b604081015151158061110a5750606081015151155b15611141576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906113229082613600565b50606082015160058201906113379082613600565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2955061137d949392919061371a565b60405180910390a16114a1565b80516113a29060059067ffffffffffffffff16611ea4565b6113e75780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108f6565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906114506004830182612a98565b61145e600583016000612a98565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b5060010161102f565b6114b26116ef565b6114bb81611eb0565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146115535760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108f6565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611601573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162591906137b3565b1561165c576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116698160200151611fa5565b600061167882602001516105f6565b905080516000148061169c575080805190602001208260a001518051906020012014155b156116d9578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016108f69190612bc4565b6116eb826020015183606001516120cb565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108f6565b565b7f00000000000000000000000000000000000000000000000000000000000000006117c9576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561185f5760008382815181106117e9576117e96134df565b6020026020010151905061180781600261211290919063ffffffff16565b156118565760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016117cc565b5060005b815181101561101f576000828281518110611880576118806134df565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118c45750611920565b6118cf600282612134565b1561191e5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611863565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146119d85760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108f6565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa91906137b3565b15611ae1576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aee8160400151612156565b611afb81602001516121d5565b6114bb81602001518260600151612323565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639dc29fac90604401600060405180830381600087803b158015611b9b57600080fd5b505af1158015611baf573d6000803e3d6000fd5b5050505050565b6060600061193c83612367565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c5182606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611c3591906137ff565b85608001516fffffffffffffffffffffffffffffffff166123c2565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611c7e83610b67565b611cc0576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016108f6565b611ccb826000611d5f565b67ffffffffffffffff83166000908152600760205260409020611cee90836123ec565b611cf9816000611d5f565b67ffffffffffffffff83166000908152600760205260409020611d1f90600201826123ec565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611d5293929190613812565b60405180910390a1505050565b815115611e265781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611db5575060408201516fffffffffffffffffffffffffffffffff16155b15611dee57816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016108f69190613895565b80156116eb576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580611e5f575060208201516fffffffffffffffffffffffffffffffff1615155b156116eb57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016108f69190613895565b600061193c838361258e565b600061193c83836125dd565b3373ffffffffffffffffffffffffffffffffffffffff821603611f2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108f6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611fae81610b67565b611ff0576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108f6565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa15801561206f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209391906137b3565b6114bb576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108f6565b67ffffffffffffffff821660009081526007602052604090206116eb90600201827f00000000000000000000000000000000000000000000000000000000000000006126d0565b600061193c8373ffffffffffffffffffffffffffffffffffffffff84166125dd565b600061193c8373ffffffffffffffffffffffffffffffffffffffff841661258e565b7f0000000000000000000000000000000000000000000000000000000000000000156114bb57612187600282612a53565b6114bb576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108f6565b6121de81610b67565b612220576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108f6565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612299573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bd91906138d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108f6565b67ffffffffffffffff821660009081526007602052604090206116eb90827f00000000000000000000000000000000000000000000000000000000000000006126d0565b60608160000180548060200260200160405190810160405280929190818152602001828054801561069a57602002820191906000526020600020905b8154815260200190600101908083116123a35750505050509050919050565b60006123e1856123d284866138ee565b6123dc9087613905565b612a82565b90505b949350505050565b815460009061241590700100000000000000000000000000000000900463ffffffff16426137ff565b905080156124b7576001830154835461245d916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166123c2565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546124dd916fffffffffffffffffffffffffffffffff9081169116612a82565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611d52908490613895565b60008181526001830160205260408120546125d5575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f0565b5060006105f0565b600081815260018301602052604081205480156126c65760006126016001836137ff565b8554909150600090612615906001906137ff565b905080821461267a576000866000018281548110612635576126356134df565b9060005260206000200154905080876000018481548110612658576126586134df565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061268b5761268b613918565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105f0565b60009150506105f0565b825474010000000000000000000000000000000000000000900460ff1615806126f7575081155b1561270157505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061274790700100000000000000000000000000000000900463ffffffff16426137ff565b905080156128075781831115612789576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546127c39083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166123c2565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156128be5773ffffffffffffffffffffffffffffffffffffffff8416612866576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016108f6565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016108f6565b848310156129d15760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690600090829061290290826137ff565b61290c878a6137ff565b6129169190613905565b6129209190613947565b905073ffffffffffffffffffffffffffffffffffffffff8616612979576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016108f6565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016108f6565b6129db85846137ff565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561193c565b6000818310612a91578161193c565b5090919050565b508054612aa49061307c565b6000825580601f10612ab4575050565b601f0160209004906000526020600020908101906114bb91905b80821115612ae25760008155600101612ace565b5090565b600060208284031215612af857600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461193c57600080fd5b803567ffffffffffffffff81168114612b4057600080fd5b919050565b600060208284031215612b5757600080fd5b61193c82612b28565b6000815180845260005b81811015612b8657602081850181015186830182015201612b6a565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061193c6020830184612b60565b73ffffffffffffffffffffffffffffffffffffffff811681146114bb57600080fd5b8035612b4081612bd7565b600060208284031215612c1657600080fd5b813561193c81612bd7565b600060208284031215612c3357600080fd5b813567ffffffffffffffff811115612c4a57600080fd5b8201610100818503121561193c57600080fd5b60008083601f840112612c6f57600080fd5b50813567ffffffffffffffff811115612c8757600080fd5b6020830191508360208260051b8501011115612ca257600080fd5b9250929050565b60008060008060408587031215612cbf57600080fd5b843567ffffffffffffffff80821115612cd757600080fd5b612ce388838901612c5d565b90965094506020870135915080821115612cfc57600080fd5b50612d0987828801612c5d565b95989497509550505050565b600080600060408486031215612d2a57600080fd5b612d3384612b28565b9250602084013567ffffffffffffffff80821115612d5057600080fd5b818601915086601f830112612d6457600080fd5b813581811115612d7357600080fd5b876020828501011115612d8557600080fd5b6020830194508093505050509250925092565b600060208284031215612daa57600080fd5b813567ffffffffffffffff811115612dc157600080fd5b820160a0818503121561193c57600080fd5b602081526000825160406020840152612def6060840182612b60565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612e2a8282612b60565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e8157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612e4f565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e8157835167ffffffffffffffff1683529284019291840191600101612ea9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715612f2257612f22612ecf565b60405290565b60405160c0810167ffffffffffffffff81118282101715612f2257612f22612ecf565b80151581146114bb57600080fd5b8035612b4081612f4b565b80356fffffffffffffffffffffffffffffffff81168114612b4057600080fd5b600060608284031215612f9657600080fd5b6040516060810181811067ffffffffffffffff82111715612fb957612fb9612ecf565b6040529050808235612fca81612f4b565b8152612fd860208401612f64565b6020820152612fe960408401612f64565b60408201525092915050565b600080600060e0848603121561300a57600080fd5b61301384612b28565b92506130228560208601612f84565b91506130318560808601612f84565b90509250925092565b6000806020838503121561304d57600080fd5b823567ffffffffffffffff81111561306457600080fd5b61307085828601612c5d565b90969095509350505050565b600181811c9082168061309057607f821691505b6020821081036130c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f8301126130e057600080fd5b813567ffffffffffffffff808211156130fb576130fb612ecf565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561314157613141612ecf565b8160405283815286602085880101111561315a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561318d57600080fd5b613195612efe565b823567ffffffffffffffff808211156131ad57600080fd5b6131b9368387016130cf565b83526131c760208601612b28565b60208401526131d860408601612bf9565b6040840152606085013560608401526131f360808601612bf9565b608084015260a085013591508082111561320c57600080fd5b613218368387016130cf565b60a084015260c085013591508082111561323157600080fd5b61323d368387016130cf565b60c084015260e085013591508082111561325657600080fd5b50613263368286016130cf565b60e08301525092915050565b601f82111561101f576000816000526020600020601f850160051c810160208610156132985750805b601f850160051c820191505b818110156132b7578281556001016132a4565b505050505050565b67ffffffffffffffff8311156132d7576132d7612ecf565b6132eb836132e5835461307c565b8361326f565b6000601f84116001811461333d57600085156133075750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611baf565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561338c578685013582556020948501946001909201910161336c565b50868210156133c7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006133ec6040830186612b60565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561344f57600080fd5b60405160a0810167ffffffffffffffff828210818311171561347357613473612ecf565b81604052843591508082111561348857600080fd5b50613495368286016130cf565b8252506134a460208401612b28565b602082015260408301356134b781612bd7565b60408201526060838101359082015260808301356134d481612bd7565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261354257600080fd5b9190910192915050565b6000610140823603121561355f57600080fd5b613567612f28565b61357083612b28565b815261357e60208401612f59565b6020820152604083013567ffffffffffffffff8082111561359e57600080fd5b6135aa368387016130cf565b604084015260608501359150808211156135c357600080fd5b506135d0368286016130cf565b6060830152506135e33660808501612f84565b60808201526135f53660e08501612f84565b60a082015292915050565b815167ffffffffffffffff81111561361a5761361a612ecf565b61362e81613628845461307c565b8461326f565b602080601f831160018114613681576000841561364b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132b7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156136ce578886015182559484019460019091019084016136af565b508582101561370a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff8716835280602084015261373e81840187612b60565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff908116606087015290870151166080850152915061377c9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612e2a565b6000602082840312156137c557600080fd5b815161193c81612f4b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105f0576105f06137d0565b67ffffffffffffffff8416815260e0810161385e60208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526123e4565b606081016105f082848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156138e357600080fd5b815161193c81612bd7565b80820281158282048414176105f0576105f06137d0565b808201808211156105f0576105f06137d0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008261397d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
}
var BurnWithFromMintTokenPoolABI = BurnWithFromMintTokenPoolMetaData.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 8d8ed108a8..225039bb6e 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
@@ -2,7 +2,8 @@ GETH_VERSION: 1.13.8
burn_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.bin 1e60c28ad796a220a38043b369dec8d9bffe23e1c7d9895760e30672872afd06
burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin 3e8e3358f0bb520af069a7d37ea625940a88461a54418b1d5925eabced8c74df
burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 717c079d5d13300cf3c3ee871c6e5bf9af904411f204fb081a9f3b263cca1391
-burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6333d0314d0bd29e75ea5e05fe62a4516ade0c6db91c30b6f93645035db52ed8
+burn_with_from_mint_rebasing_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintRebasingTokenPool/BurnWithFromMintRebasingTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintRebasingTokenPool/BurnWithFromMintRebasingTokenPool.bin ec9b95105a33de14b078c1261d9cd9d6f3011e940a819b52f11a963951d4bb89
+burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 734c2a0ea8f1224b5f01ed849410209e74b4e3427e8bfddb8ff5dd8ead5f2d8d
burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 1ed5c299f928529081dc01b7a46db2b5e6728001767863495a7675d8db99a9e2
ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin 2e6fa009821d30a24efdc9f9d14b2269fb9a51cb7d536ea8b2d29d97dd8b591c
ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin c570b86f8ae7697d3478e70625e06f0f682e75c1f0b7538f4b6f581b0d294b2b
diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go
index e6f76fb8bc..fd48a3826f 100644
--- a/core/gethwrappers/ccip/go_generate.go
+++ b/core/gethwrappers/ccip/go_generate.go
@@ -29,6 +29,7 @@ package ccip
//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin LockReleaseTokenPoolAndProxy lock_release_token_pool_and_proxy
//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/generate/wrap.go ../../../contracts/solc/v0.8.24/BurnWithFromMintRebasingTokenPool/BurnWithFromMintRebasingTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintRebasingTokenPool/BurnWithFromMintRebasingTokenPool.bin BurnWithFromMintRebasingTokenPool burn_with_from_mint_rebasing_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
From f772bcf6c6e6e03e62b5234ad842a3ed16f3cb53 Mon Sep 17 00:00:00 2001
From: Suryansh <39276431+0xsuryansh@users.noreply.github.com>
Date: Tue, 8 Oct 2024 20:48:55 +0530
Subject: [PATCH 28/32] Fix/onramp allowlist race condition (#1480)
---
contracts/gas-snapshots/ccip.gas-snapshot | 41 ++++++-------
contracts/src/v0.8/ccip/onRamp/OnRamp.sol | 6 +-
.../src/v0.8/ccip/test/onRamp/OnRamp.t.sol | 60 +++++++++++++++++--
.../v0.8/ccip/test/onRamp/OnRampSetup.t.sol | 3 +-
.../ccip/generated/onramp/onramp.go | 5 +-
...rapper-dependency-versions-do-not-edit.txt | 2 +-
6 files changed, 85 insertions(+), 32 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 40e53aef0b..009e7579b4 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -564,8 +564,8 @@ MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24234)
MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275)
MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933)
MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049)
-MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233701)
-MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501791)
+MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233635)
+MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501725)
NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778)
@@ -748,23 +748,24 @@ OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227999)
OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295396)
OffRamp_trialExecute:test_trialExecute_Success() (gas: 277896)
OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842)
-OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18030)
-OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67426)
-OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325083)
-OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 65095)
-OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 13422)
-OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94996)
-OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92938)
-OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97971)
-OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92972)
-OnRamp_constructor:test_Constructor_Success() (gas: 2736399)
+OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18018)
+OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67797)
+OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325198)
+OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 65878)
+OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 13631)
+OnRamp_constructor:test_Constructor_EnableAllowList_ForwardFromRouter_Reverts() (gas: 2673564)
+OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 95249)
+OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 93191)
+OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 98224)
+OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 93247)
+OnRamp_constructor:test_Constructor_Success() (gas: 2753286)
OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115307)
OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146108)
OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145705)
OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143866)
OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145902)
OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145300)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 145006)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 140701)
OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38554)
OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143051)
OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36596)
@@ -781,12 +782,12 @@ OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010)
OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866)
OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599)
OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280170)
-OnRamp_getFee:test_EmptyMessage_Success() (gas: 98513)
-OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64645)
-OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86177)
-OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35097)
-OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113639)
-OnRamp_getFee:test_Unhealthy_Revert() (gas: 17061)
+OnRamp_getFee:test_EmptyMessage_Success() (gas: 98469)
+OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64623)
+OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86133)
+OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35075)
+OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113595)
+OnRamp_getFee:test_Unhealthy_Revert() (gas: 17039)
OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10474)
OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35348)
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 11536)
@@ -794,7 +795,7 @@ OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZer
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert() (gas: 11522)
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 16850)
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265)
-OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56369)
+OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56347)
OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302)
PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349)
PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310)
diff --git a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
index fdbf57f46b..e053baf507 100644
--- a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
+++ b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
@@ -91,8 +91,9 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
/// can be passed in the constructor and the applyDestChainConfigUpdates function
//solhint-disable gas-struct-packing
struct DestChainConfigArgs {
- uint64 destChainSelector; // Destination chain selector
- IRouter router; // Source router address
+ uint64 destChainSelector; // ─╮ Destination chain selector
+ IRouter router; // │ Source router address
+ bool allowListEnabled; //─────╯ Boolean indicator to specify if allowList check is enabled
}
/// @dev Struct used to apply AllowList Senders for multiple destChainSelectors
@@ -377,6 +378,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
DestChainConfig storage destChainConfig = s_destChainConfigs[destChainSelector];
destChainConfig.router = destChainConfigArg.router;
+ destChainConfig.allowListEnabled = destChainConfigArg.allowListEnabled;
emit DestChainConfigSet(
destChainSelector, destChainConfig.sequenceNumber, destChainConfigArg.router, destChainConfig.allowListEnabled
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
index 16425850e5..16889db39e 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol
@@ -48,6 +48,39 @@ contract OnRamp_constructor is OnRampSetup {
assertEq(address(s_sourceRouter), address(s_onRamp.getRouter(DEST_CHAIN_SELECTOR)));
}
+ function test_Constructor_EnableAllowList_ForwardFromRouter_Reverts() public {
+ OnRamp.StaticConfig memory staticConfig = OnRamp.StaticConfig({
+ chainSelector: SOURCE_CHAIN_SELECTOR,
+ rmnRemote: s_mockRMNRemote,
+ nonceManager: address(s_outboundNonceManager),
+ tokenAdminRegistry: address(s_tokenAdminRegistry)
+ });
+
+ OnRamp.DynamicConfig memory dynamicConfig = _generateDynamicOnRampConfig(address(s_feeQuoter));
+
+ // Creating a DestChainConfig and setting allowListEnabled : true
+ OnRamp.DestChainConfigArgs[] memory destChainConfigs = new OnRamp.DestChainConfigArgs[](1);
+ destChainConfigs[0] = OnRamp.DestChainConfigArgs({
+ destChainSelector: DEST_CHAIN_SELECTOR,
+ router: s_sourceRouter,
+ allowListEnabled: true
+ });
+
+ vm.expectEmit();
+ emit OnRamp.ConfigSet(staticConfig, dynamicConfig);
+
+ vm.expectEmit();
+ emit OnRamp.DestChainConfigSet(DEST_CHAIN_SELECTOR, 0, s_sourceRouter, true);
+
+ OnRampHelper tempOnRamp = new OnRampHelper(staticConfig, dynamicConfig, destChainConfigs);
+
+ // Sending a message and expecting revert as allowList is enabled with no address in allowlist
+ Client.EVM2AnyMessage memory message = _generateEmptyMessage();
+ vm.startPrank(address(s_sourceRouter));
+ vm.expectRevert(abi.encodeWithSelector(OnRamp.SenderNotAllowed.selector, OWNER));
+ tempOnRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
+ }
+
function test_Constructor_InvalidConfigChainSelectorEqZero_Revert() public {
vm.expectRevert(OnRamp.InvalidConfig.selector);
new OnRampHelper(
@@ -844,8 +877,13 @@ contract OnRamp_applyDestChainConfigUpdates is OnRampSetup {
// supports updating and adding lanes simultaneously
configArgs = new OnRamp.DestChainConfigArgs[](2);
- configArgs[0] = OnRamp.DestChainConfigArgs({destChainSelector: DEST_CHAIN_SELECTOR, router: s_sourceRouter});
- configArgs[1] = OnRamp.DestChainConfigArgs({destChainSelector: 9999, router: IRouter(address(9999))});
+ configArgs[0] = OnRamp.DestChainConfigArgs({
+ destChainSelector: DEST_CHAIN_SELECTOR,
+ router: s_sourceRouter,
+ allowListEnabled: false
+ });
+ configArgs[1] =
+ OnRamp.DestChainConfigArgs({destChainSelector: 9999, router: IRouter(address(9999)), allowListEnabled: false});
vm.expectEmit();
emit OnRamp.DestChainConfigSet(DEST_CHAIN_SELECTOR, 0, s_sourceRouter, false);
vm.expectEmit();
@@ -877,8 +915,13 @@ contract OnRamp_applyAllowListUpdates is OnRampSetup {
vm.startPrank(OWNER);
OnRamp.DestChainConfigArgs[] memory configArgs = new OnRamp.DestChainConfigArgs[](2);
- configArgs[0] = OnRamp.DestChainConfigArgs({destChainSelector: DEST_CHAIN_SELECTOR, router: s_sourceRouter});
- configArgs[1] = OnRamp.DestChainConfigArgs({destChainSelector: 9999, router: IRouter(address(9999))});
+ configArgs[0] = OnRamp.DestChainConfigArgs({
+ destChainSelector: DEST_CHAIN_SELECTOR,
+ router: s_sourceRouter,
+ allowListEnabled: false
+ });
+ configArgs[1] =
+ OnRamp.DestChainConfigArgs({destChainSelector: 9999, router: IRouter(address(9999)), allowListEnabled: false});
vm.expectEmit();
emit OnRamp.DestChainConfigSet(DEST_CHAIN_SELECTOR, 0, s_sourceRouter, false);
vm.expectEmit();
@@ -968,8 +1011,13 @@ contract OnRamp_applyAllowListUpdates is OnRampSetup {
vm.startPrank(OWNER);
OnRamp.DestChainConfigArgs[] memory configArgs = new OnRamp.DestChainConfigArgs[](2);
- configArgs[0] = OnRamp.DestChainConfigArgs({destChainSelector: DEST_CHAIN_SELECTOR, router: s_sourceRouter});
- configArgs[1] = OnRamp.DestChainConfigArgs({destChainSelector: 9999, router: IRouter(address(9999))});
+ configArgs[0] = OnRamp.DestChainConfigArgs({
+ destChainSelector: DEST_CHAIN_SELECTOR,
+ router: s_sourceRouter,
+ allowListEnabled: false
+ });
+ configArgs[1] =
+ OnRamp.DestChainConfigArgs({destChainSelector: 9999, router: IRouter(address(9999)), allowListEnabled: false});
vm.expectEmit();
emit OnRamp.DestChainConfigSet(DEST_CHAIN_SELECTOR, 0, s_sourceRouter, false);
vm.expectEmit();
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
index f60cfcc5ae..541146bdaf 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol
@@ -126,7 +126,8 @@ contract OnRampSetup is FeeQuoterFeeSetup {
function _generateDestChainConfigArgs(IRouter router) internal pure returns (OnRamp.DestChainConfigArgs[] memory) {
OnRamp.DestChainConfigArgs[] memory destChainConfigs = new OnRamp.DestChainConfigArgs[](1);
- destChainConfigs[0] = OnRamp.DestChainConfigArgs({destChainSelector: DEST_CHAIN_SELECTOR, router: router});
+ destChainConfigs[0] =
+ OnRamp.DestChainConfigArgs({destChainSelector: DEST_CHAIN_SELECTOR, router: router, allowListEnabled: false});
return destChainConfigs;
}
diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/onramp/onramp.go
index bbe9fba709..e1b86d9290 100644
--- a/core/gethwrappers/ccip/generated/onramp/onramp.go
+++ b/core/gethwrappers/ccip/generated/onramp/onramp.go
@@ -81,6 +81,7 @@ type OnRampAllowListConfigArgs struct {
type OnRampDestChainConfigArgs struct {
DestChainSelector uint64
Router common.Address
+ AllowListEnabled bool
}
type OnRampDynamicConfig struct {
@@ -99,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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b50604051620042393803806200423983398101604081905262000035916200073f565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d81620003e0565b50505062000840565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060608101516001600160a01b0316155b8062000261575080602001515b1562000280576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191620003d591849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b81518110156200051f5760008282815181106200040457620004046200082a565b6020026020010151905060008383815181106200042557620004256200082a565b6020026020010151600001519050806001600160401b03166000036200046a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050620003e3565b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200055e576200055e62000523565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200058f576200058f62000523565b604052919050565b80516001600160401b0381168114620005af57600080fd5b919050565b6001600160a01b0381168114620005ca57600080fd5b50565b600060a08284031215620005e057600080fd5b60405160a081016001600160401b038111828210171562000605576200060562000523565b806040525080915082516200061a81620005b4565b8152602083015180151581146200063057600080fd5b602082015260408301516200064581620005b4565b604082015260608301516200065a81620005b4565b606082015260808301516200066f81620005b4565b6080919091015292915050565b600082601f8301126200068e57600080fd5b815160206001600160401b03821115620006ac57620006ac62000523565b620006bc818360051b0162000564565b82815260069290921b84018101918181019086841115620006dc57600080fd5b8286015b84811015620007345760408189031215620006fb5760008081fd5b6200070562000539565b620007108262000597565b8152848201516200072181620005b4565b81860152835291830191604001620006e0565b509695505050505050565b60008060008385036101408112156200075757600080fd5b60808112156200076657600080fd5b50604051608081016001600160401b0380821183831017156200078d576200078d62000523565b816040526200079c8762000597565b835260208701519150620007b082620005b4565b81602084015260408701519150620007c882620005b4565b81604084015260608701519150620007e082620005b4565b816060840152829550620007f88860808901620005cd565b94506101208701519250808311156200081057600080fd5b505062000820868287016200067c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051613980620008b96000396000818161022c01528181610cfd0152611bd30152600081816101f0015281816115c40152611bac0152600081816101b4015281816106080152611b820152600081816101840152818161114b015281816116e10152611b5e01526139806000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e914610557578063f2fde38b1461056a578063fbca3b741461057d57600080fd5b8063972b4612146104ea578063d77d5ed01461050a57600080fd5b80637437ff9f146103ee57806379ba5097146104985780638da5cb5b146104a05780639041be3d146104be57600080fd5b806327e936f1116101095780633a019940116100ee5780633a0199401461030f57806348a98aa4146103175780636def4ce71461034f57600080fd5b806327e936f1146102e957806334adf494146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e6101493660046127cc565b610590565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b604051610276919061288f565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b6040516102769190612954565b6102db6102d636600461297f565b6105a4565b604051908152602001610276565b61014e6102f73660046129ed565b61075d565b61014e61030a366004612a85565b61076e565b61014e610a8a565b61032a610325366004612afa565b610cb5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b6103b261035d366004612b33565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61048b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102769190612b50565b61014e610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff1661032a565b6104d16104cc366004612b33565b610e67565b60405167ffffffffffffffff9091168152602001610276565b6104fd6104f8366004612b33565b610e90565b6040516102769190612ba9565b61032a610518366004612b33565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db610565366004612c03565b610eb8565b61014e610578366004612c6f565b6117c6565b6104fd61058b366004612b33565b6117d7565b61059861180b565b6105a18161188e565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612c8c565b156106bb576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906107139086908690600401612dbd565b602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612f06565b90505b92915050565b61076561180b565b6105a181611a05565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107de5760055473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a855760008383838181106107fd576107fd612f1f565b905060200281019061080f9190612f4e565b61081890612fff565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909116178155908201515191925090156109d8578160200151156109975760005b826040015151811015610947576000836040015182815181106108b1576108b1612f1f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109305783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b61093d6001840182611c35565b505060010161088c565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161098a9190612ba9565b60405180910390a26109d8565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b60005b826060015151811015610a2457610a1b83606001518281518110610a0157610a01612f1f565b602002602001015183600101611c5790919063ffffffff16565b506001016109db565b5060608201515115610a7b57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610a729190612ba9565b60405180910390a25b50506001016107e1565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f91908101906130b0565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a85576000838281518110610b7b57610b7b612f1f565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612f06565b90508015610cab57610c4373ffffffffffffffffffffffffffffffffffffffff83168583611c79565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610ca291815260200190565b60405180910390a35b5050600101610b5e565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610754919061313f565b60015473ffffffffffffffffffffffffffffffffffffffff163314610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106b2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff80821660009081526006602052604081205490916107579116600161318b565b67ffffffffffffffff8116600090815260066020526040902060609061075790600101611d06565b60025460009074010000000000000000000000000000000000000000900460ff1615610f10576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610fb5576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff161561102657610fd86001820184611d1a565b611026576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016106b2565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611083576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff168015611129576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e506906110f6908a908a90600401612dbd565b600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050505b50604080516101c081019091526000610120820181815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811661014085015289811661016085015284549293928392916101808401918791879161119791166131ac565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187806020019061120b91906131d3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161124f88806131d3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016112ab6080890160608a01612c6f565b73ffffffffffffffffffffffffffffffffffffffff168152602001868152602001600081526020018780604001906112e39190613238565b905067ffffffffffffffff8111156112fd576112fd6126c9565b60405190808252806020026020018201604052801561137657816020015b6113636040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b81526020019060019003908161131b5790505b5090529050600061138a6040880188613238565b808060200260200160405190810160405280939291908181526020016000905b828210156113d6576113c7604083028601368190038101906132a0565b815260200190600101906113aa565b5050505050905060005b6113ed6040890189613238565b90508110156114875761145d82828151811061140b5761140b612f1f565b60209081029190910101518a6114218b806131d3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611d49915050565b836101000151828151811061147457611474612f1f565b60209081029190910101526001016113e0565b50600254600090606090819073ffffffffffffffffffffffffffffffffffffffff1663430d138c8c6114be60808e018e8601612c6f565b8c8e80608001906114cf91906131d3565b8b61010001518b6040518863ffffffff1660e01b81526004016114f897969594939291906133bd565b600060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155b91908101906134ef565b60e08901939093529094509250905082611636576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163191906135e2565b611639565b60005b855167ffffffffffffffff909116608091820152850182905260005b856101000151518110156116ab5781818151811061167557611675612f1f565b6020026020010151866101000151828151811061169457611694612f1f565b602090810291909101015160800152600101611655565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c16606082015230608082015261173b90869060a00160405160208183030381529060405280519060200120612060565b85515284516060015160405167ffffffffffffffff918216918d16907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32906117849089906135ff565b60405180910390a35050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505051519150505b949350505050565b6117ce61180b565b6105a1816121b2565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106b2565b565b60005b8151811015611a015760008282815181106118ae576118ae612f1f565b6020026020010151905060008383815181106118cc576118cc612f1f565b60200260200101516000015190508067ffffffffffffffff1660000361192a576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106b2565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611891565b5050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a415750606081015173ffffffffffffffffffffffffffffffffffffffff16155b80611a4d575080602001515b15611a84576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611c2a918490613757565b60405180910390a150565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122a7565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122f6565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a859084906123f0565b60606000611d13836124fc565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610754565b611d916040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611dcf576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ddf858760000151610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81161580611eaf57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ead9190612c8c565b155b15611f015785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016106b2565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611fa09190613805565b6000604051808303816000875af1158015611fbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612005919081019061387b565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c001516040516020016120de95949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b60405160208183030381529060405280519060200120856060015180519060200120866040015180519060200120876101000151604051602001612122919061390c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff821603612231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546122ee57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610757565b506000610757565b600081815260018301602052604081205480156123df57600061231a60018361391f565b855490915060009061232e9060019061391f565b905080821461239357600086600001828154811061234e5761234e612f1f565b906000526020600020015490508087600001848154811061237157612371612f1f565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123a4576123a4613932565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610757565b6000915050610757565b5092915050565b6000612452826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125589092919063ffffffff16565b805190915015610a8557808060200190518101906124709190612c8c565b610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106b2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561254c57602002820191906000526020600020905b815481526020019060010190808311612538575b50505050509050919050565b60606117be8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161258c9190613961565b60006040518083038185875af1925050503d80600081146125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b50915091506125df878383876125ea565b979650505050505050565b606083156126805782516000036126795773ffffffffffffffffffffffffffffffffffffffff85163b612679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b2565b50816117be565b6117be83838151156126955781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b29190612954565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561271b5761271b6126c9565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612768576127686126c9565b604052919050565b600067ffffffffffffffff82111561278a5761278a6126c9565b5060051b60200190565b67ffffffffffffffff811681146105a157600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105a157600080fd5b600060208083850312156127df57600080fd5b823567ffffffffffffffff8111156127f657600080fd5b8301601f8101851361280757600080fd5b803561281a61281582612770565b612721565b81815260069190911b8201830190838101908783111561283957600080fd5b928401925b828410156125df57604084890312156128575760008081fd5b61285f6126f8565b843561286a81612794565b815284860135612879816127aa565b818701528252604093909301929084019061283e565b60808101610757828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156129015781810151838201526020016128e9565b50506000910152565b600081518084526129228160208601602086016128e6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610754602083018461290a565b600060a0828403121561297957600080fd5b50919050565b6000806040838503121561299257600080fd5b823561299d81612794565b9150602083013567ffffffffffffffff8111156129b957600080fd5b6129c585828601612967565b9150509250929050565b80356129da816127aa565b919050565b80151581146105a157600080fd5b600060a082840312156129ff57600080fd5b60405160a0810181811067ffffffffffffffff82111715612a2257612a226126c9565b6040528235612a30816127aa565b81526020830135612a40816129df565b60208201526040830135612a53816127aa565b60408201526060830135612a66816127aa565b60608201526080830135612a79816127aa565b60808201529392505050565b60008060208385031215612a9857600080fd5b823567ffffffffffffffff80821115612ab057600080fd5b818501915085601f830112612ac457600080fd5b813581811115612ad357600080fd5b8660208260051b8501011115612ae857600080fd5b60209290920196919550909350505050565b60008060408385031215612b0d57600080fd5b8235612b1881612794565b91506020830135612b28816127aa565b809150509250929050565b600060208284031215612b4557600080fd5b8135611d1381612794565b60a08101610757828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b6020808252825182820181905260009190848201906040850190845b81811015612bf757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bc5565b50909695505050505050565b60008060008060808587031215612c1957600080fd5b8435612c2481612794565b9350602085013567ffffffffffffffff811115612c4057600080fd5b612c4c87828801612967565b935050604085013591506060850135612c64816127aa565b939692955090935050565b600060208284031215612c8157600080fd5b8135611d13816127aa565b600060208284031215612c9e57600080fd5b8151611d13816129df565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612cde57600080fd5b830160208101925035905067ffffffffffffffff811115612cfe57600080fd5b803603821315612d0d57600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612db2578135612d80816127aa565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612d6d565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612dde8485612ca9565b60a06040860152612df360e086018284612d14565b915050612e036020860186612ca9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612e39848385612d14565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612e7257600080fd5b60209288019283019235915084821115612e8b57600080fd5b8160061b3603831315612e9d57600080fd5b80878503016080880152612eb2848385612d5d565b9450612ec0606089016129cf565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612eeb6080890189612ca9565b94509250808786030160c088015250506125df838383612d14565b600060208284031215612f1857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612f8257600080fd5b9190910192915050565b600082601f830112612f9d57600080fd5b81356020612fad61281583612770565b8083825260208201915060208460051b870101935086841115612fcf57600080fd5b602086015b84811015612ff4578035612fe7816127aa565b8352918301918301612fd4565b509695505050505050565b60006080823603121561301157600080fd5b6040516080810167ffffffffffffffff8282108183111715613035576130356126c9565b816040528435915061304682612794565b908252602084013590613058826129df565b816020840152604085013591508082111561307257600080fd5b61307e36838701612f8c565b6040840152606085013591508082111561309757600080fd5b506130a436828601612f8c565b60608301525092915050565b600060208083850312156130c357600080fd5b825167ffffffffffffffff8111156130da57600080fd5b8301601f810185136130eb57600080fd5b80516130f961281582612770565b81815260059190911b8201830190838101908783111561311857600080fd5b928401925b828410156125df578351613130816127aa565b8252928401929084019061311d565b60006020828403121561315157600080fd5b8151611d13816127aa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156123e9576123e961315c565b600067ffffffffffffffff8083168181036131c9576131c961315c565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261320857600080fd5b83018035915067ffffffffffffffff82111561322357600080fd5b602001915036819003821315612d0d57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261326d57600080fd5b83018035915067ffffffffffffffff82111561328857600080fd5b6020019150600681901b3603821315612d0d57600080fd5b6000604082840312156132b257600080fd5b6132ba6126f8565b82356132c5816127aa565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b848110156133b0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff82511685528582015181878701526133598287018261290a565b91505060408083015186830382880152613373838261290a565b9250505060608083015181870152506080808301519250858203818701525061339c818361290a565b9a86019a94505050908301906001016132f7565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c0606086015261340760c08601898b612d14565b858103608087015261341981896132da565b86810360a0880152875180825285890192509085019060005b81811015613459578351805187168452870151878401529286019291840191600101613432565b50909e9d5050505050505050505050505050565b600082601f83011261347e57600080fd5b815167ffffffffffffffff811115613498576134986126c9565b6134c960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612721565b8181528460208386010111156134de57600080fd5b6117be8260208301602087016128e6565b6000806000806080858703121561350557600080fd5b84519350602080860151613518816129df565b604087015190945067ffffffffffffffff8082111561353657600080fd5b61354289838a0161346d565b9450606088015191508082111561355857600080fd5b818801915088601f83011261356c57600080fd5b815161357a61281582612770565b81815260059190911b8301840190848101908b83111561359957600080fd5b8585015b838110156135d1578051858111156135b55760008081fd5b6135c38e89838a010161346d565b84525091860191860161359d565b50989b979a50959850505050505050565b6000602082840312156135f457600080fd5b8151611d1381612794565b6020815261365060208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161367960c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e08501526136966101c085018361290a565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101008187860301818801526136d4858461290a565b94506080880151925081878603016101208801526136f2858461290a565b945060a0880151925061371e61014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e088015161018088015287015186850390910183870152905061374d83826132da565b9695505050505050565b61012081016137af828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611d13565b602081526000825160a0602084015261382160c084018261290a565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b60006020828403121561388d57600080fd5b815167ffffffffffffffff808211156138a557600080fd5b90830190604082860312156138b957600080fd5b6138c16126f8565b8251828111156138d057600080fd5b6138dc8782860161346d565b8252506020830151828111156138f157600080fd5b6138fd8782860161346d565b60208301525095945050505050565b60208152600061075460208301846132da565b818103818111156107575761075761315c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612f828184602087016128e656fea164736f6c6343000818000a",
+ 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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"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\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101006040523480156200001257600080fd5b50604051620042d2380380620042d283398101604081905262000035916200076e565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d81620003e0565b5050506200086f565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060608101516001600160a01b0316155b8062000261575080602001515b1562000280576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191620003d591849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b81518110156200053057600082828151811062000404576200040462000859565b60200260200101519050600083838151811062000425576200042562000859565b6020026020010151600001519050806001600160401b03166000036200046a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b0381811660008181526006602090815260409182902086820151815488850151600160401b600160e81b031990911669010000000000000000006001600160a01b0390931692830260ff60401b19161768010000000000000000911515820217808455855197811688529387019190915260ff920491909116151591840191909152917fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050620003e3565b5050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200056f576200056f62000534565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620005a057620005a062000534565b604052919050565b80516001600160401b0381168114620005c057600080fd5b919050565b6001600160a01b0381168114620005db57600080fd5b50565b80518015158114620005c057600080fd5b600060a082840312156200060257600080fd5b60405160a081016001600160401b038111828210171562000627576200062762000534565b806040525080915082516200063c81620005c5565b81526200064c60208401620005de565b602082015260408301516200066181620005c5565b604082015260608301516200067681620005c5565b606082015260808301516200068b81620005c5565b6080919091015292915050565b600082601f830112620006aa57600080fd5b815160206001600160401b03821115620006c857620006c862000534565b620006d8818360051b0162000575565b82815260609283028501820192828201919087851115620006f857600080fd5b8387015b85811015620007615781818a031215620007165760008081fd5b620007206200054a565b6200072b82620005a8565b8152858201516200073c81620005c5565b8187015260406200074f838201620005de565b908201528452928401928101620006fc565b5090979650505050505050565b60008060008385036101408112156200078657600080fd5b60808112156200079557600080fd5b50604051608081016001600160401b038082118383101715620007bc57620007bc62000534565b81604052620007cb87620005a8565b835260208701519150620007df82620005c5565b81602084015260408701519150620007f782620005c5565b816040840152606087015191506200080f82620005c5565b816060840152829550620008278860808901620005ef565b94506101208701519250808311156200083f57600080fd5b50506200084f8682870162000698565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e0516139ea620008e86000396000818161021701528181610cfd0152611bff0152600081816101db015281816115c40152611bd801526000818161019f015281816105f40152611bae01526000818161016f0152818161114b015281816116e10152611b8a01526139ea6000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e914610557578063f2fde38b1461056a578063fbca3b741461057d57600080fd5b8063972b4612146104ea578063d77d5ed01461050a57600080fd5b80637437ff9f146103ee57806379ba5097146104985780638da5cb5b146104a05780639041be3d146104be57600080fd5b806327e936f1116101095780633a019940116100ee5780633a0199401461030f57806348a98aa4146103175780636def4ce71461034f57600080fd5b806327e936f1146102e957806334adf494146102fc57600080fd5b806306285c691461013b578063181f5a771461026a57806320487ded146102b35780632716072b146102d4575b600080fd5b61025460408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161026191906126f5565b60405180910390f35b6102a66040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b60405161026191906127ba565b6102c66102c13660046127fb565b610590565b604051908152602001610261565b6102e76102e2366004612969565b610749565b005b6102e76102f7366004612a57565b61075d565b6102e761030a366004612aef565b61076e565b6102e7610a8a565b61032a610325366004612b64565b610cb5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610261565b6103b261035d366004612b9d565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610261565b61048b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102619190612bba565b6102e7610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff1661032a565b6104d16104cc366004612b9d565b610e67565b60405167ffffffffffffffff9091168152602001610261565b6104fd6104f8366004612b9d565b610e90565b6040516102619190612c13565b61032a610518366004612b9d565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102c6610565366004612c6d565b610eb8565b6102e7610578366004612cd9565b6117c6565b6104fd61058b366004612b9d565b6117d7565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561063b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190612cf6565b156106a7576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906106ff9086908690600401612e27565b602060405180830381865afa15801561071c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107409190612f70565b90505b92915050565b61075161180b565b61075a8161188e565b50565b61076561180b565b61075a81611a31565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107de5760055473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a855760008383838181106107fd576107fd612f89565b905060200281019061080f9190612fb8565b61081890613069565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909116178155908201515191925090156109d8578160200151156109975760005b826040015151811015610947576000836040015182815181106108b1576108b1612f89565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109305783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161069e565b61093d6001840182611c61565b505060010161088c565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161098a9190612c13565b60405180910390a26109d8565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161069e565b60005b826060015151811015610a2457610a1b83606001518281518110610a0157610a01612f89565b602002602001015183600101611c8390919063ffffffff16565b506001016109db565b5060608201515115610a7b57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610a729190612c13565b60405180910390a25b50506001016107e1565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f919081019061311a565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a85576000838281518110610b7b57610b7b612f89565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612f70565b90508015610cab57610c4373ffffffffffffffffffffffffffffffffffffffff83168583611ca5565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610ca291815260200190565b60405180910390a35b5050600101610b5e565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074091906131a9565b60015473ffffffffffffffffffffffffffffffffffffffff163314610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161069e565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff8082166000908152600660205260408120549091610743911660016131f5565b67ffffffffffffffff8116600090815260066020526040902060609061074390600101611d32565b60025460009074010000000000000000000000000000000000000000900460ff1615610f10576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610fb5576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff161561102657610fd86001820184611d46565b611026576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161069e565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611083576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff168015611129576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e506906110f6908a908a90600401612e27565b600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050505b50604080516101c081019091526000610120820181815267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166101408501528981166101608501528454929392839291610180840191879187916111979116613216565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187806020019061120b919061323d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161124f888061323d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016112ab6080890160608a01612cd9565b73ffffffffffffffffffffffffffffffffffffffff168152602001868152602001600081526020018780604001906112e391906132a2565b905067ffffffffffffffff8111156112fd576112fd61284b565b60405190808252806020026020018201604052801561137657816020015b6113636040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b81526020019060019003908161131b5790505b5090529050600061138a60408801886132a2565b808060200260200160405190810160405280939291908181526020016000905b828210156113d6576113c76040830286013681900381019061330a565b815260200190600101906113aa565b5050505050905060005b6113ed60408901896132a2565b90508110156114875761145d82828151811061140b5761140b612f89565b60209081029190910101518a6114218b8061323d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611d75915050565b836101000151828151811061147457611474612f89565b60209081029190910101526001016113e0565b50600254600090606090819073ffffffffffffffffffffffffffffffffffffffff1663430d138c8c6114be60808e018e8601612cd9565b8c8e80608001906114cf919061323d565b8b61010001518b6040518863ffffffff1660e01b81526004016114f89796959493929190613427565b600060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155b9190810190613559565b60e08901939093529094509250905082611636576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611631919061364c565b611639565b60005b855167ffffffffffffffff909116608091820152850182905260005b856101000151518110156116ab5781818151811061167557611675612f89565b6020026020010151866101000151828151811061169457611694612f89565b602090810291909101015160800152600101611655565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c16606082015230608082015261173b90869060a0016040516020818303038152906040528051906020012061208c565b85515284516060015160405167ffffffffffffffff918216918d16907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f3290611784908990613669565b60405180910390a35050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505051519150505b949350505050565b6117ce61180b565b61075a816121de565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161069e565b565b60005b8151811015611a2d5760008282815181106118ae576118ae612f89565b6020026020010151905060008383815181106118cc576118cc612f89565b60200260200101516000015190508067ffffffffffffffff1660000361192a576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161069e565b67ffffffffffffffff818116600081815260066020908152604091829020868201518154888501517fffffff000000000000000000000000000000000000000000ffffffffffffffff909116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff9093169283027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff161768010000000000000000911515820217808455855197811688529387019190915260ff920491909116151591840191909152917fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611891565b5050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a6d5750606081015173ffffffffffffffffffffffffffffffffffffffff16155b80611a79575080602001515b15611ab0576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611c569184906137c1565b60405180910390a150565b60006107408373ffffffffffffffffffffffffffffffffffffffff84166122d3565b60006107408373ffffffffffffffffffffffffffffffffffffffff8416612322565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a8590849061241c565b60606000611d3f83612528565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610740565b611dbd6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611dfb576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e0b858760000151610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81161580611edb57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611eb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed99190612cf6565b155b15611f2d5785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161069e565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611fcc919061386f565b6000604051808303816000875af1158015611feb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261203191908101906138e5565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c0015160405160200161210a95949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b6040516020818303038152906040528051906020012085606001518051906020012086604001518051906020012087610100015160405160200161214e9190613976565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff82160361225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161069e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260018301602052604081205461231a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610743565b506000610743565b6000818152600183016020526040812054801561240b576000612346600183613989565b855490915060009061235a90600190613989565b90508082146123bf57600086600001828154811061237a5761237a612f89565b906000526020600020015490508087600001848154811061239d5761239d612f89565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123d0576123d061399c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610743565b6000915050610743565b5092915050565b600061247e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125849092919063ffffffff16565b805190915015610a85578080602001905181019061249c9190612cf6565b610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161069e565b60608160000180548060200260200160405190810160405280929190818152602001828054801561257857602002820191906000526020600020905b815481526020019060010190808311612564575b50505050509050919050565b60606117be8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125b891906139cb565b60006040518083038185875af1925050503d80600081146125f5576040519150601f19603f3d011682016040523d82523d6000602084013e6125fa565b606091505b509150915061260b87838387612616565b979650505050505050565b606083156126ac5782516000036126a55773ffffffffffffffffffffffffffffffffffffffff85163b6126a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161069e565b50816117be565b6117be83838151156126c15781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069e91906127ba565b60808101610743828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b8381101561276757818101518382015260200161274f565b50506000910152565b6000815180845261278881602086016020860161274c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107406020830184612770565b67ffffffffffffffff8116811461075a57600080fd5b600060a082840312156127f557600080fd5b50919050565b6000806040838503121561280e57600080fd5b8235612819816127cd565b9150602083013567ffffffffffffffff81111561283557600080fd5b612841858286016127e3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561289d5761289d61284b565b60405290565b6040805190810167ffffffffffffffff8111828210171561289d5761289d61284b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561290d5761290d61284b565b604052919050565b600067ffffffffffffffff82111561292f5761292f61284b565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461075a57600080fd5b801515811461075a57600080fd5b6000602080838503121561297c57600080fd5b823567ffffffffffffffff81111561299357600080fd5b8301601f810185136129a457600080fd5b80356129b76129b282612915565b6128c6565b818152606091820283018401918482019190888411156129d657600080fd5b938501935b83851015612a3b5780858a0312156129f35760008081fd5b6129fb61287a565b8535612a06816127cd565b815285870135612a1581612939565b81880152604086810135612a288161295b565b90820152835293840193918501916129db565b50979650505050505050565b8035612a5281612939565b919050565b600060a08284031215612a6957600080fd5b60405160a0810181811067ffffffffffffffff82111715612a8c57612a8c61284b565b6040528235612a9a81612939565b81526020830135612aaa8161295b565b60208201526040830135612abd81612939565b60408201526060830135612ad081612939565b60608201526080830135612ae381612939565b60808201529392505050565b60008060208385031215612b0257600080fd5b823567ffffffffffffffff80821115612b1a57600080fd5b818501915085601f830112612b2e57600080fd5b813581811115612b3d57600080fd5b8660208260051b8501011115612b5257600080fd5b60209290920196919550909350505050565b60008060408385031215612b7757600080fd5b8235612b82816127cd565b91506020830135612b9281612939565b809150509250929050565b600060208284031215612baf57600080fd5b8135611d3f816127cd565b60a08101610743828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b6020808252825182820181905260009190848201906040850190845b81811015612c6157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612c2f565b50909695505050505050565b60008060008060808587031215612c8357600080fd5b8435612c8e816127cd565b9350602085013567ffffffffffffffff811115612caa57600080fd5b612cb6878288016127e3565b935050604085013591506060850135612cce81612939565b939692955090935050565b600060208284031215612ceb57600080fd5b8135611d3f81612939565b600060208284031215612d0857600080fd5b8151611d3f8161295b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612d4857600080fd5b830160208101925035905067ffffffffffffffff811115612d6857600080fd5b803603821315612d7757600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612e1c578135612dea81612939565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612dd7565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612e488485612d13565b60a06040860152612e5d60e086018284612d7e565b915050612e6d6020860186612d13565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612ea3848385612d7e565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612edc57600080fd5b60209288019283019235915084821115612ef557600080fd5b8160061b3603831315612f0757600080fd5b80878503016080880152612f1c848385612dc7565b9450612f2a60608901612a47565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612f556080890189612d13565b94509250808786030160c0880152505061260b838383612d7e565b600060208284031215612f8257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612fec57600080fd5b9190910192915050565b600082601f83011261300757600080fd5b813560206130176129b283612915565b8083825260208201915060208460051b87010193508684111561303957600080fd5b602086015b8481101561305e57803561305181612939565b835291830191830161303e565b509695505050505050565b60006080823603121561307b57600080fd5b6040516080810167ffffffffffffffff828210818311171561309f5761309f61284b565b81604052843591506130b0826127cd565b9082526020840135906130c28261295b565b81602084015260408501359150808211156130dc57600080fd5b6130e836838701612ff6565b6040840152606085013591508082111561310157600080fd5b5061310e36828601612ff6565b60608301525092915050565b6000602080838503121561312d57600080fd5b825167ffffffffffffffff81111561314457600080fd5b8301601f8101851361315557600080fd5b80516131636129b282612915565b81815260059190911b8201830190838101908783111561318257600080fd5b928401925b8284101561260b57835161319a81612939565b82529284019290840190613187565b6000602082840312156131bb57600080fd5b8151611d3f81612939565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115612415576124156131c6565b600067ffffffffffffffff808316818103613233576132336131c6565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261327257600080fd5b83018035915067ffffffffffffffff82111561328d57600080fd5b602001915036819003821315612d7757600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132d757600080fd5b83018035915067ffffffffffffffff8211156132f257600080fd5b6020019150600681901b3603821315612d7757600080fd5b60006040828403121561331c57600080fd5b6133246128a3565b823561332f81612939565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b8481101561341a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff82511685528582015181878701526133c382870182612770565b915050604080830151868303828801526133dd8382612770565b925050506060808301518187015250608080830151925085820381870152506134068183612770565b9a86019a9450505090830190600101613361565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c0606086015261347160c08601898b612d7e565b85810360808701526134838189613344565b86810360a0880152875180825285890192509085019060005b818110156134c357835180518716845287015187840152928601929184019160010161349c565b50909e9d5050505050505050505050505050565b600082601f8301126134e857600080fd5b815167ffffffffffffffff8111156135025761350261284b565b61353360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016128c6565b81815284602083860101111561354857600080fd5b6117be82602083016020870161274c565b6000806000806080858703121561356f57600080fd5b845193506020808601516135828161295b565b604087015190945067ffffffffffffffff808211156135a057600080fd5b6135ac89838a016134d7565b945060608801519150808211156135c257600080fd5b818801915088601f8301126135d657600080fd5b81516135e46129b282612915565b81815260059190911b8301840190848101908b83111561360357600080fd5b8585015b8381101561363b5780518581111561361f5760008081fd5b61362d8e89838a01016134d7565b845250918601918601613607565b50989b979a50959850505050505050565b60006020828403121561365e57600080fd5b8151611d3f816127cd565b602081526136ba60208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b600060208301516136e360c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e08501526137006101c0850183612770565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061010081878603018188015261373e8584612770565b945060808801519250818786030161012088015261375c8584612770565b945060a0880151925061378861014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e08801516101808801528701518685039091018387015290506137b78382613344565b9695505050505050565b6101208101613819828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611d3f565b602081526000825160a0602084015261388b60c0840182612770565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b6000602082840312156138f757600080fd5b815167ffffffffffffffff8082111561390f57600080fd5b908301906040828603121561392357600080fd5b61392b6128a3565b82518281111561393a57600080fd5b613946878286016134d7565b82525060208301518281111561395b57600080fd5b613967878286016134d7565b60208301525095945050505050565b6020815260006107406020830184613344565b81810381811115610743576107436131c6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612fec81846020870161274c56fea164736f6c6343000818000a",
}
var OnRampABI = OnRampMetaData.ABI
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 225039bb6e..d17e3a5e0e 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
@@ -25,7 +25,7 @@ multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRate
multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 04b6b261dd71925670bf4d904aaf7bf08543452009feefb88e07d4c49d12e969
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin cff099545fa50fcfd411c16c9cac754a0ba71ef2590840c0732d42604224200f
-onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin cdf282d410d2dc38e47b360d00ab69a262ab240577071a49c2be49aceea5f5fa
+onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 330be295a313aa4064819fb76d27f4b1a35fdcbd0959d68a71f1ebb72d0b1d7f
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b
price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2
registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 75be86323c227917a9bbc3f799d7ed02f92db546653a36db30ed0ebe64461353
From 0a2e295b5328d6e5032b3135ef9e6d8d78de198c Mon Sep 17 00:00:00 2001
From: Mohamed Mehany <7327188+mohamed-mehany@users.noreply.github.com>
Date: Tue, 8 Oct 2024 22:45:20 +0300
Subject: [PATCH 29/32] Bumps chain-selectors version to latest (#1492)
## Motivation
Bumps chain-selectors version to latest.
## Solution
---
core/scripts/go.mod | 2 +-
core/scripts/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
integration-tests/go.mod | 2 +-
integration-tests/go.sum | 4 ++--
integration-tests/load/go.mod | 2 +-
integration-tests/load/go.sum | 4 ++--
8 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index 3d263a92be..df7d7fde31 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -22,7 +22,7 @@ require (
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.17.0
github.com/shopspring/decimal v1.4.0
- github.com/smartcontractkit/chain-selectors v1.0.24
+ github.com/smartcontractkit/chain-selectors v1.0.25
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index f180e2a21d..26ccbfab3f 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -1070,8 +1070,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/chain-selectors v1.0.24 h1:day+2l0vBErgVIs2Y9ifSz+T7hIg4wAoiWlMCjCdhto=
-github.com/smartcontractkit/chain-selectors v1.0.24/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.25 h1:TrcpbCsDRJ1322ukdi64KBou4aabPnQ1OYfQMFMrjcg=
+github.com/smartcontractkit/chain-selectors v1.0.25/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/go.mod b/go.mod
index 2cf454ccae..df03af7cb7 100644
--- a/go.mod
+++ b/go.mod
@@ -73,7 +73,7 @@ require (
github.com/scylladb/go-reflectx v1.0.1
github.com/shirou/gopsutil/v3 v3.24.3
github.com/shopspring/decimal v1.4.0
- github.com/smartcontractkit/chain-selectors v1.0.24
+ github.com/smartcontractkit/chain-selectors v1.0.25
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45
diff --git a/go.sum b/go.sum
index 1ee3d32944..9d88d403e3 100644
--- a/go.sum
+++ b/go.sum
@@ -1026,8 +1026,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/chain-selectors v1.0.24 h1:day+2l0vBErgVIs2Y9ifSz+T7hIg4wAoiWlMCjCdhto=
-github.com/smartcontractkit/chain-selectors v1.0.24/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.25 h1:TrcpbCsDRJ1322ukdi64KBou4aabPnQ1OYfQMFMrjcg=
+github.com/smartcontractkit/chain-selectors v1.0.25/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index 1e949b536e..75e4addf96 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -32,7 +32,7 @@ require (
github.com/segmentio/ksuid v1.0.4
github.com/shopspring/decimal v1.4.0
github.com/slack-go/slack v0.12.2
- github.com/smartcontractkit/chain-selectors v1.0.24
+ github.com/smartcontractkit/chain-selectors v1.0.25
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.0
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index 91d2f9cdf1..20823777cc 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -1413,8 +1413,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/chain-selectors v1.0.24 h1:day+2l0vBErgVIs2Y9ifSz+T7hIg4wAoiWlMCjCdhto=
-github.com/smartcontractkit/chain-selectors v1.0.24/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.25 h1:TrcpbCsDRJ1322ukdi64KBou4aabPnQ1OYfQMFMrjcg=
+github.com/smartcontractkit/chain-selectors v1.0.25/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod
index c46ec64093..49db91a0dd 100644
--- a/integration-tests/load/go.mod
+++ b/integration-tests/load/go.mod
@@ -393,7 +393,7 @@ require (
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
- github.com/smartcontractkit/chain-selectors v1.0.24 // indirect
+ github.com/smartcontractkit/chain-selectors v1.0.25 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827 // indirect
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6e // indirect
diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum
index 09384ccb12..ee0a427069 100644
--- a/integration-tests/load/go.sum
+++ b/integration-tests/load/go.sum
@@ -1385,8 +1385,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/chain-selectors v1.0.24 h1:day+2l0vBErgVIs2Y9ifSz+T7hIg4wAoiWlMCjCdhto=
-github.com/smartcontractkit/chain-selectors v1.0.24/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.25 h1:TrcpbCsDRJ1322ukdi64KBou4aabPnQ1OYfQMFMrjcg=
+github.com/smartcontractkit/chain-selectors v1.0.25/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
From 2d5ff29cfe95c7bfd00773b4186f7d81ac5689f6 Mon Sep 17 00:00:00 2001
From: Ryan Hall
Date: Fri, 11 Oct 2024 01:52:58 -0400
Subject: [PATCH 30/32] Make gas fee staleness threshold configurable per chain
(#1491)
## Motivation
On some chains, it is possible the gas price will just always be zero or
will be fixed at some constant fee
## Solution
Make stalenessThreshold per dest chain and have 0 mean no staleness
check
---
contracts/gas-snapshots/ccip.gas-snapshot | 243 +++++++++---------
contracts/src/v0.8/ccip/FeeQuoter.sol | 55 ++--
.../v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol | 43 +++-
.../ccip/test/feeQuoter/FeeQuoterSetup.t.sol | 3 +-
.../ccip/deployment_test/deployment_test.go | 6 +-
.../ccip/generated/fee_quoter/fee_quoter.go | 15 +-
...rapper-dependency-versions-do-not-edit.txt | 2 +-
7 files changed, 208 insertions(+), 159 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 009e7579b4..1d3bb7b294 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -37,7 +37,7 @@ BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24168)
BurnWithFromMintTokenPool_releaseOrMint:test_Setup_Success() (gas: 24547)
BurnWithFromMintTokenPool_releaseOrMint:test_releaseOrMint_NegativeMintAmount_reverts() (gas: 93840)
BurnWithFromMintTokenPool_releaseOrMint:test_releaseOrMint_Success() (gas: 93423)
-CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431)
+CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2058831)
CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334693)
CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 466117)
CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289739)
@@ -114,7 +114,7 @@ CommitStore_verify:test_Paused_Revert() (gas: 18568)
CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848)
DefensiveExampleTest:test_HappyPath_Success() (gas: 200200)
DefensiveExampleTest:test_Recovery() (gas: 424476)
-E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985)
+E2E:test_E2E_3MessagesSuccess_gas() (gas: 1108425)
EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322)
EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438)
EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026)
@@ -242,16 +242,16 @@ EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Suc
EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 96028)
EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 20598)
EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20966)
-EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 74894)
-EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 80393)
-EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 230742)
+EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 79854)
+EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 85353)
+EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 235702)
EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16943)
EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95505)
-EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 154010)
+EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 158970)
EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24323)
-EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 114740)
+EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 119700)
EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 20142)
-EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63070)
+EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 67550)
EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532)
EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35297)
EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 43218)
@@ -319,58 +319,59 @@ EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrit
EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925)
EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329)
EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370)
-FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16686)
-FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16588)
-FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16630)
-FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 40326)
-FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12483)
-FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 137553)
-FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 80348)
-FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12687)
+FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16878)
+FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16780)
+FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16822)
+FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 41225)
+FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12506)
+FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 140338)
+FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 80418)
+FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12709)
FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11547)
FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54684)
FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45130)
FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12332)
-FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87721)
-FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13233)
-FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17278)
-FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12330)
-FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106501)
-FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110851)
-FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 110904)
-FeeQuoter_constructor:test_Setup_Success() (gas: 4972944)
+FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87853)
+FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13255)
+FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17300)
+FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12352)
+FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106579)
+FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110929)
+FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 110982)
+FeeQuoter_constructor:test_Setup_Success() (gas: 5013710)
FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 68383)
FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29076)
-FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 94781)
-FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14670)
-FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20550)
-FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 68298)
-FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 16892)
-FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16188)
-FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 43667)
+FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 96067)
+FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14708)
+FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20786)
+FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 72793)
+FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 26331)
+FeeQuoter_getTokenAndGasPrices:test_StalenessCheckDisabled_Success() (gas: 111781)
+FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16103)
+FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 109015)
FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 66273)
FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 78322)
-FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 39244)
-FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34880)
-FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27954)
-FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97513)
-FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20468)
-FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27829)
-FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27785)
-FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40376)
-FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29503)
-FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18315)
-FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82344)
-FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 52638)
-FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 238762)
-FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22555)
-FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29847)
-FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100292)
-FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 141892)
-FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21172)
-FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113309)
-FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22691)
-FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62714)
+FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 39239)
+FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34876)
+FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27950)
+FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97567)
+FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20441)
+FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27825)
+FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27781)
+FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40372)
+FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29499)
+FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18354)
+FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82824)
+FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 53482)
+FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 239286)
+FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22593)
+FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29879)
+FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100330)
+FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 142496)
+FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21211)
+FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113826)
+FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22729)
+FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63709)
FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973907)
FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973865)
FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953984)
@@ -385,32 +386,32 @@ FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764)
FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495)
FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037)
FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972029)
-FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43631)
-FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492)
-FeeQuoter_onReport:test_onReport_Success() (gas: 80094)
-FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26860)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17284)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21428)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18516)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18034)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18390)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18512)
-FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44703)
+FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43675)
+FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23514)
+FeeQuoter_onReport:test_onReport_Success() (gas: 80116)
+FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26882)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17404)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21545)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18636)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18154)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18513)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18636)
+FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44725)
FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 19914)
FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20333)
FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17904)
-FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122709)
-FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42032)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28518)
+FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122753)
+FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42054)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28578)
FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 29949)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76145)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28116)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 25987)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76189)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28176)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 26047)
FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19523)
FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 12176)
FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23730)
FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 28505)
-FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74598)
+FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74596)
FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 145320)
FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50875)
FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63847)
@@ -564,8 +565,8 @@ MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24234)
MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275)
MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933)
MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049)
-MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233635)
-MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501725)
+MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233732)
+MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501821)
NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778)
@@ -577,10 +578,10 @@ NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success(
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249120)
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237027)
NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153760)
-NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 169036)
-NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 221191)
+NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 169096)
+NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 221311)
NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126745)
-NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107755)
+NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107815)
NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123102)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 43079)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64408)
@@ -637,8 +638,8 @@ OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64099)
OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68173)
OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291)
OffRamp_commit:test_InvalidRootRevert() (gas: 63356)
-OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6674717)
-OffRamp_commit:test_NoConfig_Revert() (gas: 6258389)
+OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6674716)
+OffRamp_commit:test_NoConfig_Revert() (gas: 6258388)
OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 113042)
OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 121403)
OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 113063)
@@ -663,12 +664,12 @@ OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17639)
OffRamp_execute:test_LargeBatch_Success() (gas: 3426335)
OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 372990)
OffRamp_execute:test_MultipleReports_Success() (gas: 300979)
-OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7083612)
-OffRamp_execute:test_NoConfig_Revert() (gas: 6308087)
+OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7083611)
+OffRamp_execute:test_NoConfig_Revert() (gas: 6308086)
OffRamp_execute:test_NonArray_Revert() (gas: 27562)
OffRamp_execute:test_SingleReport_Success() (gas: 176354)
OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148372)
-OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7086361)
+OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7086360)
OffRamp_execute:test_ZeroReports_Revert() (gas: 17361)
OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18533)
OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244079)
@@ -747,7 +748,7 @@ OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219377)
OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227999)
OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295396)
OffRamp_trialExecute:test_trialExecute_Success() (gas: 277896)
-OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842)
+OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 396282)
OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18018)
OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67797)
OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325198)
@@ -759,12 +760,12 @@ OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Rever
OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 98224)
OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 93247)
OnRamp_constructor:test_Constructor_Success() (gas: 2753286)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115307)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146108)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145705)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143866)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145902)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145300)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115367)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146168)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145765)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143926)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145962)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145360)
OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 140701)
OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38554)
OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143051)
@@ -773,20 +774,20 @@ OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36527)
OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 18291)
OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38431)
OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23640)
-OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186348)
-OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212732)
-OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146934)
-OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161039)
-OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615148)
+OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186528)
+OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212912)
+OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146994)
+OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161099)
+OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615170)
OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010)
OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866)
OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599)
-OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280170)
-OnRamp_getFee:test_EmptyMessage_Success() (gas: 98469)
-OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64623)
-OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86133)
-OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35075)
-OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113595)
+OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280252)
+OnRamp_getFee:test_EmptyMessage_Success() (gas: 98597)
+OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 65467)
+OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 87012)
+OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35114)
+OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113725)
OnRamp_getFee:test_Unhealthy_Revert() (gas: 17039)
OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10474)
OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35348)
@@ -797,11 +798,11 @@ OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (g
OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265)
OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56347)
OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302)
-PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349)
+PingPong_ccipReceive:test_CcipReceive_Success() (gas: 155829)
PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310)
PingPong_plumbing:test_Pausing_Success() (gas: 17810)
-PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 162091)
-PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 181509)
+PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 167051)
+PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 186469)
RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 18822)
RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 18682)
RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 20371)
@@ -925,24 +926,24 @@ Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89366)
Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10662612)
Router_applyRampUpdates:test_OnRampDisable() (gas: 56007)
Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12356)
-Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 114599)
-Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 202430)
-Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 126968)
-Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 214801)
-Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 64520)
+Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 115079)
+Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 202910)
+Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 127448)
+Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 215281)
+Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 69000)
Router_ccipSend:test_InvalidMsgValue() (gas: 32155)
-Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 67177)
-Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 170385)
-Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 54279)
-Router_ccipSend:test_NativeFeeToken_Success() (gas: 168901)
-Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 239227)
+Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 71657)
+Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 175345)
+Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 58759)
+Router_ccipSend:test_NativeFeeToken_Success() (gas: 173861)
+Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 243729)
Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24854)
Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44811)
-Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 171189)
-Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 241701)
+Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 176149)
+Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 246683)
Router_constructor:test_Constructor_Success() (gas: 13128)
Router_getArmProxy:test_getArmProxy() (gas: 10573)
-Router_getFee:test_GetFeeSupportedChain_Success() (gas: 44673)
+Router_getFee:test_GetFeeSupportedChain_Success() (gas: 49153)
Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17192)
Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532)
Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11334)
@@ -957,7 +958,7 @@ Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25224)
Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44799)
Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10998)
SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55660)
-SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 421258)
+SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 428138)
SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20181)
TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51163)
TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 44004)
@@ -985,8 +986,8 @@ TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586499)
TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5618769)
TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246)
TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731)
-TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801)
-TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934)
+TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6440241)
+TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6640374)
TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943)
TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113)
TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476)
@@ -1015,16 +1016,16 @@ TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 1567
TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13219)
TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 282125)
TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17226)
-TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 134605)
+TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 139085)
TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 16000)
-TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 244013)
+TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 244493)
TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16384)
-TokenProxy_ccipSend:test_CcipSend_Success() (gas: 262651)
+TokenProxy_ccipSend:test_CcipSend_Success() (gas: 263419)
TokenProxy_constructor:test_Constructor() (gas: 13836)
TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16899)
TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12706)
TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15885)
-TokenProxy_getFee:test_GetFee_Success() (gas: 85240)
+TokenProxy_getFee:test_GetFee_Success() (gas: 90200)
USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25704)
USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35481)
USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30235)
diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol
index d2a6b77eff..9c6d6a5331 100644
--- a/contracts/src/v0.8/ccip/FeeQuoter.sol
+++ b/contracts/src/v0.8/ccip/FeeQuoter.sol
@@ -29,7 +29,6 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
error TokenNotSupported(address token);
error FeeTokenNotSupported(address token);
- error ChainNotSupported(uint64 chain);
error StaleGasPrice(uint64 destChainSelector, uint256 threshold, uint256 timePassed);
error StaleKeystoneUpdate(address token, uint256 feedTimestamp, uint256 storedTimeStamp);
error DataFeedValueOutOfUint224Range();
@@ -76,7 +75,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
struct StaticConfig {
uint96 maxFeeJuelsPerMsg; // ─╮ Maximum fee that can be charged for a message
address linkToken; // ────────╯ LINK token address
- uint32 stalenessThreshold; // The amount of time a gas price can be stale before it is considered invalid.
+ // The amount of time a token price can be stale before it is considered invalid (gas price staleness is configured per dest chain)
+ uint32 tokenPriceStalenessThreshold;
}
/// @dev The struct representing the received CCIP feed report from keystone IReceiver.onReport()
@@ -103,6 +103,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
uint32 defaultTxGasLimit; //─────────────────╮ Default gas limit for a tx
uint64 gasMultiplierWeiPerEth; // │ Multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost.
uint32 networkFeeUSDCents; // │ Flat network fee to charge for messages, multiples of 0.01 USD
+ uint32 gasPriceStalenessThreshold; // │ The amount of time a gas price can be stale before it is considered invalid (0 means disabled)
bool enforceOutOfOrder; // │ Whether to enforce the allowOutOfOrderExecution extraArg value to be true.
bytes4 chainFamilySelector; // ──────────────╯ Selector that identifies the destination chain's family. Used to determine the correct validations to perform for the dest chain.
}
@@ -202,8 +203,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
/// @dev Subset of tokens which prices tracked by this registry which are fee tokens.
EnumerableSet.AddressSet private s_feeTokens;
- /// @dev The amount of time a gas price can be stale before it is considered invalid.
- uint32 private immutable i_stalenessThreshold;
+ /// @dev The amount of time a token price can be stale before it is considered invalid.
+ uint32 private immutable i_tokenPriceStalenessThreshold;
constructor(
StaticConfig memory staticConfig,
@@ -216,14 +217,14 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
) AuthorizedCallers(priceUpdaters) {
if (
staticConfig.linkToken == address(0) || staticConfig.maxFeeJuelsPerMsg == 0
- || staticConfig.stalenessThreshold == 0
+ || staticConfig.tokenPriceStalenessThreshold == 0
) {
revert InvalidStaticConfig();
}
i_linkToken = staticConfig.linkToken;
i_maxFeeJuelsPerMsg = staticConfig.maxFeeJuelsPerMsg;
- i_stalenessThreshold = staticConfig.stalenessThreshold;
+ i_tokenPriceStalenessThreshold = staticConfig.tokenPriceStalenessThreshold;
_applyFeeTokensUpdates(feeTokens, new address[](0));
_updateTokenPriceFeeds(tokenPriceFeeds);
@@ -241,7 +242,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
Internal.TimestampedPackedUint224 memory tokenPrice = s_usdPerToken[token];
// If the token price is not stale, return it
- if (block.timestamp - tokenPrice.timestamp < i_stalenessThreshold) {
+ if (block.timestamp - tokenPrice.timestamp < i_tokenPriceStalenessThreshold) {
return tokenPrice;
}
@@ -305,14 +306,12 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
function getTokenAndGasPrices(
address token,
uint64 destChainSelector
- ) public view returns (uint224 tokenPrice, uint224 gasPriceValue) {
- Internal.TimestampedPackedUint224 memory gasPrice = s_usdPerUnitGasByDestChainSelector[destChainSelector];
- // We do allow a gas price of 0, but no stale or unset gas prices
- if (gasPrice.timestamp == 0) revert ChainNotSupported(destChainSelector);
- uint256 timePassed = block.timestamp - gasPrice.timestamp;
- if (timePassed > i_stalenessThreshold) revert StaleGasPrice(destChainSelector, i_stalenessThreshold, timePassed);
-
- return (_getValidatedTokenPrice(token), gasPrice.value);
+ ) external view returns (uint224 tokenPrice, uint224 gasPriceValue) {
+ if (!s_destChainConfigs[destChainSelector].isEnabled) revert DestinationChainNotEnabled(destChainSelector);
+ return (
+ _getValidatedTokenPrice(token),
+ _getValidatedGasPrice(destChainSelector, s_destChainConfigs[destChainSelector].gasPriceStalenessThreshold)
+ );
}
/// @notice Convert a given token amount to target token amount.
@@ -374,6 +373,27 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
return Internal.TimestampedPackedUint224({value: rebasedValue, timestamp: uint32(block.timestamp)});
}
+ /// @dev Gets the fee token price and the gas price, both denominated in dollars.
+ /// @param destChainSelector The destination chain to get the gas price for.
+ /// @param gasPriceStalenessThreshold The amount of time a gas price can be stale before it is considered invalid.
+ /// @return gasPriceValue The price of gas in 1e18 dollars per base unit.
+ function _getValidatedGasPrice(
+ uint64 destChainSelector,
+ uint32 gasPriceStalenessThreshold
+ ) private view returns (uint224 gasPriceValue) {
+ Internal.TimestampedPackedUint224 memory gasPrice = s_usdPerUnitGasByDestChainSelector[destChainSelector];
+ // If the staleness threshold is 0, we consider the gas price to be always valid
+ if (gasPriceStalenessThreshold != 0) {
+ // We do allow a gas price of 0, but no stale or unset gas prices
+ uint256 timePassed = block.timestamp - gasPrice.timestamp;
+ if (timePassed > gasPriceStalenessThreshold) {
+ revert StaleGasPrice(destChainSelector, gasPriceStalenessThreshold, timePassed);
+ }
+ }
+
+ return gasPrice.value;
+ }
+
// ================================================================
// │ Fee tokens │
// ================================================================
@@ -507,7 +527,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
_validateMessage(destChainConfig, message.data.length, numberOfTokens, message.receiver);
// The below call asserts that feeToken is a supported token
- (uint224 feeTokenPrice, uint224 packedGasPrice) = getTokenAndGasPrices(message.feeToken, destChainSelector);
+ uint224 feeTokenPrice = _getValidatedTokenPrice(message.feeToken);
+ uint224 packedGasPrice = _getValidatedGasPrice(destChainSelector, destChainConfig.gasPriceStalenessThreshold);
// Calculate premiumFee in USD with 18 decimals precision first.
// If message-only and no token transfers, a flat network fee is charged.
@@ -990,7 +1011,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
return StaticConfig({
maxFeeJuelsPerMsg: i_maxFeeJuelsPerMsg,
linkToken: i_linkToken,
- stalenessThreshold: i_stalenessThreshold
+ tokenPriceStalenessThreshold: i_tokenPriceStalenessThreshold
});
}
}
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol
index 41720898dd..4417a54e9c 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol
@@ -1,8 +1,6 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
-import {IFeeQuoter} from "../../interfaces/IFeeQuoter.sol";
-
import {KeystoneFeedsPermissionHandler} from "../../../keystone/KeystoneFeedsPermissionHandler.sol";
import {AuthorizedCallers} from "../../../shared/access/AuthorizedCallers.sol";
import {MockV3Aggregator} from "../../../tests/MockV3Aggregator.sol";
@@ -35,7 +33,7 @@ contract FeeQuoter_constructor is FeeQuoterSetup {
FeeQuoter.StaticConfig memory staticConfig = FeeQuoter.StaticConfig({
linkToken: s_sourceTokens[0],
maxFeeJuelsPerMsg: MAX_MSG_FEES_JUELS,
- stalenessThreshold: uint32(TWELVE_HOURS)
+ tokenPriceStalenessThreshold: uint32(TWELVE_HOURS)
});
s_feeQuoter = new FeeQuoterHelper(
staticConfig,
@@ -93,7 +91,7 @@ contract FeeQuoter_constructor is FeeQuoterSetup {
FeeQuoter.StaticConfig memory staticConfig = FeeQuoter.StaticConfig({
linkToken: s_sourceTokens[0],
maxFeeJuelsPerMsg: MAX_MSG_FEES_JUELS,
- stalenessThreshold: 0
+ tokenPriceStalenessThreshold: 0
});
vm.expectRevert(FeeQuoter.InvalidStaticConfig.selector);
@@ -113,7 +111,7 @@ contract FeeQuoter_constructor is FeeQuoterSetup {
FeeQuoter.StaticConfig memory staticConfig = FeeQuoter.StaticConfig({
linkToken: address(0),
maxFeeJuelsPerMsg: MAX_MSG_FEES_JUELS,
- stalenessThreshold: uint32(TWELVE_HOURS)
+ tokenPriceStalenessThreshold: uint32(TWELVE_HOURS)
});
vm.expectRevert(FeeQuoter.InvalidStaticConfig.selector);
@@ -133,7 +131,7 @@ contract FeeQuoter_constructor is FeeQuoterSetup {
FeeQuoter.StaticConfig memory staticConfig = FeeQuoter.StaticConfig({
linkToken: s_sourceTokens[0],
maxFeeJuelsPerMsg: 0,
- stalenessThreshold: uint32(TWELVE_HOURS)
+ tokenPriceStalenessThreshold: uint32(TWELVE_HOURS)
});
vm.expectRevert(FeeQuoter.InvalidStaticConfig.selector);
@@ -173,7 +171,7 @@ contract FeeQuoter_getTokenPrice is FeeQuoterSetup {
uint256 originalTimestampValue = block.timestamp;
// Above staleness threshold
- vm.warp(originalTimestampValue + s_feeQuoter.getStaticConfig().stalenessThreshold + 1);
+ vm.warp(originalTimestampValue + s_feeQuoter.getStaticConfig().tokenPriceStalenessThreshold + 1);
address sourceToken = _initialiseSingleTokenPriceFeed();
Internal.TimestampedPackedUint224 memory tokenPriceAnswer = s_feeQuoter.getTokenPrice(sourceToken);
@@ -596,8 +594,35 @@ contract FeeQuoter_getTokenAndGasPrices is FeeQuoterSetup {
assertEq(gasPrice, priceUpdates.gasPriceUpdates[0].usdPerUnitGas);
}
+ function test_StalenessCheckDisabled_Success() public {
+ uint64 neverStaleChainSelector = 345678;
+ FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs();
+ destChainConfigArgs[0].destChainSelector = neverStaleChainSelector;
+ destChainConfigArgs[0].destChainConfig.gasPriceStalenessThreshold = 0; // disables the staleness check
+
+ s_feeQuoter.applyDestChainConfigUpdates(destChainConfigArgs);
+
+ Internal.GasPriceUpdate[] memory gasPriceUpdates = new Internal.GasPriceUpdate[](1);
+ gasPriceUpdates[0] = Internal.GasPriceUpdate({destChainSelector: neverStaleChainSelector, usdPerUnitGas: 999});
+
+ Internal.PriceUpdates memory priceUpdates =
+ Internal.PriceUpdates({tokenPriceUpdates: new Internal.TokenPriceUpdate[](0), gasPriceUpdates: gasPriceUpdates});
+ s_feeQuoter.updatePrices(priceUpdates);
+
+ // this should have no affect! But we do it anyway to make sure the staleness check is disabled
+ vm.warp(block.timestamp + 52_000_000 weeks); // 1M-ish years
+
+ (, uint224 gasPrice) = s_feeQuoter.getTokenAndGasPrices(s_sourceFeeToken, neverStaleChainSelector);
+
+ assertEq(gasPrice, 999);
+ }
+
function test_ZeroGasPrice_Success() public {
uint64 zeroGasDestChainSelector = 345678;
+ FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs();
+ destChainConfigArgs[0].destChainSelector = zeroGasDestChainSelector;
+
+ s_feeQuoter.applyDestChainConfigUpdates(destChainConfigArgs);
Internal.GasPriceUpdate[] memory gasPriceUpdates = new Internal.GasPriceUpdate[](1);
gasPriceUpdates[0] = Internal.GasPriceUpdate({destChainSelector: zeroGasDestChainSelector, usdPerUnitGas: 0});
@@ -607,11 +632,11 @@ contract FeeQuoter_getTokenAndGasPrices is FeeQuoterSetup {
(, uint224 gasPrice) = s_feeQuoter.getTokenAndGasPrices(s_sourceFeeToken, zeroGasDestChainSelector);
- assertEq(gasPrice, priceUpdates.gasPriceUpdates[0].usdPerUnitGas);
+ assertEq(gasPrice, 0);
}
function test_UnsupportedChain_Revert() public {
- vm.expectRevert(abi.encodeWithSelector(FeeQuoter.ChainNotSupported.selector, DEST_CHAIN_SELECTOR + 1));
+ vm.expectRevert(abi.encodeWithSelector(FeeQuoter.DestinationChainNotEnabled.selector, DEST_CHAIN_SELECTOR + 1));
s_feeQuoter.getTokenAndGasPrices(s_sourceTokens[0], DEST_CHAIN_SELECTOR + 1);
}
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 d630c55c0d..9d98fa7e77 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol
@@ -162,7 +162,7 @@ contract FeeQuoterSetup is TokenSetup {
FeeQuoter.StaticConfig({
linkToken: s_sourceTokens[0],
maxFeeJuelsPerMsg: MAX_MSG_FEES_JUELS,
- stalenessThreshold: uint32(TWELVE_HOURS)
+ tokenPriceStalenessThreshold: uint32(TWELVE_HOURS)
}),
priceUpdaters,
feeTokens,
@@ -254,6 +254,7 @@ contract FeeQuoterSetup is TokenSetup {
defaultTxGasLimit: GAS_LIMIT,
gasMultiplierWeiPerEth: 5e17,
networkFeeUSDCents: 1_00,
+ gasPriceStalenessThreshold: uint32(TWELVE_HOURS),
enforceOutOfOrder: false,
chainFamilySelector: Internal.CHAIN_FAMILY_SELECTOR_EVM
})
diff --git a/core/gethwrappers/ccip/deployment_test/deployment_test.go b/core/gethwrappers/ccip/deployment_test/deployment_test.go
index a9c9dc1dd4..698b30c206 100644
--- a/core/gethwrappers/ccip/deployment_test/deployment_test.go
+++ b/core/gethwrappers/ccip/deployment_test/deployment_test.go
@@ -73,9 +73,9 @@ func TestDeployAllV1_6(t *testing.T) {
owner,
chain,
fee_quoter.FeeQuoterStaticConfig{
- MaxFeeJuelsPerMsg: big.NewInt(1e18),
- LinkToken: common.HexToAddress("0x1"),
- StalenessThreshold: 10,
+ MaxFeeJuelsPerMsg: big.NewInt(1e18),
+ LinkToken: common.HexToAddress("0x1"),
+ TokenPriceStalenessThreshold: 10,
},
[]common.Address{common.HexToAddress("0x1")},
[]common.Address{common.HexToAddress("0x2")},
diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
index e6b3176924..6688a60686 100644
--- a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
+++ b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
@@ -63,6 +63,7 @@ type FeeQuoterDestChainConfig struct {
DefaultTxGasLimit uint32
GasMultiplierWeiPerEth uint64
NetworkFeeUSDCents uint32
+ GasPriceStalenessThreshold uint32
EnforceOutOfOrder bool
ChainFamilySelector [4]byte
}
@@ -78,9 +79,9 @@ type FeeQuoterPremiumMultiplierWeiPerEthArgs struct {
}
type FeeQuoterStaticConfig struct {
- MaxFeeJuelsPerMsg *big.Int
- LinkToken common.Address
- StalenessThreshold uint32
+ MaxFeeJuelsPerMsg *big.Int
+ LinkToken common.Address
+ TokenPriceStalenessThreshold uint32
}
type FeeQuoterTokenPriceFeedConfig struct {
@@ -154,8 +155,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\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"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\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chain\",\"type\":\"uint64\"}],\"name\":\"ChainNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"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\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"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\":\"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\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b506040516200776138038062007761833981016040819052620000349162001834565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a5a565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b26565b5050505050505062001ae5565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001953565b60209081029190910101519050620002f560028262000e5f565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001953565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000e7f565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001953565b6020026020010151600b62000e7f60201b90919060201c565b1562000499578281815181106200045b576200045b62001953565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001953565b6020026020010151600b62000e9660201b90919060201c565b156200053b57818181518110620004fd57620004fd62001953565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001953565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001953565b6020026020010151905060008383815181106200065f576200065f62001953565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061016081015163ffffffff16155b80620006ba57506101e08101516001600160e01b031916630a04b54b60e21b14155b80620006da5750806060015163ffffffff1681610160015163ffffffff16115b15620007055760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160881b900460e01b6001600160e01b03191690036200078557816001600160401b03167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb7248260405162000777919062001969565b60405180910390a2620007c9565b816001600160401b03167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab2082604051620007c0919062001969565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000a7e5762000a7e62001953565b6020026020010151600001519050600083838151811062000aa35762000aa362001953565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a5d565b60005b825181101562000d9957600083828151811062000b4a5762000b4a62001953565b6020026020010151905060008160000151905060005b82602001515181101562000d8a5760008360200151828151811062000b895762000b8962001953565b602002602001015160200151905060008460200151838151811062000bb25762000bb262001953565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c115760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000d77908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b60565b50505080600101905062000b29565b5060005b81518110156200054457600082828151811062000dbe5762000dbe62001953565b6020026020010151600001519050600083838151811062000de35762000de362001953565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000d9d565b600062000e76836001600160a01b03841662000ead565b90505b92915050565b600062000e76836001600160a01b03841662000fb1565b600062000e76836001600160a01b03841662001003565b6000818152600183016020526040812054801562000fa657600062000ed460018362001aad565b855490915060009062000eea9060019062001aad565b905081811462000f5657600086600001828154811062000f0e5762000f0e62001953565b906000526020600020015490508087600001848154811062000f345762000f3462001953565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f6a5762000f6a62001acf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000e79565b600091505062000e79565b600081815260018301602052604081205462000ffa5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000e79565b50600062000e79565b6000818152600183016020526040812054801562000fa65760006200102a60018362001aad565b8554909150600090620010409060019062001aad565b905080821462000f5657600086600001828154811062000f0e5762000f0e62001953565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200109f576200109f62001064565b60405290565b60405160c081016001600160401b03811182821017156200109f576200109f62001064565b60405161020081016001600160401b03811182821017156200109f576200109f62001064565b604051601f8201601f191681016001600160401b03811182821017156200111b576200111b62001064565b604052919050565b80516001600160a01b03811681146200113b57600080fd5b919050565b805163ffffffff811681146200113b57600080fd5b6000606082840312156200116857600080fd5b604051606081016001600160401b03811182821017156200118d576200118d62001064565b604052825190915081906001600160601b0381168114620011ad57600080fd5b8152620011bd6020840162001123565b6020820152620011d06040840162001140565b60408201525092915050565b60006001600160401b03821115620011f857620011f862001064565b5060051b60200190565b600082601f8301126200121457600080fd5b815160206200122d6200122783620011dc565b620010f0565b8083825260208201915060208460051b8701019350868411156200125057600080fd5b602086015b848110156200127757620012698162001123565b835291830191830162001255565b509695505050505050565b600082601f8301126200129457600080fd5b81516020620012a76200122783620011dc565b82815260609283028501820192828201919087851115620012c757600080fd5b8387015b858110156200135a5780890382811215620012e65760008081fd5b620012f06200107a565b620012fb8362001123565b8152604080601f1984011215620013125760008081fd5b6200131c6200107a565b92506200132b88850162001123565b835283015160ff81168114620013415760008081fd5b82880152808701919091528452928401928101620012cb565b5090979650505050505050565b80516001600160401b03811681146200113b57600080fd5b805161ffff811681146200113b57600080fd5b805180151581146200113b57600080fd5b600082601f830112620013b557600080fd5b81516020620013c86200122783620011dc565b82815260059290921b84018101918181019086841115620013e857600080fd5b8286015b84811015620012775780516001600160401b03808211156200140d57600080fd5b908801906040601f19838c0381018213156200142857600080fd5b620014326200107a565b6200143f89860162001367565b815282850151848111156200145357600080fd5b8086019550508c603f8601126200146957600080fd5b8885015193506200147e6200122785620011dc565b84815260e09094028501830193898101908e8611156200149d57600080fd5b958401955b858710156200157657868f0360e0811215620014bd57600080fd5b620014c76200107a565b620014d28962001123565b815260c08683011215620014e557600080fd5b620014ef620010a5565b9150620014fe8d8a0162001140565b82526200150d878a0162001140565b8d8301526200151f60608a016200137f565b878301526200153160808a0162001140565b60608301526200154460a08a0162001140565b60808301526200155760c08a0162001392565b60a0830152808d0191909152825260e09690960195908a0190620014a2565b828b015250875250505092840192508301620013ec565b600082601f8301126200159f57600080fd5b81516020620015b26200122783620011dc565b82815260069290921b84018101918181019086841115620015d257600080fd5b8286015b84811015620012775760408189031215620015f15760008081fd5b620015fb6200107a565b620016068262001123565b81526200161585830162001367565b81860152835291830191604001620015d6565b80516001600160e01b0319811681146200113b57600080fd5b600082601f8301126200165357600080fd5b81516020620016666200122783620011dc565b82815261022092830285018201928282019190878511156200168757600080fd5b8387015b858110156200135a5780890382811215620016a65760008081fd5b620016b06200107a565b620016bb8362001367565b815261020080601f1984011215620016d35760008081fd5b620016dd620010ca565b9250620016ec88850162001392565b83526040620016fd8186016200137f565b8985015260606200171081870162001140565b82860152608091506200172582870162001140565b9085015260a06200173886820162001140565b8286015260c091506200174d8287016200137f565b9085015260e06200176086820162001140565b828601526101009150620017768287016200137f565b908501526101206200178a8682016200137f565b828601526101409150620017a08287016200137f565b90850152610160620017b486820162001140565b828601526101809150620017ca82870162001140565b908501526101a0620017de86820162001367565b828601526101c09150620017f482870162001140565b908501526101e06200180886820162001392565b828601526200181983870162001628565b9085015250508087019190915284529284019281016200168b565b6000806000806000806000610120888a0312156200185157600080fd5b6200185d898962001155565b60608901519097506001600160401b03808211156200187b57600080fd5b620018898b838c0162001202565b975060808a0151915080821115620018a057600080fd5b620018ae8b838c0162001202565b965060a08a0151915080821115620018c557600080fd5b620018d38b838c0162001282565b955060c08a0151915080821115620018ea57600080fd5b620018f88b838c01620013a3565b945060e08a01519150808211156200190f57600080fd5b6200191d8b838c016200158d565b93506101008a01519150808211156200193557600080fd5b50620019448a828b0162001641565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815115158152610200810160208301516200198a602084018261ffff169052565b506040830151620019a3604084018263ffffffff169052565b506060830151620019bc606084018263ffffffff169052565b506080830151620019d5608084018263ffffffff169052565b5060a0830151620019ec60a084018261ffff169052565b5060c083015162001a0560c084018263ffffffff169052565b5060e083015162001a1c60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a080850151909116908301526101c0808401511515908301526101e0928301516001600160e01b031916929091019190915290565b8181038181111562000e7957634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615c1b62001b46600039600081816102fa0152818161184d01528181611ee90152611f520152600081816102be01528181610e900152610ef001526000818161028a01528181610f190152610f890152615c1b6000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806379ba509711610104578063a69c64c0116100a2578063d63d3af211610071578063d63d3af214610a88578063d8694ccd14610a90578063f2fde38b14610aa3578063ffdb4b3714610ab657600080fd5b8063a69c64c0146109ad578063bf78e03f146109c0578063cdc73d5114610a6d578063d02641a014610a7557600080fd5b806382b49eb0116100de57806382b49eb0146107ef5780638da5cb5b1461095f57806391a2749a146109875780639ea600261461099a57600080fd5b806379ba5097146107c15780637afac322146107c9578063805f2132146107dc57600080fd5b8063407e10861161017c5780634ab35b0b1161014b5780634ab35b0b14610457578063514e8cff146104975780636def4ce71461053a578063770e2dc4146107ae57600080fd5b8063407e1086146103ee57806341ed29e714610401578063430d138c1461041457806345ac924d1461043757600080fd5b8063181f5a77116101b8578063181f5a77146103735780632451a627146103bc578063325c868e146103d15780633937306f146103d957600080fd5b806241e5be146101de578063061877e31461020457806306285c691461025d575b600080fd5b6101f16101ec36600461431b565b610afe565b6040519081526020015b60405180910390f35b610244610212366004614357565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101fb565b610327604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101fb565b6103af6040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101fb91906143d6565b6103c4610b6c565b6040516101fb91906143e9565b6101f1602481565b6103ec6103e7366004614443565b610b7d565b005b6103ec6103fc3660046145e5565b610e32565b6103ec61040f366004614717565b610e46565b6104276104223660046148f1565b610e88565b6040516101fb94939291906149e5565b61044a610445366004614a84565b611098565b6040516101fb9190614ac6565b61046a610465366004614357565b611163565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b61052d6104a5366004614b41565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101fb9190614b5c565b6107a1610548366004614b41565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161020081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a085015271010000000000000000000000000000000000808404881660c086015275010000000000000000000000000000000000000000008404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c0100000000000000000000000086049094166101a0820152700100000000000000000000000000000000850490911615156101c08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b166101e082015290565b6040516101fb9190614b97565b6103ec6107bc366004614dae565b61116e565b6103ec611180565b6103ec6107d73660046150c8565b61127d565b6103ec6107ea36600461512c565b61128f565b6108ff6107fd366004615198565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101fb9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6103ec6109953660046151c2565b611777565b6103ec6109a8366004615283565b611788565b6103ec6109bb366004615490565b611799565b610a396109ce366004614357565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526007825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101fb565b6103c46117aa565b61052d610a83366004614357565b6117b6565b6101f1601281565b6101f1610a9e366004615555565b6118fa565b6103ec610ab1366004614357565b611e04565b610ac9610ac43660046155aa565b611e15565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101fb565b6000610b0982611fa0565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b3085611fa0565b610b58907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1685615603565b610b62919061561a565b90505b9392505050565b6060610b78600261203a565b905090565b610b85612047565b6000610b918280615655565b9050905060005b81811015610cdb576000610bac8480615655565b83818110610bbc57610bbc6156bd565b905060400201803603810190610bd29190615718565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610cca9290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610b98565b506000610ceb6020840184615655565b9050905060005b81811015610e2c576000610d096020860186615655565b83818110610d1957610d196156bd565b905060400201803603810190610d2f9190615755565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610e1b9290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610cf2565b50505050565b610e3a61208c565b610e438161210d565b50565b610e4e61208c565b60005b8151811015610e8457610e7c828281518110610e6f57610e6f6156bd565b602002602001015161220b565b600101610e51565b5050565b6000806060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610ee9578a9350610f17565b610f148c8c7f0000000000000000000000000000000000000000000000000000000000000000610afe565b93505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16841115610fbb576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b67ffffffffffffffff8d1660009081526009602052604081206001015463ffffffff1690610fea8c8c846123dd565b9050806020015194506110008f8b8b8b8b612586565b92508585611080836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b95509550955050509950995099509995505050505050565b60608160008167ffffffffffffffff8111156110b6576110b661447e565b6040519080825280602002602001820160405280156110fb57816020015b60408051808201909152600080825260208201528152602001906001900390816110d45790505b50905060005b828110156111585761113386868381811061111e5761111e6156bd565b9050602002016020810190610a839190614357565b828281518110611145576111456156bd565b6020908102919091010152600101611101565b509150505b92915050565b600061115d82611fa0565b61117661208c565b610e8482826128f3565b60015473ffffffffffffffffffffffffffffffffffffffff163314611201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610fb2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61128561208c565b610e848282612d05565b60008060006112d387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e4c92505050565b9250925092506112e533838584612e67565b60006112f385870187615778565b905060005b815181101561176c57600060076000848481518110611319576113196156bd565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160009081205474010000000000000000000000000000000000000000900460ff1691508190036113da57828281518110611383576113836156bd565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610fb2565b60006114236012838686815181106113f4576113f46156bd565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612fbf565b90506006600085858151811061143b5761143b6156bd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff168484815181106114ad576114ad6156bd565b60200260200101516040015163ffffffff1610156115b7578383815181106114d7576114d76156bd565b6020026020010151600001518484815181106114f5576114f56156bd565b60200260200101516040015160066000878781518110611517576115176156bd565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610fb2565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681526020018585815181106115f8576115f86156bd565b60200260200101516040015163ffffffff1681525060066000868681518110611623576116236156bd565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905583518490849081106116bb576116bb6156bd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a82868681518110611711576117116156bd565b60200260200101516040015160405161175a9291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a250506001016112f8565b505050505050505050565b61177f61208c565b610e438161308b565b61179061208c565b610e4381613217565b6117a161208c565b610e43816136bd565b6060610b78600b61203a565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169183018290527f00000000000000000000000000000000000000000000000000000000000000001690611878904261583f565b10156118845792915050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600760209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff1690820152906118e9575092915050565b6118f2816137a7565b949350505050565b67ffffffffffffffff8083166000908152600960209081526040808320815161020081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a086015271010000000000000000000000000000000000808504881660c087015275010000000000000000000000000000000000000000008504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c0100000000000000000000000088049094166101a0830152700100000000000000000000000000000000870490931615156101c08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b166101e0840152909190611b14576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610fb2565b611b2f611b276080850160608601614357565b600b90613936565b611b8e57611b436080840160608501614357565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610fb2565b6000611b9d6040850185615655565b9150611bf9905082611bb26020870187615852565b905083611bbf8880615852565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061396592505050565b600080611c15611c0f6080880160608901614357565b88611e15565b9092509050600080808515611c5857611c4c878b611c3960808d0160608e01614357565b88611c4760408f018f615655565b613a0f565b91945092509050611c78565b6101a0870151611c759063ffffffff16662386f26fc10000615603565b92505b61010087015160009061ffff1615611cbc57611cb9886dffffffffffffffffffffffffffff607088901c16611cb060208e018e615852565b90508a86613ce7565b90505b61018088015160009067ffffffffffffffff16611ce5611cdf60808e018e615852565b8c613d97565b600001518563ffffffff168b60a0015161ffff168e8060200190611d099190615852565b611d14929150615603565b8c6080015163ffffffff16611d2991906158b7565b611d3391906158b7565b611d3d91906158b7565b611d57906dffffffffffffffffffffffffffff8916615603565b611d619190615603565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f6060016020810190611d9b9190614357565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054611dd69067ffffffffffffffff1689615603565b611de091906158b7565b611dea91906158b7565b611df4919061561a565b9c9b505050505050505050505050565b611e0c61208c565b610e4381613e58565b67ffffffffffffffff811660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff1691810182905282918203611ecd576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610fb2565b6000816020015163ffffffff1642611ee5919061583f565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16811115611f86576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610fb2565b611f8f86611fa0565b9151919350909150505b9250929050565b600080611fac836117b6565b9050806020015163ffffffff1660001480611fe4575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15612033576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fb2565b5192915050565b60606000610b6583613f4d565b612052600233613936565b61208a576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610fb2565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610fb2565b60005b8151811015610e8457600082828151811061212d5761212d6156bd565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a2505050806001019050612110565b60006122c482600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a3906123d1908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b6040805180820190915260008082526020820152600083900361241e57506040805180820190915267ffffffffffffffff8216815260006020820152610b65565b600061242a84866158ca565b9050600061243b8560048189615910565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016124d857808060200190518101906124cf919061593a565b92505050610b65565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612554576040518060400160405280828060200190518101906125409190615966565b815260006020909101529250610b65915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8086166000908152600960205260409020600101546060917101000000000000000000000000000000000090910460e01b9085908111156125d2576125d261447e565b60405190808252806020026020018201604052801561260557816020015b60608152602001906001900390816125f05790505b50915060005b858110156128e8576000858583818110612627576126276156bd565b61263d9260206040909202019081019150614357565b90506000888884818110612653576126536156bd565b9050602002810190612665919061597f565b612673906040810190615852565b91505060208111156127235767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115612723576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610fb2565b612793848a8a86818110612739576127396156bd565b905060200281019061274b919061597f565b612759906020810190615852565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613fa992505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b01000000000000000000000000000000000000000000000000000000900490911691906128925781612898565b82606001515b6040805163ffffffff83166020820152919250016040516020818303038152906040528887815181106128cd576128cd6156bd565b6020026020010181905250505050505080600101905061260b565b505095945050505050565b60005b8251811015612c1c576000838281518110612913576129136156bd565b6020026020010151905060008160000151905060005b826020015151811015612c0e5760008360200151828151811061294e5761294e6156bd565b6020026020010151602001519050600084602001518381518110612974576129746156bd565b6020026020010151600001519050602063ffffffff16826080015163ffffffff1610156129f75760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610fb2565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b590612bfc908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101612929565b5050508060010190506128f6565b5060005b8151811015612d00576000828281518110612c3d57612c3d6156bd565b60200260200101516000015190506000838381518110612c5f57612c5f6156bd565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101612c20565b505050565b60005b8251811015612da857612d3e838281518110612d2657612d266156bd565b6020026020010151600b613ffb90919063ffffffff16565b15612da057828181518110612d5557612d556156bd565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101612d08565b5060005b8151811015612d0057612de2828281518110612dca57612dca6156bd565b6020026020010151600b61401d90919063ffffffff16565b15612e4457818181518110612df957612df96156bd565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101612dac565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff16612fb8576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610fb2565b5050505050565b600080612fcc84866159bd565b9050600060248260ff16111561300657612fea602460ff841661583f565b612ff590600a615af6565b612fff908561561a565b905061302c565b61301460ff8316602461583f565b61301f90600a615af6565b6130299085615603565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115613082576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b602081015160005b81518110156131265760008282815181106130b0576130b06156bd565b602002602001015190506130ce81600261403f90919063ffffffff16565b1561311d5760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101613093565b50815160005b8151811015610e2c576000828281518110613149576131496156bd565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036131b9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131c4600282613ffb565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010161312c565b60005b8151811015610e84576000828281518110613237576132376156bd565b602002602001015190506000838381518110613255576132556156bd565b60200260200101516000015190506000826020015190508167ffffffffffffffff166000148061328e575061016081015163ffffffff16155b806132e057506101e08101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806132ff5750806060015163ffffffff1681610160015163ffffffff16115b15613342576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610fb2565b67ffffffffffffffff821660009081526009602052604081206001015471010000000000000000000000000000000000900460e01b7fffffffff000000000000000000000000000000000000000000000000000000001690036133e6578167ffffffffffffffff167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb724826040516133d99190614b97565b60405180910390a2613429565b8167ffffffffffffffff167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab20826040516134209190614b97565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c021790555090505050505080600101905061321a565b60005b8151811015610e845760008282815181106136dd576136dd6156bd565b602002602001015160000151905060008383815181106136ff576136ff6156bd565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a250506001016136c0565b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613811573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138359190615b1c565b5050509150506000811215613876576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138f58373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ea9190615b6c565b866020015184612fbf565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff4216602082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b65565b836040015163ffffffff168311156139be5760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610fb2565b836020015161ffff16821115613a00576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e2c846101e0015182613fa9565b6000808083815b81811015613cd9576000878783818110613a3257613a326156bd565b905060400201803603810190613a489190615b89565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613b68576101208d0151613b359061ffff16662386f26fc10000615603565b613b3f90886158b7565b96508c610140015186613b529190615bc2565b9550613b5f602086615bc2565b94505050613cd1565b604081015160009061ffff1615613c215760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613bc4578351613bbd90611fa0565b9050613bc7565b508a5b620186a0836040015161ffff16613c098660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661406190919063ffffffff16565b613c139190615603565b613c1d919061561a565b9150505b6060820151613c309088615bc2565b9650816080015186613c429190615bc2565b8251909650600090613c619063ffffffff16662386f26fc10000615603565b905080821015613c8057613c75818a6158b7565b985050505050613cd1565b6000836020015163ffffffff16662386f26fc10000613c9f9190615603565b905080831115613cbf57613cb3818b6158b7565b99505050505050613cd1565b613cc9838b6158b7565b995050505050505b600101613a16565b505096509650969350505050565b60008063ffffffff8316613cfd61012086615603565b613d09876101c06158b7565b613d1391906158b7565b613d1d91906158b7565b905060008760c0015163ffffffff168860e0015161ffff1683613d409190615603565b613d4a91906158b7565b61010089015190915061ffff16613d716dffffffffffffffffffffffffffff891683615603565b613d7b9190615603565b613d8b90655af3107a4000615603565b98975050505050505050565b60408051808201909152600080825260208201526000613dc3858585610160015163ffffffff166123dd565b9050826060015163ffffffff1681600001511115613e0d576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101c001518015613e2157508060200151155b15610b62576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610fb2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b606081600001805480602002602001604051908101604052809291908181526020018280548015613f9d57602002820191906000526020600020905b815481526020019060010190808311613f89575b50505050509050919050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610e8457612d008161409e565b6000610b658373ffffffffffffffffffffffffffffffffffffffff8416614151565b6000610b658373ffffffffffffffffffffffffffffffffffffffff84166141a0565b6000610b658373ffffffffffffffffffffffffffffffffffffffff841661429a565b6000670de0b6b3a7640000614094837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615603565b610b65919061561a565b600081516020146140dd57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610fb291906143d6565b6000828060200190518101906140f39190615966565b905073ffffffffffffffffffffffffffffffffffffffff811180614118575061040081105b1561115d57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610fb291906143d6565b60008181526001830160205260408120546141985750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561115d565b50600061115d565b600081815260018301602052604081205480156142895760006141c460018361583f565b85549091506000906141d89060019061583f565b905080821461423d5760008660000182815481106141f8576141f86156bd565b906000526020600020015490508087600001848154811061421b5761421b6156bd565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061424e5761424e615bdf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061115d565b600091505061115d565b5092915050565b600081815260018301602052604081205480156142895760006142be60018361583f565b85549091506000906142d29060019061583f565b905081811461423d5760008660000182815481106141f8576141f86156bd565b803573ffffffffffffffffffffffffffffffffffffffff8116811461431657600080fd5b919050565b60008060006060848603121561433057600080fd5b614339846142f2565b92506020840135915061434e604085016142f2565b90509250925092565b60006020828403121561436957600080fd5b610b65826142f2565b6000815180845260005b818110156143985760208185018101518683018201520161437c565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b656020830184614372565b6020808252825182820181905260009190848201906040850190845b8181101561443757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614405565b50909695505050505050565b60006020828403121561445557600080fd5b813567ffffffffffffffff81111561446c57600080fd5b820160408185031215610b6557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156144d0576144d061447e565b60405290565b60405160a0810167ffffffffffffffff811182821017156144d0576144d061447e565b60405160c0810167ffffffffffffffff811182821017156144d0576144d061447e565b604051610200810167ffffffffffffffff811182821017156144d0576144d061447e565b6040516060810167ffffffffffffffff811182821017156144d0576144d061447e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156145aa576145aa61447e565b604052919050565b600067ffffffffffffffff8211156145cc576145cc61447e565b5060051b60200190565b60ff81168114610e4357600080fd5b600060208083850312156145f857600080fd5b823567ffffffffffffffff81111561460f57600080fd5b8301601f8101851361462057600080fd5b803561463361462e826145b2565b614563565b8181526060918202830184019184820191908884111561465257600080fd5b938501935b838510156146f257848903818112156146705760008081fd5b6146786144ad565b614681876142f2565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156146b55760008081fd5b6146bd6144ad565b92506146ca8989016142f2565b83528701356146d8816145d6565b828901528088019190915283529384019391850191614657565b50979650505050505050565b8015158114610e4357600080fd5b8035614316816146fe565b6000602080838503121561472a57600080fd5b823567ffffffffffffffff81111561474157600080fd5b8301601f8101851361475257600080fd5b803561476061462e826145b2565b81815260a0918202830184019184820191908884111561477f57600080fd5b938501935b838510156146f25780858a03121561479c5760008081fd5b6147a46144d6565b6147ad866142f2565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146147e25760008081fd5b818801526040868101357fffff0000000000000000000000000000000000000000000000000000000000008116811461481b5760008081fd5b90820152606061482c8782016142f2565b9082015260808681013561483f816146fe565b9082015283529384019391850191614784565b803567ffffffffffffffff8116811461431657600080fd5b60008083601f84011261487c57600080fd5b50813567ffffffffffffffff81111561489457600080fd5b602083019150836020828501011115611f9957600080fd5b60008083601f8401126148be57600080fd5b50813567ffffffffffffffff8111156148d657600080fd5b6020830191508360208260051b8501011115611f9957600080fd5b600080600080600080600080600060c08a8c03121561490f57600080fd5b6149188a614852565b985061492660208b016142f2565b975060408a0135965060608a013567ffffffffffffffff8082111561494a57600080fd5b6149568d838e0161486a565b909850965060808c013591508082111561496f57600080fd5b61497b8d838e016148ac565b909650945060a08c013591508082111561499457600080fd5b818c0191508c601f8301126149a857600080fd5b8135818111156149b757600080fd5b8d60208260061b85010111156149cc57600080fd5b6020830194508093505050509295985092959850929598565b848152600060208515158184015260806040840152614a076080840186614372565b8381036060850152845180825282820190600581901b8301840184880160005b83811015614a73577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552614a61838351614372565b94870194925090860190600101614a27565b50909b9a5050505050505050505050565b60008060208385031215614a9757600080fd5b823567ffffffffffffffff811115614aae57600080fd5b614aba858286016148ac565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614b3457614b2484835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101614ae3565b5091979650505050505050565b600060208284031215614b5357600080fd5b610b6582614852565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff16908201526040810161115d565b81511515815261020081016020830151614bb7602084018261ffff169052565b506040830151614bcf604084018263ffffffff169052565b506060830151614be7606084018263ffffffff169052565b506080830151614bff608084018263ffffffff169052565b5060a0830151614c1560a084018261ffff169052565b5060c0830151614c2d60c084018263ffffffff169052565b5060e0830151614c4360e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a080850151909116908301526101c0808401511515908301526101e0808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff8116811461431657600080fd5b803561ffff8116811461431657600080fd5b600082601f830112614d2757600080fd5b81356020614d3761462e836145b2565b82815260069290921b84018101918181019086841115614d5657600080fd5b8286015b84811015614da35760408189031215614d735760008081fd5b614d7b6144ad565b614d8482614852565b8152614d918583016142f2565b81860152835291830191604001614d5a565b509695505050505050565b60008060408385031215614dc157600080fd5b67ffffffffffffffff83351115614dd757600080fd5b83601f843585010112614de957600080fd5b614df961462e84358501356145b2565b8335840180358083526020808401939260059290921b90910101861015614e1f57600080fd5b602085358601015b85358601803560051b0160200181101561502c5767ffffffffffffffff81351115614e5157600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a03011215614e8a57600080fd5b614e926144ad565b614e9e60208301614852565b815267ffffffffffffffff60408301351115614eb957600080fd5b88603f604084013584010112614ece57600080fd5b614ee461462e60206040850135850101356145b2565b6020604084810135850182810135808552928401939260e00201018b1015614f0b57600080fd5b6040808501358501015b6040858101358601602081013560e002010181101561500d5760e0818d031215614f3e57600080fd5b614f466144ad565b614f4f826142f2565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215614f8357600080fd5b614f8b6144f9565b614f9760208401614cf0565b8152614fa560408401614cf0565b6020820152614fb660608401614d04565b6040820152614fc760808401614cf0565b6060820152614fd860a08401614cf0565b6080820152614fea60c08401356146fe565b60c083013560a0820152602082810191909152908452929092019160e001614f15565b5080602084015250508085525050602083019250602081019050614e27565b5092505067ffffffffffffffff6020840135111561504957600080fd5b6150598460208501358501614d16565b90509250929050565b600082601f83011261507357600080fd5b8135602061508361462e836145b2565b8083825260208201915060208460051b8701019350868411156150a557600080fd5b602086015b84811015614da3576150bb816142f2565b83529183019183016150aa565b600080604083850312156150db57600080fd5b823567ffffffffffffffff808211156150f357600080fd5b6150ff86838701615062565b9350602085013591508082111561511557600080fd5b5061512285828601615062565b9150509250929050565b6000806000806040858703121561514257600080fd5b843567ffffffffffffffff8082111561515a57600080fd5b6151668883890161486a565b9096509450602087013591508082111561517f57600080fd5b5061518c8782880161486a565b95989497509550505050565b600080604083850312156151ab57600080fd5b6151b483614852565b9150615059602084016142f2565b6000602082840312156151d457600080fd5b813567ffffffffffffffff808211156151ec57600080fd5b908301906040828603121561520057600080fd5b6152086144ad565b82358281111561521757600080fd5b61522387828601615062565b82525060208301358281111561523857600080fd5b61524487828601615062565b60208301525095945050505050565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461431657600080fd5b6000602080838503121561529657600080fd5b823567ffffffffffffffff8111156152ad57600080fd5b8301601f810185136152be57600080fd5b80356152cc61462e826145b2565b81815261022091820283018401918482019190888411156152ec57600080fd5b938501935b838510156146f2578489038181121561530a5760008081fd5b6153126144ad565b61531b87614852565b8152610200807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156153505760008081fd5b61535861451c565b925061536589890161470c565b83526040615374818a01614d04565b8a8501526060615385818b01614cf0565b8286015260809150615398828b01614cf0565b9085015260a06153a98a8201614cf0565b8286015260c091506153bc828b01614d04565b9085015260e06153cd8a8201614cf0565b8286015261010091506153e1828b01614d04565b908501526101206153f38a8201614d04565b828601526101409150615407828b01614d04565b908501526101606154198a8201614cf0565b82860152610180915061542d828b01614cf0565b908501526101a061543f8a8201614852565b828601526101c09150615453828b01614cf0565b908501526101e06154658a820161470c565b82860152615474838b01615253565b90850152505080880191909152835293840193918501916152f1565b600060208083850312156154a357600080fd5b823567ffffffffffffffff8111156154ba57600080fd5b8301601f810185136154cb57600080fd5b80356154d961462e826145b2565b81815260069190911b820183019083810190878311156154f857600080fd5b928401925b8284101561554a57604084890312156155165760008081fd5b61551e6144ad565b615527856142f2565b8152615534868601614852565b81870152825260409390930192908401906154fd565b979650505050505050565b6000806040838503121561556857600080fd5b61557183614852565b9150602083013567ffffffffffffffff81111561558d57600080fd5b830160a0818603121561559f57600080fd5b809150509250929050565b600080604083850312156155bd57600080fd5b6155c6836142f2565b915061505960208401614852565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761115d5761115d6155d4565b600082615650577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261568a57600080fd5b83018035915067ffffffffffffffff8211156156a557600080fd5b6020019150600681901b3603821315611f9957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461431657600080fd5b60006040828403121561572a57600080fd5b6157326144ad565b61573b836142f2565b8152615749602084016156ec565b60208201529392505050565b60006040828403121561576757600080fd5b61576f6144ad565b61573b83614852565b6000602080838503121561578b57600080fd5b823567ffffffffffffffff8111156157a257600080fd5b8301601f810185136157b357600080fd5b80356157c161462e826145b2565b818152606091820283018401918482019190888411156157e057600080fd5b938501935b838510156146f25780858a0312156157fd5760008081fd5b615805614540565b61580e866142f2565b815261581b8787016156ec565b87820152604061582c818801614cf0565b90820152835293840193918501916157e5565b8181038181111561115d5761115d6155d4565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261588757600080fd5b83018035915067ffffffffffffffff8211156158a257600080fd5b602001915036819003821315611f9957600080fd5b8082018082111561115d5761115d6155d4565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614ce85760049490940360031b84901b1690921692915050565b6000808585111561592057600080fd5b8386111561592d57600080fd5b5050820193919092039150565b60006040828403121561594c57600080fd5b6159546144ad565b825181526020830151615749816146fe565b60006020828403121561597857600080fd5b5051919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126159b357600080fd5b9190910192915050565b60ff818116838216019081111561115d5761115d6155d4565b600181815b80851115615a2f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a1557615a156155d4565b80851615615a2257918102915b93841c93908002906159db565b509250929050565b600082615a465750600161115d565b81615a535750600061115d565b8160018114615a695760028114615a7357615a8f565b600191505061115d565b60ff841115615a8457615a846155d4565b50506001821b61115d565b5060208310610133831016604e8410600b8410161715615ab2575081810a61115d565b615abc83836159d6565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615aee57615aee6155d4565b029392505050565b6000610b658383615a37565b805169ffffffffffffffffffff8116811461431657600080fd5b600080600080600060a08688031215615b3457600080fd5b615b3d86615b02565b9450602086015193506040860151925060608601519150615b6060808701615b02565b90509295509295909350565b600060208284031215615b7e57600080fd5b8151610b65816145d6565b600060408284031215615b9b57600080fd5b615ba36144ad565b615bac836142f2565b8152602083013560208201528091505092915050565b63ffffffff818116838216019080821115614293576142936155d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ 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\":\"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\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"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\"}],\"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\":\"feeTokensToAdd\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"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\":\"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\":\"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\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x60e06040523480156200001157600080fd5b506040516200787038038062007870833981016040819052620000349162001871565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a82565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b4e565b5050505050505062001b2f565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001990565b60209081029190910101519050620002f560028262000e87565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001990565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000ea7565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001990565b6020026020010151600b62000ea760201b90919060201c565b1562000499578281815181106200045b576200045b62001990565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001990565b6020026020010151600b62000ebe60201b90919060201c565b156200053b57818181518110620004fd57620004fd62001990565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001990565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001990565b6020026020010151905060008383815181106200065f576200065f62001990565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061016081015163ffffffff16155b80620006ba57506102008101516001600160e01b031916630a04b54b60e21b14155b80620006da5750806060015163ffffffff1681610160015163ffffffff16115b15620007055760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160a81b900460e01b6001600160e01b03191690036200078557816001600160401b03167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626582604051620007779190620019a6565b60405180910390a2620007c9565b816001600160401b03167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051620007c09190620019a6565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000aa65762000aa662001990565b6020026020010151600001519050600083838151811062000acb5762000acb62001990565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a85565b60005b825181101562000dc157600083828151811062000b725762000b7262001990565b6020026020010151905060008160000151905060005b82602001515181101562000db25760008360200151828151811062000bb15762000bb162001990565b602002602001015160200151905060008460200151838151811062000bda5762000bda62001990565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c395760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000d9f908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b88565b50505080600101905062000b51565b5060005b81518110156200054457600082828151811062000de65762000de662001990565b6020026020010151600001519050600083838151811062000e0b5762000e0b62001990565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000dc5565b600062000e9e836001600160a01b03841662000ed5565b90505b92915050565b600062000e9e836001600160a01b03841662000fd9565b600062000e9e836001600160a01b0384166200102b565b6000818152600183016020526040812054801562000fce57600062000efc60018362001af7565b855490915060009062000f129060019062001af7565b905081811462000f7e57600086600001828154811062000f365762000f3662001990565b906000526020600020015490508087600001848154811062000f5c5762000f5c62001990565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f925762000f9262001b19565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000ea1565b600091505062000ea1565b6000818152600183016020526040812054620010225750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000ea1565b50600062000ea1565b6000818152600183016020526040812054801562000fce5760006200105260018362001af7565b8554909150600090620010689060019062001af7565b905080821462000f7e57600086600001828154811062000f365762000f3662001990565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620010c757620010c76200108c565b60405290565b60405160c081016001600160401b0381118282101715620010c757620010c76200108c565b60405161022081016001600160401b0381118282101715620010c757620010c76200108c565b604051601f8201601f191681016001600160401b03811182821017156200114357620011436200108c565b604052919050565b80516001600160a01b03811681146200116357600080fd5b919050565b805163ffffffff811681146200116357600080fd5b6000606082840312156200119057600080fd5b604051606081016001600160401b0381118282101715620011b557620011b56200108c565b604052825190915081906001600160601b0381168114620011d557600080fd5b8152620011e5602084016200114b565b6020820152620011f86040840162001168565b60408201525092915050565b60006001600160401b038211156200122057620012206200108c565b5060051b60200190565b600082601f8301126200123c57600080fd5b81516020620012556200124f8362001204565b62001118565b8083825260208201915060208460051b8701019350868411156200127857600080fd5b602086015b848110156200129f5762001291816200114b565b83529183019183016200127d565b509695505050505050565b600082601f830112620012bc57600080fd5b81516020620012cf6200124f8362001204565b82815260609283028501820192828201919087851115620012ef57600080fd5b8387015b858110156200138257808903828112156200130e5760008081fd5b62001318620010a2565b62001323836200114b565b8152604080601f19840112156200133a5760008081fd5b62001344620010a2565b9250620013538885016200114b565b835283015160ff81168114620013695760008081fd5b82880152808701919091528452928401928101620012f3565b5090979650505050505050565b80516001600160401b03811681146200116357600080fd5b805161ffff811681146200116357600080fd5b805180151581146200116357600080fd5b600082601f830112620013dd57600080fd5b81516020620013f06200124f8362001204565b82815260059290921b840181019181810190868411156200141057600080fd5b8286015b848110156200129f5780516001600160401b03808211156200143557600080fd5b908801906040601f19838c0381018213156200145057600080fd5b6200145a620010a2565b620014678986016200138f565b815282850151848111156200147b57600080fd5b8086019550508c603f8601126200149157600080fd5b888501519350620014a66200124f8562001204565b84815260e09094028501830193898101908e861115620014c557600080fd5b958401955b858710156200159e57868f0360e0811215620014e557600080fd5b620014ef620010a2565b620014fa896200114b565b815260c086830112156200150d57600080fd5b62001517620010cd565b9150620015268d8a0162001168565b825262001535878a0162001168565b8d8301526200154760608a01620013a7565b878301526200155960808a0162001168565b60608301526200156c60a08a0162001168565b60808301526200157f60c08a01620013ba565b60a0830152808d0191909152825260e09690960195908a0190620014ca565b828b01525087525050509284019250830162001414565b600082601f830112620015c757600080fd5b81516020620015da6200124f8362001204565b82815260069290921b84018101918181019086841115620015fa57600080fd5b8286015b848110156200129f5760408189031215620016195760008081fd5b62001623620010a2565b6200162e826200114b565b81526200163d8583016200138f565b81860152835291830191604001620015fe565b80516001600160e01b0319811681146200116357600080fd5b600082601f8301126200167b57600080fd5b815160206200168e6200124f8362001204565b8281526102409283028501820192828201919087851115620016af57600080fd5b8387015b85811015620013825780890382811215620016ce5760008081fd5b620016d8620010a2565b620016e3836200138f565b815261022080601f1984011215620016fb5760008081fd5b62001705620010f2565b925062001714888501620013ba565b8352604062001725818601620013a7565b8985015260606200173881870162001168565b82860152608091506200174d82870162001168565b9085015260a06200176086820162001168565b8286015260c0915062001775828701620013a7565b9085015260e06200178886820162001168565b8286015261010091506200179e828701620013a7565b90850152610120620017b2868201620013a7565b828601526101409150620017c8828701620013a7565b90850152610160620017dc86820162001168565b828601526101809150620017f282870162001168565b908501526101a0620018068682016200138f565b828601526101c091506200181c82870162001168565b908501526101e06200183086820162001168565b82860152610200915062001846828701620013ba565b908501526200185785830162001650565b9084015250808701919091528452928401928101620016b3565b6000806000806000806000610120888a0312156200188e57600080fd5b6200189a89896200117d565b60608901519097506001600160401b0380821115620018b857600080fd5b620018c68b838c016200122a565b975060808a0151915080821115620018dd57600080fd5b620018eb8b838c016200122a565b965060a08a01519150808211156200190257600080fd5b620019108b838c01620012aa565b955060c08a01519150808211156200192757600080fd5b620019358b838c01620013cb565b945060e08a01519150808211156200194c57600080fd5b6200195a8b838c01620015b5565b93506101008a01519150808211156200197257600080fd5b50620019818a828b0162001669565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b81511515815261022081016020830151620019c7602084018261ffff169052565b506040830151620019e0604084018263ffffffff169052565b506060830151620019f9606084018263ffffffff169052565b50608083015162001a12608084018263ffffffff169052565b5060a083015162001a2960a084018261ffff169052565b5060c083015162001a4260c084018263ffffffff169052565b5060e083015162001a5960e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000ea157634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615cee62001b82600039600081816102fa01526118750152600081816102be01528181610eb80152610f1801526000818161028a01528181610f410152610fb10152615cee6000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c8063770e2dc411610104578063a69c64c0116100a2578063d63d3af211610071578063d63d3af214610ab0578063d8694ccd14610ab8578063f2fde38b14610acb578063ffdb4b3714610ade57600080fd5b8063a69c64c0146109d5578063bf78e03f146109e8578063cdc73d5114610a95578063d02641a014610a9d57600080fd5b8063805f2132116100de578063805f21321461081757806382b49eb01461082a5780638da5cb5b1461099a57806391a2749a146109c257600080fd5b8063770e2dc4146107e957806379ba5097146107fc5780637afac3221461080457600080fd5b8063407e10861161017c5780634ab35b0b1161014b5780634ab35b0b14610457578063514e8cff146104975780636cb5f3dd1461053a5780636def4ce71461054d57600080fd5b8063407e1086146103ee57806341ed29e714610401578063430d138c1461041457806345ac924d1461043757600080fd5b8063181f5a77116101b8578063181f5a77146103735780632451a627146103bc578063325c868e146103d15780633937306f146103d957600080fd5b806241e5be146101de578063061877e31461020457806306285c691461025d575b600080fd5b6101f16101ec3660046143ce565b610b26565b6040519081526020015b60405180910390f35b61024461021236600461440a565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101fb565b610327604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101fb565b6103af6040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101fb9190614489565b6103c4610b94565b6040516101fb919061449c565b6101f1602481565b6103ec6103e73660046144f6565b610ba5565b005b6103ec6103fc366004614698565b610e5a565b6103ec61040f3660046147ca565b610e6e565b6104276104223660046149a4565b610eb0565b6040516101fb9493929190614a98565b61044a610445366004614b37565b6110c0565b6040516101fb9190614b79565b61046a61046536600461440a565b61118b565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b61052d6104a5366004614bf4565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101fb9190614c0f565b6103ec610548366004614ca0565b611196565b6107dc61055b366004614bf4565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c01000000000000000000000000860485166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101fb9190614ec0565b6103ec6107f73660046150be565b6111a7565b6103ec6111b9565b6103ec6108123660046153d8565b6112b6565b6103ec61082536600461543c565b6112c8565b61093a6108383660046154a8565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101fb9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6103ec6109d03660046154d2565b6117b0565b6103ec6109e3366004615563565b6117c1565b610a616109f636600461440a565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526007825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101fb565b6103c46117d2565b61052d610aab36600461440a565b6117de565b6101f1601281565b6101f1610ac6366004615628565b611922565b6103ec610ad936600461440a565b611e5a565b610af1610aec36600461567d565b611e6b565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101fb565b6000610b3182611f23565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b5885611f23565b610b80907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856156d6565b610b8a91906156ed565b90505b9392505050565b6060610ba06002611fbd565b905090565b610bad611fca565b6000610bb98280615728565b9050905060005b81811015610d03576000610bd48480615728565b83818110610be457610be4615790565b905060400201803603810190610bfa91906157eb565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610cf29290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610bc0565b506000610d136020840184615728565b9050905060005b81811015610e54576000610d316020860186615728565b83818110610d4157610d41615790565b905060400201803603810190610d579190615828565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610e439290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610d1a565b50505050565b610e6261200f565b610e6b81612090565b50565b610e7661200f565b60005b8151811015610eac57610ea4828281518110610e9757610e97615790565b602002602001015161218e565b600101610e79565b5050565b6000806060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610f11578a9350610f3f565b610f3c8c8c7f0000000000000000000000000000000000000000000000000000000000000000610b26565b93505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16841115610fe3576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b67ffffffffffffffff8d1660009081526009602052604081206001015463ffffffff16906110128c8c84612360565b9050806020015194506110288f8b8b8b8b612509565b925085856110a8836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b95509550955050509950995099509995505050505050565b60608160008167ffffffffffffffff8111156110de576110de614531565b60405190808252806020026020018201604052801561112357816020015b60408051808201909152600080825260208201528152602001906001900390816110fc5790505b50905060005b828110156111805761115b86868381811061114657611146615790565b9050602002016020810190610aab919061440a565b82828151811061116d5761116d615790565b6020908102919091010152600101611129565b509150505b92915050565b600061118582611f23565b61119e61200f565b610e6b8161287a565b6111af61200f565b610eac8282612d4c565b60015473ffffffffffffffffffffffffffffffffffffffff16331461123a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610fda565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112be61200f565b610eac828261315e565b600080600061130c87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506132a592505050565b92509250925061131e338385846132c0565b600061132c8587018761584b565b905060005b81518110156117a55760006007600084848151811061135257611352615790565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160009081205474010000000000000000000000000000000000000000900460ff169150819003611413578282815181106113bc576113bc615790565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610fda565b600061145c60128386868151811061142d5761142d615790565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613418565b90506006600085858151811061147457611474615790565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff168484815181106114e6576114e6615790565b60200260200101516040015163ffffffff1610156115f05783838151811061151057611510615790565b60200260200101516000015184848151811061152e5761152e615790565b6020026020010151604001516006600087878151811061155057611550615790565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610fda565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200185858151811061163157611631615790565b60200260200101516040015163ffffffff168152506006600086868151811061165c5761165c615790565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905583518490849081106116f4576116f4615790565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a8286868151811061174a5761174a615790565b6020026020010151604001516040516117939291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a25050600101611331565b505050505050505050565b6117b861200f565b610e6b816134e4565b6117c961200f565b610e6b81613670565b6060610ba0600b611fbd565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169183018290527f000000000000000000000000000000000000000000000000000000000000000016906118a09042615912565b10156118ac5792915050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600760209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff169082015290611911575092915050565b61191a8161375a565b949350505050565b67ffffffffffffffff8083166000908152600960209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c01000000000000000000000000880485166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611b5c576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610fda565b611b77611b6f608085016060860161440a565b600b906138e9565b611bd657611b8b608084016060850161440a565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610fda565b6000611be56040850185615728565b9150611c41905082611bfa6020870187615925565b905083611c078880615925565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061391892505050565b6000611c5b611c56608087016060880161440a565b611f23565b90506000611c6e87856101c001516139c2565b9050600080808515611cae57611ca2878b611c8f60808d0160608e0161440a565b88611c9d60408f018f615728565b613ac2565b91945092509050611cce565b6101a0870151611ccb9063ffffffff16662386f26fc100006156d6565b92505b61010087015160009061ffff1615611d1257611d0f886dffffffffffffffffffffffffffff607088901c16611d0660208e018e615925565b90508a86613d9a565b90505b61018088015160009067ffffffffffffffff16611d3b611d3560808e018e615925565b8c613e4a565b600001518563ffffffff168b60a0015161ffff168e8060200190611d5f9190615925565b611d6a9291506156d6565b8c6080015163ffffffff16611d7f919061598a565b611d89919061598a565b611d93919061598a565b611dad906dffffffffffffffffffffffffffff89166156d6565b611db791906156d6565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f6060016020810190611df1919061440a565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054611e2c9067ffffffffffffffff16896156d6565b611e36919061598a565b611e40919061598a565b611e4a91906156ed565b9c9b505050505050505050505050565b611e6261200f565b610e6b81613f0b565b67ffffffffffffffff8116600090815260096020526040812054819060ff16611ecc576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610fda565b611ed584611f23565b67ffffffffffffffff8416600090815260096020526040902060010154611f17908590700100000000000000000000000000000000900463ffffffff166139c2565b915091505b9250929050565b600080611f2f836117de565b9050806020015163ffffffff1660001480611f67575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15611fb6576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fda565b5192915050565b60606000610b8d83614000565b611fd56002336138e9565b61200d576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610fda565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610fda565b60005b8151811015610eac5760008282815181106120b0576120b0615790565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a2505050806001019050612093565b600061224782600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a390612354908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b604080518082019091526000808252602082015260008390036123a157506040805180820190915267ffffffffffffffff8216815260006020820152610b8d565b60006123ad848661599d565b905060006123be85600481896159e3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f0000000000000000000000000000000000000000000000000000000000161245b57808060200190518101906124529190615a0d565b92505050610b8d565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016124d7576040518060400160405280828060200190518101906124c39190615a39565b815260006020909101529250610b8d915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808616600090815260096020526040902060010154606091750100000000000000000000000000000000000000000090910460e01b90859081111561255957612559614531565b60405190808252806020026020018201604052801561258c57816020015b60608152602001906001900390816125775790505b50915060005b8581101561286f5760008585838181106125ae576125ae615790565b6125c4926020604090920201908101915061440a565b905060008888848181106125da576125da615790565b90506020028101906125ec9190615a52565b6125fa906040810190615925565b91505060208111156126aa5767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff168111156126aa576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610fda565b61271a848a8a868181106126c0576126c0615790565b90506020028101906126d29190615a52565b6126e0906020810190615925565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061405c92505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b0100000000000000000000000000000000000000000000000000000090049091169190612819578161281f565b82606001515b6040805163ffffffff831660208201529192500160405160208183030381529060405288878151811061285457612854615790565b60200260200101819052505050505050806001019050612592565b505095945050505050565b60005b8151811015610eac57600082828151811061289a5761289a615790565b6020026020010151905060008383815181106128b8576128b8615790565b60200260200101516000015190506000826020015190508167ffffffffffffffff16600014806128f1575061016081015163ffffffff16155b8061294357506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806129625750806060015163ffffffff1681610160015163ffffffff16115b156129a5576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610fda565b67ffffffffffffffff82166000908152600960205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff00000000000000000000000000000000000000000000000000000000169003612a4d578167ffffffffffffffff167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626582604051612a409190614ec0565b60405180910390a2612a90565b8167ffffffffffffffff167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051612a879190614ec0565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c021790555090505050505080600101905061287d565b60005b8251811015613075576000838281518110612d6c57612d6c615790565b6020026020010151905060008160000151905060005b82602001515181101561306757600083602001518281518110612da757612da7615790565b6020026020010151602001519050600084602001518381518110612dcd57612dcd615790565b6020026020010151600001519050602063ffffffff16826080015163ffffffff161015612e505760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610fda565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b590613055908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101612d82565b505050806001019050612d4f565b5060005b815181101561315957600082828151811061309657613096615790565b602002602001015160000151905060008383815181106130b8576130b8615790565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101613079565b505050565b60005b82518110156132015761319783828151811061317f5761317f615790565b6020026020010151600b6140ae90919063ffffffff16565b156131f9578281815181106131ae576131ae615790565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101613161565b5060005b81518110156131595761323b82828151811061322357613223615790565b6020026020010151600b6140d090919063ffffffff16565b1561329d5781818151811061325257613252615790565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101613205565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff16613411576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610fda565b5050505050565b6000806134258486615a90565b9050600060248260ff16111561345f57613443602460ff8416615912565b61344e90600a615bc9565b61345890856156ed565b9050613485565b61346d60ff83166024615912565b61347890600a615bc9565b61348290856156d6565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156134db576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b602081015160005b815181101561357f57600082828151811061350957613509615790565b602002602001015190506135278160026140f290919063ffffffff16565b156135765760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b506001016134ec565b50815160005b8151811015610e545760008282815181106135a2576135a2615790565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613612576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61361d6002826140ae565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101613585565b60005b8151811015610eac57600082828151811061369057613690615790565b602002602001015160000151905060008383815181106136b2576136b2615790565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a25050600101613673565b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156137c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e89190615bef565b5050509150506000811215613829576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138a88373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389d9190615c3f565b866020015184613418565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff4216602082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b8d565b836040015163ffffffff168311156139715760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610fda565b836020015161ffff168211156139b3576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e548461020001518261405c565b67ffffffffffffffff821660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116825263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169282019290925290831615613aba576000816020015163ffffffff1642613a579190615912565b90508363ffffffff16811115613ab8576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff8516602482015260448101829052606401610fda565b505b519392505050565b6000808083815b81811015613d8c576000878783818110613ae557613ae5615790565b905060400201803603810190613afb9190615c5c565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613c1b576101208d0151613be89061ffff16662386f26fc100006156d6565b613bf2908861598a565b96508c610140015186613c059190615c95565b9550613c12602086615c95565b94505050613d84565b604081015160009061ffff1615613cd45760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613c77578351613c7090611f23565b9050613c7a565b508a5b620186a0836040015161ffff16613cbc8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661411490919063ffffffff16565b613cc691906156d6565b613cd091906156ed565b9150505b6060820151613ce39088615c95565b9650816080015186613cf59190615c95565b8251909650600090613d149063ffffffff16662386f26fc100006156d6565b905080821015613d3357613d28818a61598a565b985050505050613d84565b6000836020015163ffffffff16662386f26fc10000613d5291906156d6565b905080831115613d7257613d66818b61598a565b99505050505050613d84565b613d7c838b61598a565b995050505050505b600101613ac9565b505096509650969350505050565b60008063ffffffff8316613db0610120866156d6565b613dbc876101c061598a565b613dc6919061598a565b613dd0919061598a565b905060008760c0015163ffffffff168860e0015161ffff1683613df391906156d6565b613dfd919061598a565b61010089015190915061ffff16613e246dffffffffffffffffffffffffffff8916836156d6565b613e2e91906156d6565b613e3e90655af3107a40006156d6565b98975050505050505050565b60408051808201909152600080825260208201526000613e76858585610160015163ffffffff16612360565b9050826060015163ffffffff1681600001511115613ec0576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015613ed457508060200151155b15610b8a576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613f8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610fda565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60608160000180548060200260200160405190810160405280929190818152602001828054801561405057602002820191906000526020600020905b81548152602001906001019080831161403c575b50505050509050919050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610eac5761315981614151565b6000610b8d8373ffffffffffffffffffffffffffffffffffffffff8416614204565b6000610b8d8373ffffffffffffffffffffffffffffffffffffffff8416614253565b6000610b8d8373ffffffffffffffffffffffffffffffffffffffff841661434d565b6000670de0b6b3a7640000614147837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166156d6565b610b8d91906156ed565b6000815160201461419057816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610fda9190614489565b6000828060200190518101906141a69190615a39565b905073ffffffffffffffffffffffffffffffffffffffff8111806141cb575061040081105b1561118557826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610fda9190614489565b600081815260018301602052604081205461424b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611185565b506000611185565b6000818152600183016020526040812054801561433c576000614277600183615912565b855490915060009061428b90600190615912565b90508082146142f05760008660000182815481106142ab576142ab615790565b90600052602060002001549050808760000184815481106142ce576142ce615790565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061430157614301615cb2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611185565b6000915050611185565b5092915050565b6000818152600183016020526040812054801561433c576000614371600183615912565b855490915060009061438590600190615912565b90508181146142f05760008660000182815481106142ab576142ab615790565b803573ffffffffffffffffffffffffffffffffffffffff811681146143c957600080fd5b919050565b6000806000606084860312156143e357600080fd5b6143ec846143a5565b925060208401359150614401604085016143a5565b90509250925092565b60006020828403121561441c57600080fd5b610b8d826143a5565b6000815180845260005b8181101561444b5760208185018101518683018201520161442f565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b8d6020830184614425565b6020808252825182820181905260009190848201906040850190845b818110156144ea57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016144b8565b50909695505050505050565b60006020828403121561450857600080fd5b813567ffffffffffffffff81111561451f57600080fd5b820160408185031215610b8d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561458357614583614531565b60405290565b60405160a0810167ffffffffffffffff8111828210171561458357614583614531565b604051610220810167ffffffffffffffff8111828210171561458357614583614531565b60405160c0810167ffffffffffffffff8111828210171561458357614583614531565b6040516060810167ffffffffffffffff8111828210171561458357614583614531565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561465d5761465d614531565b604052919050565b600067ffffffffffffffff82111561467f5761467f614531565b5060051b60200190565b60ff81168114610e6b57600080fd5b600060208083850312156146ab57600080fd5b823567ffffffffffffffff8111156146c257600080fd5b8301601f810185136146d357600080fd5b80356146e66146e182614665565b614616565b8181526060918202830184019184820191908884111561470557600080fd5b938501935b838510156147a557848903818112156147235760008081fd5b61472b614560565b614734876143a5565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156147685760008081fd5b614770614560565b925061477d8989016143a5565b835287013561478b81614689565b82890152808801919091528352938401939185019161470a565b50979650505050505050565b8015158114610e6b57600080fd5b80356143c9816147b1565b600060208083850312156147dd57600080fd5b823567ffffffffffffffff8111156147f457600080fd5b8301601f8101851361480557600080fd5b80356148136146e182614665565b81815260a0918202830184019184820191908884111561483257600080fd5b938501935b838510156147a55780858a03121561484f5760008081fd5b614857614589565b614860866143a5565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146148955760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146148ce5760008081fd5b9082015260606148df8782016143a5565b908201526080868101356148f2816147b1565b9082015283529384019391850191614837565b803567ffffffffffffffff811681146143c957600080fd5b60008083601f84011261492f57600080fd5b50813567ffffffffffffffff81111561494757600080fd5b602083019150836020828501011115611f1c57600080fd5b60008083601f84011261497157600080fd5b50813567ffffffffffffffff81111561498957600080fd5b6020830191508360208260051b8501011115611f1c57600080fd5b600080600080600080600080600060c08a8c0312156149c257600080fd5b6149cb8a614905565b98506149d960208b016143a5565b975060408a0135965060608a013567ffffffffffffffff808211156149fd57600080fd5b614a098d838e0161491d565b909850965060808c0135915080821115614a2257600080fd5b614a2e8d838e0161495f565b909650945060a08c0135915080821115614a4757600080fd5b818c0191508c601f830112614a5b57600080fd5b813581811115614a6a57600080fd5b8d60208260061b8501011115614a7f57600080fd5b6020830194508093505050509295985092959850929598565b848152600060208515158184015260806040840152614aba6080840186614425565b8381036060850152845180825282820190600581901b8301840184880160005b83811015614b26577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552614b14838351614425565b94870194925090860190600101614ada565b50909b9a5050505050505050505050565b60008060208385031215614b4a57600080fd5b823567ffffffffffffffff811115614b6157600080fd5b614b6d8582860161495f565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614be757614bd784835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101614b96565b5091979650505050505050565b600060208284031215614c0657600080fd5b610b8d82614905565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff169082015260408101611185565b803561ffff811681146143c957600080fd5b803563ffffffff811681146143c957600080fd5b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146143c957600080fd5b60006020808385031215614cb357600080fd5b823567ffffffffffffffff811115614cca57600080fd5b8301601f81018513614cdb57600080fd5b8035614ce96146e182614665565b8181526102409182028301840191848201919088841115614d0957600080fd5b938501935b838510156147a55784890381811215614d275760008081fd5b614d2f614560565b614d3887614905565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215614d6d5760008081fd5b614d756145ac565b9250614d828989016147bf565b83526040614d91818a01614c4a565b8a8501526060614da2818b01614c5c565b8286015260809150614db5828b01614c5c565b9085015260a0614dc68a8201614c5c565b8286015260c09150614dd9828b01614c4a565b9085015260e0614dea8a8201614c5c565b828601526101009150614dfe828b01614c4a565b90850152610120614e108a8201614c4a565b828601526101409150614e24828b01614c4a565b90850152610160614e368a8201614c5c565b828601526101809150614e4a828b01614c5c565b908501526101a0614e5c8a8201614905565b828601526101c09150614e70828b01614c5c565b908501526101e0614e828a8201614c5c565b828601526102009150614e96828b016147bf565b90850152614ea5898301614c70565b90840152508088019190915283529384019391850191614d0e565b81511515815261022081016020830151614ee0602084018261ffff169052565b506040830151614ef8604084018263ffffffff169052565b506060830151614f10606084018263ffffffff169052565b506080830151614f28608084018263ffffffff169052565b5060a0830151614f3e60a084018261ffff169052565b5060c0830151614f5660c084018263ffffffff169052565b5060e0830151614f6c60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b600082601f83011261503757600080fd5b813560206150476146e183614665565b82815260069290921b8401810191818101908684111561506657600080fd5b8286015b848110156150b357604081890312156150835760008081fd5b61508b614560565b61509482614905565b81526150a18583016143a5565b8186015283529183019160400161506a565b509695505050505050565b600080604083850312156150d157600080fd5b67ffffffffffffffff833511156150e757600080fd5b83601f8435850101126150f957600080fd5b6151096146e18435850135614665565b8335840180358083526020808401939260059290921b9091010186101561512f57600080fd5b602085358601015b85358601803560051b0160200181101561533c5767ffffffffffffffff8135111561516157600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a0301121561519a57600080fd5b6151a2614560565b6151ae60208301614905565b815267ffffffffffffffff604083013511156151c957600080fd5b88603f6040840135840101126151de57600080fd5b6151f46146e16020604085013585010135614665565b6020604084810135850182810135808552928401939260e00201018b101561521b57600080fd5b6040808501358501015b6040858101358601602081013560e002010181101561531d5760e0818d03121561524e57600080fd5b615256614560565b61525f826143a5565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f0301121561529357600080fd5b61529b6145d0565b6152a760208401614c5c565b81526152b560408401614c5c565b60208201526152c660608401614c4a565b60408201526152d760808401614c5c565b60608201526152e860a08401614c5c565b60808201526152fa60c08401356147b1565b60c083013560a0820152602082810191909152908452929092019160e001615225565b5080602084015250508085525050602083019250602081019050615137565b5092505067ffffffffffffffff6020840135111561535957600080fd5b6153698460208501358501615026565b90509250929050565b600082601f83011261538357600080fd5b813560206153936146e183614665565b8083825260208201915060208460051b8701019350868411156153b557600080fd5b602086015b848110156150b3576153cb816143a5565b83529183019183016153ba565b600080604083850312156153eb57600080fd5b823567ffffffffffffffff8082111561540357600080fd5b61540f86838701615372565b9350602085013591508082111561542557600080fd5b5061543285828601615372565b9150509250929050565b6000806000806040858703121561545257600080fd5b843567ffffffffffffffff8082111561546a57600080fd5b6154768883890161491d565b9096509450602087013591508082111561548f57600080fd5b5061549c8782880161491d565b95989497509550505050565b600080604083850312156154bb57600080fd5b6154c483614905565b9150615369602084016143a5565b6000602082840312156154e457600080fd5b813567ffffffffffffffff808211156154fc57600080fd5b908301906040828603121561551057600080fd5b615518614560565b82358281111561552757600080fd5b61553387828601615372565b82525060208301358281111561554857600080fd5b61555487828601615372565b60208301525095945050505050565b6000602080838503121561557657600080fd5b823567ffffffffffffffff81111561558d57600080fd5b8301601f8101851361559e57600080fd5b80356155ac6146e182614665565b81815260069190911b820183019083810190878311156155cb57600080fd5b928401925b8284101561561d57604084890312156155e95760008081fd5b6155f1614560565b6155fa856143a5565b8152615607868601614905565b81870152825260409390930192908401906155d0565b979650505050505050565b6000806040838503121561563b57600080fd5b61564483614905565b9150602083013567ffffffffffffffff81111561566057600080fd5b830160a0818603121561567257600080fd5b809150509250929050565b6000806040838503121561569057600080fd5b615699836143a5565b915061536960208401614905565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417611185576111856156a7565b600082615723577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261575d57600080fd5b83018035915067ffffffffffffffff82111561577857600080fd5b6020019150600681901b3603821315611f1c57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146143c957600080fd5b6000604082840312156157fd57600080fd5b615805614560565b61580e836143a5565b815261581c602084016157bf565b60208201529392505050565b60006040828403121561583a57600080fd5b615842614560565b61580e83614905565b6000602080838503121561585e57600080fd5b823567ffffffffffffffff81111561587557600080fd5b8301601f8101851361588657600080fd5b80356158946146e182614665565b818152606091820283018401918482019190888411156158b357600080fd5b938501935b838510156147a55780858a0312156158d05760008081fd5b6158d86145f3565b6158e1866143a5565b81526158ee8787016157bf565b8782015260406158ff818801614c5c565b90820152835293840193918501916158b8565b81810381811115611185576111856156a7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261595a57600080fd5b83018035915067ffffffffffffffff82111561597557600080fd5b602001915036819003821315611f1c57600080fd5b80820180821115611185576111856156a7565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101561501e5760049490940360031b84901b1690921692915050565b600080858511156159f357600080fd5b83861115615a0057600080fd5b5050820193919092039150565b600060408284031215615a1f57600080fd5b615a27614560565b82518152602083015161581c816147b1565b600060208284031215615a4b57600080fd5b5051919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112615a8657600080fd5b9190910192915050565b60ff8181168382160190811115611185576111856156a7565b600181815b80851115615b0257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615ae857615ae86156a7565b80851615615af557918102915b93841c9390800290615aae565b509250929050565b600082615b1957506001611185565b81615b2657506000611185565b8160018114615b3c5760028114615b4657615b62565b6001915050611185565b60ff841115615b5757615b576156a7565b50506001821b611185565b5060208310610133831016604e8410600b8410161715615b85575081810a611185565b615b8f8383615aa9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615bc157615bc16156a7565b029392505050565b6000610b8d8383615b0a565b805169ffffffffffffffffffff811681146143c957600080fd5b600080600080600060a08688031215615c0757600080fd5b615c1086615bd5565b9450602086015193506040860151925060608601519150615c3360808701615bd5565b90509295509295909350565b600060208284031215615c5157600080fd5b8151610b8d81614689565b600060408284031215615c6e57600080fd5b615c76614560565b615c7f836143a5565b8152602083013560208201528091505092915050565b63ffffffff818116838216019080821115614346576143466156a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var FeeQuoterABI = FeeQuoterMetaData.ABI
@@ -2851,11 +2852,11 @@ func (FeeQuoterAuthorizedCallerRemoved) Topic() common.Hash {
}
func (FeeQuoterDestChainAdded) Topic() common.Hash {
- return common.HexToHash("0xd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb724")
+ return common.HexToHash("0x525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda46265")
}
func (FeeQuoterDestChainConfigUpdated) Topic() common.Hash {
- return common.HexToHash("0x1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab20")
+ return common.HexToHash("0x283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a835")
}
func (FeeQuoterFeeTokenAdded) Topic() common.Hash {
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 d17e3a5e0e..ed9f855b6f 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
@@ -13,7 +13,7 @@ commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitSto
ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin b0d77babbe635cd6ba04c2af049badc9e9d28a4b6ed6bb75f830ad902a618beb
evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 5c02c2b167946b3467636ff2bb58594cb4652fc63d8bdfee2488ed562e2a3e50
-fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 6806f01f305df73a923361f128b8962e9a8d3e7338a9a5b5fbe0636e6c9fc35f
+fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 503823a939ff99fe3bdaaef7a89cd4bbe475e260d3921335dbf9c80d4f584b76
lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin e6a8ec9e8faccb1da7d90e0f702ed72975964f97dc3222b54cfcca0a0ba3fea2
lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin e632b08be0fbd1d013e8b3a9d75293d0d532b83071c531ff2be1deec1fa48ec1
maybe_revert_message_receiver: ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin d73956c26232ebcc4a5444429fa99cbefed960e323be9b5a24925885c2e477d5
From 918ccf656b2663ab5f8f7a4fb039605adb542add Mon Sep 17 00:00:00 2001
From: Chunkai Yang
Date: Fri, 11 Oct 2024 17:00:25 -0400
Subject: [PATCH 31/32] use chain Id as opposed to chain type to identify
Mantle (#1489) (#1494)
## Motivation
Mantle chaintype is no longer used by the BIX team, Mantle's chaintype
has been changed to optimism in chain toml
## Solution
In order to match for Mantle and apply custom gas price interceptor, we
can check for evm ChainId.
Not going for a more generic solution given OCR2 plugins will be sunset
soon, and Mantle should be the only chain that requires such custom
logic before that.
This is already included in 1.5.4 release and verified to work.
Back-porting here to dev branch.
---
core/services/relay/evm/evm.go | 26 +++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/core/services/relay/evm/evm.go b/core/services/relay/evm/evm.go
index ae5244f5f0..f2143ceded 100644
--- a/core/services/relay/evm/evm.go
+++ b/core/services/relay/evm/evm.go
@@ -12,7 +12,7 @@ import (
"sync"
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/chaintype"
+
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig/interceptors/mantle"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip"
@@ -413,12 +413,14 @@ func (r *Relayer) NewCCIPCommitProvider(rargs commontypes.RelayArgs, pargs commo
// CCIPCommit reads only when source chain is Mantle, then reports to dest chain
// to minimize misconfigure risk, might make sense to wire Mantle only when Commit + Mantle + IsSourceProvider
- if r.chain.Config().EVM().ChainType() == chaintype.ChainMantle && commitPluginConfig.IsSourceProvider {
- mantleInterceptor, iErr := mantle.NewInterceptor(ctx, r.chain.Client())
- if iErr != nil {
- return nil, iErr
+ if r.chain.Config().EVM().ChainID().Uint64() == 5003 || r.chain.Config().EVM().ChainID().Uint64() == 5000 {
+ if commitPluginConfig.IsSourceProvider {
+ mantleInterceptor, iErr := mantle.NewInterceptor(ctx, r.chain.Client())
+ if iErr != nil {
+ return nil, iErr
+ }
+ feeEstimatorConfig.AddGasPriceInterceptor(mantleInterceptor)
}
- feeEstimatorConfig.AddGasPriceInterceptor(mantleInterceptor)
}
// The src chain implementation of this provider does not need a configWatcher or contractTransmitter;
@@ -494,12 +496,14 @@ func (r *Relayer) NewCCIPExecProvider(rargs commontypes.RelayArgs, pargs commont
// CCIPExec reads when dest chain is mantle, and uses it to calc boosting in batching
// to minimize misconfigure risk, make sense to wire Mantle only when Exec + Mantle + !IsSourceProvider
- if r.chain.Config().EVM().ChainType() == chaintype.ChainMantle && !execPluginConfig.IsSourceProvider {
- mantleInterceptor, iErr := mantle.NewInterceptor(ctx, r.chain.Client())
- if iErr != nil {
- return nil, iErr
+ if r.chain.Config().EVM().ChainID().Uint64() == 5003 || r.chain.Config().EVM().ChainID().Uint64() == 5000 {
+ if !execPluginConfig.IsSourceProvider {
+ mantleInterceptor, iErr := mantle.NewInterceptor(ctx, r.chain.Client())
+ if iErr != nil {
+ return nil, iErr
+ }
+ feeEstimatorConfig.AddGasPriceInterceptor(mantleInterceptor)
}
- feeEstimatorConfig.AddGasPriceInterceptor(mantleInterceptor)
}
// The src chain implementation of this provider does not need a configWatcher or contractTransmitter;
From 4377d9ab5cfd40622a1d2f21ca5527f76d5daabb Mon Sep 17 00:00:00 2001
From: Simson
Date: Tue, 15 Oct 2024 19:25:19 +0530
Subject: [PATCH 32/32] updated chain-selectors to 1.0.27 (#1500)
## Motivation
## Solution
---
core/scripts/ccip/manual-execution/go.mod | 2 +-
core/scripts/ccip/manual-execution/go.sum | 4 ++--
core/scripts/go.mod | 2 +-
core/scripts/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
integration-tests/go.mod | 2 +-
integration-tests/go.sum | 4 ++--
integration-tests/load/go.mod | 2 +-
integration-tests/load/go.sum | 4 ++--
10 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/core/scripts/ccip/manual-execution/go.mod b/core/scripts/ccip/manual-execution/go.mod
index c01e615d6d..f91c21b02e 100644
--- a/core/scripts/ccip/manual-execution/go.mod
+++ b/core/scripts/ccip/manual-execution/go.mod
@@ -5,7 +5,7 @@ go 1.20
require (
github.com/ethereum/go-ethereum v1.11.3
github.com/pkg/errors v0.9.1
- github.com/smartcontractkit/chain-selectors v1.0.23
+ github.com/smartcontractkit/chain-selectors v1.0.27
go.uber.org/multierr v1.1.0
golang.org/x/crypto v0.1.0
)
diff --git a/core/scripts/ccip/manual-execution/go.sum b/core/scripts/ccip/manual-execution/go.sum
index a5bf3ee297..1e38a8a5e0 100644
--- a/core/scripts/ccip/manual-execution/go.sum
+++ b/core/scripts/ccip/manual-execution/go.sum
@@ -70,8 +70,8 @@ github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
-github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnjjIQAEBnutCtksPzVDY=
-github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.27 h1:VE/ftX9Aae4gnw67yR1raKi+30iWKL/sWq8uyiLHM8k=
+github.com/smartcontractkit/chain-selectors v1.0.27/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index df7d7fde31..3574bae837 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -22,7 +22,7 @@ require (
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.17.0
github.com/shopspring/decimal v1.4.0
- github.com/smartcontractkit/chain-selectors v1.0.25
+ github.com/smartcontractkit/chain-selectors v1.0.27
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index 26ccbfab3f..2b01d2bcd8 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -1070,8 +1070,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/chain-selectors v1.0.25 h1:TrcpbCsDRJ1322ukdi64KBou4aabPnQ1OYfQMFMrjcg=
-github.com/smartcontractkit/chain-selectors v1.0.25/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.27 h1:VE/ftX9Aae4gnw67yR1raKi+30iWKL/sWq8uyiLHM8k=
+github.com/smartcontractkit/chain-selectors v1.0.27/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/go.mod b/go.mod
index df03af7cb7..35494138c0 100644
--- a/go.mod
+++ b/go.mod
@@ -73,7 +73,7 @@ require (
github.com/scylladb/go-reflectx v1.0.1
github.com/shirou/gopsutil/v3 v3.24.3
github.com/shopspring/decimal v1.4.0
- github.com/smartcontractkit/chain-selectors v1.0.25
+ github.com/smartcontractkit/chain-selectors v1.0.27
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45
diff --git a/go.sum b/go.sum
index 9d88d403e3..05fa904055 100644
--- a/go.sum
+++ b/go.sum
@@ -1026,8 +1026,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/chain-selectors v1.0.25 h1:TrcpbCsDRJ1322ukdi64KBou4aabPnQ1OYfQMFMrjcg=
-github.com/smartcontractkit/chain-selectors v1.0.25/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.27 h1:VE/ftX9Aae4gnw67yR1raKi+30iWKL/sWq8uyiLHM8k=
+github.com/smartcontractkit/chain-selectors v1.0.27/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index 75e4addf96..cf4b5ce8aa 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -32,7 +32,7 @@ require (
github.com/segmentio/ksuid v1.0.4
github.com/shopspring/decimal v1.4.0
github.com/slack-go/slack v0.12.2
- github.com/smartcontractkit/chain-selectors v1.0.25
+ github.com/smartcontractkit/chain-selectors v1.0.27
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.0
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index 20823777cc..e4013c5803 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -1413,8 +1413,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/chain-selectors v1.0.25 h1:TrcpbCsDRJ1322ukdi64KBou4aabPnQ1OYfQMFMrjcg=
-github.com/smartcontractkit/chain-selectors v1.0.25/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.27 h1:VE/ftX9Aae4gnw67yR1raKi+30iWKL/sWq8uyiLHM8k=
+github.com/smartcontractkit/chain-selectors v1.0.27/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod
index 49db91a0dd..8b04590c4d 100644
--- a/integration-tests/load/go.mod
+++ b/integration-tests/load/go.mod
@@ -393,7 +393,7 @@ require (
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
- github.com/smartcontractkit/chain-selectors v1.0.25 // indirect
+ github.com/smartcontractkit/chain-selectors v1.0.27 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827 // indirect
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6e // indirect
diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum
index ee0a427069..4135a49d67 100644
--- a/integration-tests/load/go.sum
+++ b/integration-tests/load/go.sum
@@ -1385,8 +1385,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/chain-selectors v1.0.25 h1:TrcpbCsDRJ1322ukdi64KBou4aabPnQ1OYfQMFMrjcg=
-github.com/smartcontractkit/chain-selectors v1.0.25/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.27 h1:VE/ftX9Aae4gnw67yR1raKi+30iWKL/sWq8uyiLHM8k=
+github.com/smartcontractkit/chain-selectors v1.0.27/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=