From 31f917d37d740be8017d701a7ba1ee04e5ce1b46 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 29 May 2024 12:04:42 -0400 Subject: [PATCH 01/31] initial scaffolding for new implementations --- .../ccip/production-examples/CCIPClient.sol | 123 ++++++++++++++++ .../production-examples/CCIPClientBase.sol | 47 ++++++ .../ccip/production-examples/CCIPReceiver.sol | 99 +++++++++++++ .../production-examples/CCIPReceiverBasic.sol | 37 +++++ .../ccip/production-examples/CCIPSender.sol | 134 ++++++++++++++++++ 5 files changed, 440 insertions(+) create mode 100644 contracts/src/v0.8/ccip/production-examples/CCIPClient.sol create mode 100644 contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol create mode 100644 contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol create mode 100644 contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol create mode 100644 contracts/src/v0.8/ccip/production-examples/CCIPSender.sol diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol new file mode 100644 index 0000000000..f228bc1728 --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol @@ -0,0 +1,123 @@ +pragma solidity ^0.8.0; + +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 {CCIPReceiver} from "./CCIPReceiver.sol"; +import {CCIPSender} from "./CCIPSender.sol"; + +import {IRouterClient} from "../interfaces/IRouterClient.sol"; +import {Client} from "../libraries/Client.sol"; +import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; + +contract CCIPClient is CCIPReceiver { + using SafeERC20 for IERC20; + + error InvalidConfig(); + + event MessageSent(bytes32 messageId); + event MessageReceived(bytes32 messageId); + + // Current feeToken + IERC20 public s_feeToken; + + /// @notice You can't import CCIPReceiver and Sender due to similar parents so functionality of CCIPSender is duplicated here + constructor(address router, IERC20 feeToken) CCIPReceiver(router) { + s_feeToken = feeToken; + s_feeToken.approve(address(router), type(uint256).max); + } + + /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native asset. + function sendDataPayNative( + uint64 destChainSelector, + bytes memory receiver, + bytes memory data + ) external validChain(destChainSelector) { + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: receiver, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chains[destChainSelector], + feeToken: address(0) // We leave the feeToken empty indicating we'll pay raw native. + }); + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ + value: IRouterClient(i_ccipRouter).getFee(destChainSelector, message) + }(destChainSelector, message); + emit MessageSent(messageId); + } + + /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient feeToken. + function sendDataPayFeeToken( + uint64 destChainSelector, + bytes memory receiver, + bytes memory data + ) external validChain(destChainSelector) { + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: receiver, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chains[destChainSelector], + feeToken: address(s_feeToken) + }); + // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); + // Can decide if fee is acceptable. + // address(this) must have sufficient feeToken or the send will revert. + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); + emit MessageSent(messageId); + } + + /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native token. + function sendDataAndTokens( + uint64 destChainSelector, + bytes memory receiver, + bytes memory data, + Client.EVMTokenAmount[] memory tokenAmounts + ) external validChain(destChainSelector) { + for (uint256 i = 0; i < tokenAmounts.length; ++i) { + IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); + } + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: receiver, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chains[destChainSelector], + feeToken: address(s_feeToken) + }); + // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); + // Can decide if fee is acceptable. + // address(this) must have sufficient feeToken or the send will revert. + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); + emit MessageSent(messageId); + } + + // @notice user sends tokens to a receiver + // Approvals can be optimized with a whitelist of tokens and inf approvals if desired. + function sendTokens( + uint64 destChainSelector, + bytes memory receiver, + Client.EVMTokenAmount[] memory tokenAmounts + ) external validChain(destChainSelector) { + for (uint256 i = 0; i < tokenAmounts.length; ++i) { + IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); + } + bytes memory data; + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: receiver, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chains[destChainSelector], + feeToken: address(s_feeToken) + }); + // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); + // Can decide if fee is acceptable. + // address(this) must have sufficient feeToken or the send will revert. + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); + emit MessageSent(messageId); + } + + +} diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol new file mode 100644 index 0000000000..e3bb1762b0 --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol @@ -0,0 +1,47 @@ +pragma solidity ^0.8.0; + +import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; + +contract CCIPClientBase is OwnerIsCreator { + error InvalidRouter(address router); + error InvalidChain(uint64 chainSelector); + + address internal immutable i_ccipRouter; + mapping(uint64 destChainSelector => bytes extraArgsBytes) public s_chains; + + constructor(address router) { + if (router == address(0)) revert InvalidRouter(address(0)); + i_ccipRouter = router; + } + + ///////////////////////////////////////////////////////////////////// + // Router Management + ///////////////////////////////////////////////////////////////////// + + function getRouter() public view returns (address) { + return i_ccipRouter; + } + + /// @dev only calls from the set router are accepted. + modifier onlyRouter() { + if (msg.sender != getRouter()) revert InvalidRouter(msg.sender); + _; + } + + ///////////////////////////////////////////////////////////////////// + // Chain Management + ///////////////////////////////////////////////////////////////////// + + function enableChain(uint64 chainSelector, bytes memory extraArgs) external onlyOwner { + s_chains[chainSelector] = extraArgs; + } + + function disableChain(uint64 chainSelector) external onlyOwner { + delete s_chains[chainSelector]; + } + + modifier validChain(uint64 chainSelector) { + if (s_chains[chainSelector].length == 0) revert InvalidChain(chainSelector); + _; + } +} diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol new file mode 100644 index 0000000000..57d654ebc1 --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IRouterClient} from "../interfaces/IRouterClient.sol"; + +import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; +import {Client} from "../libraries/Client.sol"; +import {CCIPClientBase} from "./CCIPClientBase.sol"; + +import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; + +contract CCIPReceiver is CCIPClientBase { + using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + + error OnlySelf(); + error ErrorCase(); + error MessageNotFailed(bytes32 messageId); + + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageSucceeded(bytes32 indexed messageId); + event MessageRecovered(bytes32 indexed messageId); + + // Example error code, could have many different error codes. + enum ErrorCode { + // RESOLVED is first so that the default value is resolved. + RESOLVED, + // Could have any number of error codes here. + BASIC + } + + // The message contents of failed messages are stored here. + mapping(bytes32 messageId => Client.Any2EVMMessage contents) public s_messageContents; + + // Contains failed messages and their state. + EnumerableMap.Bytes32ToUintMap internal s_failedMessages; + + constructor(address router) CCIPClientBase(router) {} + + /// @notice The entrypoint for the CCIP router to call. This function should + /// never revert, all errors should be handled internally in this contract. + /// @param message The message to process. + /// @dev Extremely important to ensure only router calls this. + function ccipReceive(Client.Any2EVMMessage calldata message) + external + onlyRouter + validChain(message.sourceChainSelector) + { + try this.processMessage(message) {} + catch (bytes memory err) { + // Could set different error codes based on the caught error. Each could be + // handled differently. + s_failedMessages.set(message.messageId, uint256(ErrorCode.BASIC)); + s_messageContents[message.messageId] = message; + // Don't revert so CCIP doesn't revert. Emit event instead. + // The message can be retried later without having to do manual execution of CCIP. + emit MessageFailed(message.messageId, err); + return; + } + emit MessageSucceeded(message.messageId); + } + + /// @notice This function the entrypoint for this contract to process messages. + /// @param message The message to process. + /// @dev This example just sends the tokens to the owner of this contracts. More + /// interesting functions could be implemented. + /// @dev It has to be external because of the try/catch. + function processMessage(Client.Any2EVMMessage calldata message) external onlySelf validChain(message.sourceChainSelector) { + // Insert Custom logic here + } + + /// @notice This function is callable by the owner when a message has failed + /// to unblock the tokens that are associated with that message. + /// @dev This function is only callable by the owner. + function retryFailedMessage(bytes32 messageId) external onlyOwner { + if (s_failedMessages.get(messageId) != uint256(ErrorCode.BASIC)) revert MessageNotFailed(messageId); + + // Set the error code to 0 to disallow reentry and retry the same failed message + // multiple times. + s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); + + // Do stuff to retry message, potentially just releasing the associated tokens + Client.Any2EVMMessage memory message = s_messageContents[messageId]; + + try this.processMessage(message) {} + catch (bytes memory err) { + emit MessageFailed(message.messageId, err); + return; + } + + s_failedMessages.remove(messageId); // If retry succeeds, remove from set of failed messages. + + emit MessageRecovered(messageId); + } + + modifier onlySelf { + if (msg.sender != address(this)) revert OnlySelf(); + _; + } +} diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol new file mode 100644 index 0000000000..3d6ac3533e --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol"; +import {CCIPClientBase} from "./CCIPClientBase.sol"; + +import {Client} from "../libraries/Client.sol"; + +import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; + +/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. +abstract contract CCIPReceiverBasic is CCIPClientBase, IAny2EVMMessageReceiver, IERC165 { + constructor(address router) CCIPClientBase(router) {} + + /// @notice IERC165 supports an interfaceId + /// @param interfaceId The interfaceId to check + /// @return true if the interfaceId is supported + /// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver + /// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId + /// This allows CCIP to check if ccipReceive is available before calling it. + /// If this returns false or reverts, only tokens are transferred to the receiver. + /// If this returns true, tokens are transferred and ccipReceive is called atomically. + /// Additionally, if the receiver address does not have code associated with + /// it at the time of execution (EXTCODESIZE returns 0), only tokens will be transferred. + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; + } + + /// @inheritdoc IAny2EVMMessageReceiver + function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter { + _ccipReceive(message); + } + + /// @notice Override this function in your implementation. + /// @param message Any2EVMMessage + function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual; +} diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol new file mode 100644 index 0000000000..c852558d1a --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IRouterClient} from "../interfaces/IRouterClient.sol"; + +import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; + +import {Client} from "../libraries/Client.sol"; +import {CCIPClientBase} from "./CCIPClientBase.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"; + +// @notice Example of a client which supports EVM/non-EVM chains +// @dev If chain specific logic is required for different chain families (e.g. particular +// decoding the bytes sender for authorization checks), it may be required to point to a helper +// authorization contract unless all chain families are known up front. +// @dev If contract does not implement IAny2EVMMessageReceiver and IERC165, +// and tokens are sent to it, ccipReceive will not be called but tokens will be transferred. +// @dev If the client is upgradeable you have significantly more flexibility and +// can avoid storage based options like the below contract uses. However it's +// worth carefully considering how the trust assumptions of your client dapp will +// change if you introduce upgradeability. An immutable dapp building on top of CCIP +// like the example below will inherit the trust properties of CCIP (i.e. the oracle network). +// @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting +// new chain family receivers (e.g. a solana encoded receiver address) without upgrading. +contract CCIPSender is CCIPClientBase { + using SafeERC20 for IERC20; + + error InvalidConfig(); + + event MessageSent(bytes32 messageId); + event MessageReceived(bytes32 messageId); + + // Current feeToken + IERC20 public s_feeToken; + + constructor(address router, IERC20 feeToken) CCIPClientBase(router) { + s_feeToken = feeToken; + s_feeToken.safeApprove(address(router), type(uint256).max); + } + + /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native asset. + function sendDataPayNative( + uint64 destChainSelector, + bytes memory receiver, + bytes memory data + ) external validChain(destChainSelector) { + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: receiver, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chains[destChainSelector], + feeToken: address(0) // We leave the feeToken empty indicating we'll pay raw native. + }); + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ + value: IRouterClient(i_ccipRouter).getFee(destChainSelector, message) + }(destChainSelector, message); + emit MessageSent(messageId); + } + + /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient feeToken. + function sendDataPayFeeToken( + uint64 destChainSelector, + bytes memory receiver, + bytes memory data + ) external validChain(destChainSelector) { + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: receiver, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chains[destChainSelector], + feeToken: address(s_feeToken) + }); + // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); + // Can decide if fee is acceptable. + // address(this) must have sufficient feeToken or the send will revert. + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); + emit MessageSent(messageId); + } + + /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native token. + function sendDataAndTokens( + uint64 destChainSelector, + bytes memory receiver, + bytes memory data, + Client.EVMTokenAmount[] memory tokenAmounts + ) external validChain(destChainSelector) { + for (uint256 i = 0; i < tokenAmounts.length; ++i) { + IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); + } + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: receiver, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chains[destChainSelector], + feeToken: address(s_feeToken) + }); + // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); + // Can decide if fee is acceptable. + // address(this) must have sufficient feeToken or the send will revert. + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); + emit MessageSent(messageId); + } + + // @notice user sends tokens to a receiver + // Approvals can be optimized with a whitelist of tokens and inf approvals if desired. + function sendTokens( + uint64 destChainSelector, + bytes memory receiver, + Client.EVMTokenAmount[] memory tokenAmounts + ) external validChain(destChainSelector) { + for (uint256 i = 0; i < tokenAmounts.length; ++i) { + IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); + } + bytes memory data; + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: receiver, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chains[destChainSelector], + feeToken: address(s_feeToken) + }); + // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); + // Can decide if fee is acceptable. + // address(this) must have sufficient feeToken or the send will revert. + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); + emit MessageSent(messageId); + } +} From c8755c234094fafa2c3b01fa38e1355cdb4d25a6 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 6 Jun 2024 13:18:38 -0400 Subject: [PATCH 02/31] Finished initial versions, no tests or examples yet. --- contracts/gas-snapshots/ccip.gas-snapshot | 64 ++++----- .../ccip/production-examples/CCIPClient.sol | 118 ++++------------- .../production-examples/CCIPClientBase.sol | 38 +++++- .../ccip/production-examples/CCIPReceiver.sol | 8 +- .../production-examples/CCIPReceiverBasic.sol | 3 +- .../CCIPReceiverWithACK.sol | 124 ++++++++++++++++++ .../ccip/production-examples/CCIPSender.sol | 111 ++++------------ 7 files changed, 253 insertions(+), 213 deletions(-) create mode 100644 contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 6a10155536..82d7b3870b 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -45,7 +45,7 @@ CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 61208) CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 55387) CommitStore_report:test_Paused_Revert() (gas: 21259) CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 86378) -CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56336) +CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56272) CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 64015) CommitStore_report:test_StaleReportWithRoot_Success() (gas: 119320) CommitStore_report:test_Unhealthy_Revert() (gas: 44725) @@ -65,7 +65,7 @@ CommitStore_verify:test_Paused_Revert() (gas: 18496) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) DefensiveExampleTest:test_Recovery() (gas: 424253) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1067897) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1064563) EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 409685) EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 145611) EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12420) @@ -103,12 +103,12 @@ EVM2EVMMultiOffRamp_execute:test_RouterYULCall_Revert() (gas: 412640) EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokensOtherChain_Success() (gas: 241122) EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 188632) EVM2EVMMultiOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 257609) -EVM2EVMMultiOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 125233) +EVM2EVMMultiOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 124915) EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 397671) EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 62202) EVM2EVMMultiOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 59646) EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 539702) -EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 477229) +EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 475955) EVM2EVMMultiOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35823) EVM2EVMMultiOffRamp_execute:test_UnhealthySingleChainCurse_Revert() (gas: 529388) EVM2EVMMultiOffRamp_execute:test_Unhealthy_Revert() (gas: 526973) @@ -118,7 +118,7 @@ EVM2EVMMultiOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success( EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20638) EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 261016) EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20220) -EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 204130) +EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 206630) EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48744) EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48251) EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 247691) @@ -190,14 +190,14 @@ EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 34 EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29652) EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 108295) EVM2EVMMultiOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 23070) -EVM2EVMMultiOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 246301) +EVM2EVMMultiOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 248801) EVM2EVMMultiOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 40229) EVM2EVMMultiOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25916) EVM2EVMMultiOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59599) EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 191397) EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 135213) EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 162246) -EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3618955) +EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3621455) EVM2EVMMultiOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30855) EVM2EVMMultiOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 44218) EVM2EVMMultiOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 129149) @@ -251,13 +251,13 @@ EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 404614) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 161381) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 176738) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248687) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 117126) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 116815) EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 388142) EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54147) EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 134070) EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52074) EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 528397) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 467745) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 466480) EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35351) EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 516386) EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 63854) @@ -266,7 +266,7 @@ EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (ga EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20637) EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 260882) EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20264) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 204009) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 206509) EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48776) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48264) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 295086) @@ -311,14 +311,14 @@ EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36487) EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29069) EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107552) EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22661) -EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 224019) +EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 226519) EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 56550) EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25507) EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59124) EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182698) EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 178301) EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 137645) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3595319) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3597819) EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30191) EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43322) EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 109497) @@ -357,7 +357,7 @@ EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefau EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32615) EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 134879) EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143092) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 26589) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29089) EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127459) EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133360) EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146371) @@ -389,7 +389,7 @@ EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272276) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53472) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12856) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96729) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 47688) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49688) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17384) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15677) EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99741) @@ -478,7 +478,7 @@ MultiCommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 67143) MultiCommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 62665) MultiCommitStore_report:test_Paused_Revert() (gas: 38331) MultiCommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 113183) -MultiCommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60887) +MultiCommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60786) MultiCommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 71295) MultiCommitStore_report:test_SourceChainNotEnabled_Revert() (gas: 32131) MultiCommitStore_report:test_StaleReportWithRoot_Success() (gas: 127903) @@ -510,9 +510,9 @@ MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 43386) MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 53347) MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 29948) MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 51789) -MultiOCR3Base_transmit:test_TransmitSignersNonUniqueReports_gas_Success() (gas: 38684) -MultiOCR3Base_transmit:test_TransmitUniqueReportSigners_gas_Success() (gas: 45603) -MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 24336) +MultiOCR3Base_transmit:test_TransmitSignersNonUniqueReports_gas_Success() (gas: 38541) +MultiOCR3Base_transmit:test_TransmitUniqueReportSigners_gas_Success() (gas: 45399) +MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 24324) MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 20243) MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 48376) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 18135) @@ -524,7 +524,7 @@ OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 37039) OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24156) OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17448) OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26711) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27454) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27442) OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21272) OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12296) OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12470) @@ -538,12 +538,12 @@ OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19623) OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37683) OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55309) OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20962) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51686) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51674) OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) OnRampTokenPoolReentrancy:test_Success() (gas: 382249) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 148819) +PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151319) PingPong_plumbing:test_Pausing_Success() (gas: 17803) PingPong_startPingPong:test_StartPingPong_Success() (gas: 178914) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) @@ -592,12 +592,12 @@ RMN_ownerUnbless:test_Unbless_Success() (gas: 72058) RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterRecovery() (gas: 236682) RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 198660) RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 14981) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 179810) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 179808) RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 17953) RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 25911) RMN_setConfig:test_NonOwner_Revert() (gas: 15041) RMN_setConfig:test_RepeatedAddress_Revert() (gas: 21287) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 111456) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 111242) RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 39545) RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 142354) RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 14250) @@ -608,9 +608,9 @@ RMN_unvoteToCurse:test_InvalidVoter() (gas: 86618) RMN_unvoteToCurse:test_OwnerSkips() (gas: 29220) RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 26951) RMN_unvoteToCurse:test_ValidCursesHash() (gas: 31488) -RMN_voteToBlessRoots:test_1RootSuccess_gas() (gas: 45454) -RMN_voteToBlessRoots:test_3RootSuccess_gas() (gas: 99549) -RMN_voteToBlessRoots:test_5RootSuccess_gas() (gas: 153757) +RMN_voteToBlessRoots:test_1RootSuccess_gas() (gas: 45263) +RMN_voteToBlessRoots:test_3RootSuccess_gas() (gas: 99305) +RMN_voteToBlessRoots:test_5RootSuccess_gas() (gas: 153460) RMN_voteToBlessRoots:test_Curse_Revert() (gas: 244265) RMN_voteToBlessRoots:test_InvalidVoter_Revert() (gas: 17029) RMN_voteToBlessRoots:test_IsAlreadyBlessedIgnored_Success() (gas: 124904) @@ -664,18 +664,18 @@ Router_getFee:test_GetFeeSupportedChain_Success() (gas: 46599) Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17138) Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460) Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11316) -Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 17761) +Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20261) Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11159) Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 422138) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 50437) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 52437) Router_routeMessage:test_AutoExec_Success() (gas: 42764) Router_routeMessage:test_ExecutionEvent_Success() (gas: 158089) Router_routeMessage:test_ManualExec_Success() (gas: 35410) Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25167) Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44669) Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 53600) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 419479) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55600) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 421979) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20157) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 52047) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 45092) @@ -704,8 +704,8 @@ TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Re TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 50351) TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5881566) TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 6151241) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6669564) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6853613) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6672064) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6856113) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 2114838) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12089) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23280) diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol index f228bc1728..2f84d2ce6b 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol @@ -3,121 +3,57 @@ pragma solidity ^0.8.0; 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 {CCIPReceiver} from "./CCIPReceiver.sol"; +import {CCIPReceiverWithACK, CCIPReceiver} from "./CCIPReceiverWithACK.sol"; import {CCIPSender} from "./CCIPSender.sol"; +import {CCIPClientBase} from "./CCIPClientBase.sol"; import {IRouterClient} from "../interfaces/IRouterClient.sol"; import {Client} from "../libraries/Client.sol"; import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; -contract CCIPClient is CCIPReceiver { +contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; error InvalidConfig(); - event MessageSent(bytes32 messageId); - event MessageReceived(bytes32 messageId); - - // Current feeToken - IERC20 public s_feeToken; - /// @notice You can't import CCIPReceiver and Sender due to similar parents so functionality of CCIPSender is duplicated here - constructor(address router, IERC20 feeToken) CCIPReceiver(router) { - s_feeToken = feeToken; - s_feeToken.approve(address(router), type(uint256).max); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native asset. - function sendDataPayNative( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data - ) external validChain(destChainSelector) { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(0) // We leave the feeToken empty indicating we'll pay raw native. - }); - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ - value: IRouterClient(i_ccipRouter).getFee(destChainSelector, message) - }(destChainSelector, message); - emit MessageSent(messageId); - } + constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient feeToken. - function sendDataPayFeeToken( + function ccipSend( uint64 destChainSelector, - bytes memory receiver, - bytes memory data - ) external validChain(destChainSelector) { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } + Client.EVMTokenAmount[] memory tokenAmounts, + bytes calldata data, + address feeToken + ) public payable validChain(destChainSelector) { - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native token. - function sendDataAndTokens( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data, - Client.EVMTokenAmount[] memory tokenAmounts - ) external validChain(destChainSelector) { + // TODO: Decide whether workflow should assume contract is funded with tokens to send already for (uint256 i = 0; i < tokenAmounts.length; ++i) { IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); } + + CCIPClientBase.Chain memory chainInfo = s_chains[destChainSelector]; + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, + receiver: chainInfo.recipient, data: data, tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) + extraArgs: chainInfo.extraArgsBytes, + feeToken: feeToken }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } - // @notice user sends tokens to a receiver - // Approvals can be optimized with a whitelist of tokens and inf approvals if desired. - function sendTokens( - uint64 destChainSelector, - bytes memory receiver, - Client.EVMTokenAmount[] memory tokenAmounts - ) external validChain(destChainSelector) { - for (uint256 i = 0; i < tokenAmounts.length; ++i) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); + uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); + + // Transfer fee token from sender and approve router to pay for message + if (feeToken != address(0)) { + IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); + IERC20(feeToken).safeApprove(i_ccipRouter, fee); } - bytes memory data; - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); + + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ + value: feeToken == address(0) ? fee : 0 + } (destChainSelector, message); + emit MessageSent(messageId); } - - } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol index e3bb1762b0..b93b1da401 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol @@ -5,9 +5,19 @@ import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; contract CCIPClientBase is OwnerIsCreator { error InvalidRouter(address router); error InvalidChain(uint64 chainSelector); + error InvalidSender(bytes sender); + error InvalidRecipient(bytes recipient); address internal immutable i_ccipRouter; - mapping(uint64 destChainSelector => bytes extraArgsBytes) public s_chains; + + struct Chain { + bytes extraArgsBytes; + bytes recipient; + } + + mapping(uint64 destChainSelector => Chain chainInfo) public s_chains; + + mapping(bytes sender => bool isApproved) public s_senders; // Approved addresses of which to receive messages from constructor(address router) { if (router == address(0)) revert InvalidRouter(address(0)); @@ -28,12 +38,26 @@ contract CCIPClientBase is OwnerIsCreator { _; } + ///////////////////////////////////////////////////////////////////// + // Sender/Receiver Management + ///////////////////////////////////////////////////////////////////// + + function updateApprovedSenders(bytes[] calldata adds, bytes[] calldata removes) external onlyOwner { + for(uint256 i = 0; i < removes.length; ++i) { + delete s_senders[removes[i]]; + } + + for(uint256 i = 0; i < removes.length; ++i) { + s_senders[adds[i]] = true; + } + } + ///////////////////////////////////////////////////////////////////// // Chain Management ///////////////////////////////////////////////////////////////////// - function enableChain(uint64 chainSelector, bytes memory extraArgs) external onlyOwner { - s_chains[chainSelector] = extraArgs; + function enableChain(uint64 chainSelector, Chain calldata chainInfo) external onlyOwner { + s_chains[chainSelector] = chainInfo; } function disableChain(uint64 chainSelector) external onlyOwner { @@ -41,7 +65,13 @@ contract CCIPClientBase is OwnerIsCreator { } modifier validChain(uint64 chainSelector) { - if (s_chains[chainSelector].length == 0) revert InvalidChain(chainSelector); + if (s_chains[chainSelector].extraArgsBytes.length == 0) revert InvalidChain(chainSelector); + _; + } + + modifier validSender(bytes calldata sender) { + if (!s_senders[sender]) revert InvalidSender(sender); _; } + } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol index 57d654ebc1..eb91cba333 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol @@ -42,6 +42,7 @@ contract CCIPReceiver is CCIPClientBase { /// @dev Extremely important to ensure only router calls this. function ccipReceive(Client.Any2EVMMessage calldata message) external + virtual onlyRouter validChain(message.sourceChainSelector) { @@ -64,7 +65,12 @@ contract CCIPReceiver is CCIPClientBase { /// @dev This example just sends the tokens to the owner of this contracts. More /// interesting functions could be implemented. /// @dev It has to be external because of the try/catch. - function processMessage(Client.Any2EVMMessage calldata message) external onlySelf validChain(message.sourceChainSelector) { + function processMessage(Client.Any2EVMMessage calldata message) + external + virtual + onlySelf + validSender(message.sender) + validChain(message.sourceChainSelector) { // Insert Custom logic here } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol index 3d6ac3533e..0d3ab5f00c 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol @@ -8,7 +8,8 @@ import {Client} from "../libraries/Client.sol"; import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; -/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. +/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. +/// @notice Contract is NOT intended for deployment. CCIPReceiver is suggested instead. abstract contract CCIPReceiverBasic is CCIPClientBase, IAny2EVMMessageReceiver, IERC165 { constructor(address router) CCIPClientBase(router) {} diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol new file mode 100644 index 0000000000..7c0a4142bb --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol @@ -0,0 +1,124 @@ +pragma solidity ^0.8.0; + +import {IRouterClient} from "../interfaces/IRouterClient.sol"; +import {Client} from "../libraries/Client.sol"; +import {CCIPReceiver} from "./CCIPReceiver.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/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; + +contract CCIPReceiverWithACK is CCIPReceiver { + using SafeERC20 for IERC20; + using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + + // Current feeToken + IERC20 public immutable s_feeToken; + + bytes public constant ackMessageMagicBytes = "MESSAGE_ACKNOWLEDGED_"; + + mapping(bytes32 messageId => bool ackReceived) public s_messageAckReceived; + + event MessageSent(bytes32); + event MessageAckReceived(bytes32); + error InvalidMagicBytes(); + + enum MessageType { + OUTGOING, + ACK + } + + struct MessagePayload { + bytes version; + bytes data; + MessageType messageType; + } + + constructor(address router, IERC20 feeToken) CCIPReceiver(router) { + s_feeToken = feeToken; + + // If fee token is in LINK, then approve router to transfer + if (address(feeToken) != address(0)) { + feeToken.safeApprove(router, type(uint256).max); + } + + + } + + /// @notice The entrypoint for the CCIP router to call. This function should + /// never revert, all errors should be handled internally in this contract. + /// @param message The message to process. + /// @dev Extremely important to ensure only router calls this. + function ccipReceive(Client.Any2EVMMessage calldata message) + public + override + onlyRouter + validSender(message.sender) + validChain(message.sourceChainSelector) + { + try this.processMessage(message) {} + catch (bytes memory err) { + // Could set different error codes based on the caught error. Each could be + // handled differently. + s_failedMessages.set(message.messageId, uint256(ErrorCode.BASIC)); + s_messageContents[message.messageId] = message; + // Don't revert so CCIP doesn't revert. Emit event instead. + // The message can be retried later without having to do manual execution of CCIP. + emit MessageFailed(message.messageId, err); + return; + } + + emit MessageSucceeded(message.messageId); + + _sendAck(message); + } + + /// @notice Sends the acknowledgement message back through CCIP to original sender contract + function _sendAck(Client.Any2EVMMessage calldata incomingMessage) internal { + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + + Client.EVM2AnyMessage memory outgoingMessage = Client.EVM2AnyMessage({ + receiver: incomingMessage.sender, + data: abi.encode(ackMessageMagicBytes, incomingMessage.messageId), + tokenAmounts: tokenAmounts, + extraArgs: "", + feeToken: address(s_feeToken) // We leave the feeToken empty indicating we'll pay raw native. + }); + + uint256 feeAmount = IRouterClient(i_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); + + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ + value: address(s_feeToken) == address(0) ? feeAmount : 0 + }(incomingMessage.sourceChainSelector, outgoingMessage); + + emit MessageSent(messageId); + } + + /// @notice overrides CCIPReceiver processMessage to make easier to modify + function processMessage(Client.Any2EVMMessage calldata message) + external + override + onlySelf + { + + (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); + + if (payload.messageType == MessageType.OUTGOING) { + // Insert Processing workflow here. + } + + else if (payload.messageType == MessageType.ACK) { + // Decode message into the magic-bytes and the messageId to ensure the message is encoded correctly + (bytes memory magicBytes, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); + + // Ensure Ack Message contains proper magic-bytes + if (keccak256(magicBytes) != keccak256(ackMessageMagicBytes)) revert InvalidMagicBytes(); + + // Mark the message has finalized from a proper ack-message. + s_messageAckReceived[messageId] = true; + + emit MessageAckReceived(messageId); + } + } +} diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol index c852558d1a..d92de9a118 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol @@ -28,107 +28,50 @@ contract CCIPSender is CCIPClientBase { using SafeERC20 for IERC20; error InvalidConfig(); + error InsufficientNativeFeeTokenAmount(); event MessageSent(bytes32 messageId); event MessageReceived(bytes32 messageId); - // Current feeToken - IERC20 public s_feeToken; + + constructor(address router) CCIPClientBase(router) {} - constructor(address router, IERC20 feeToken) CCIPClientBase(router) { - s_feeToken = feeToken; - s_feeToken.safeApprove(address(router), type(uint256).max); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native asset. - function sendDataPayNative( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data - ) external validChain(destChainSelector) { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(0) // We leave the feeToken empty indicating we'll pay raw native. - }); - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ - value: IRouterClient(i_ccipRouter).getFee(destChainSelector, message) - }(destChainSelector, message); - emit MessageSent(messageId); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient feeToken. - function sendDataPayFeeToken( + function ccipSend( uint64 destChainSelector, - bytes memory receiver, - bytes memory data - ) external validChain(destChainSelector) { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } + Client.EVMTokenAmount[] memory tokenAmounts, + bytes calldata data, + address feeToken + ) public payable validChain(destChainSelector) { - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native token. - function sendDataAndTokens( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data, - Client.EVMTokenAmount[] memory tokenAmounts - ) external validChain(destChainSelector) { + // TODO: Decide whether workflow should assume contract is funded with tokens to send already for (uint256 i = 0; i < tokenAmounts.length; ++i) { IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); } + + CCIPClientBase.Chain memory chainInfo = s_chains[destChainSelector]; + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, + receiver: chainInfo.recipient, data: data, tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) + extraArgs: chainInfo.extraArgsBytes, + feeToken: feeToken }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } - // @notice user sends tokens to a receiver - // Approvals can be optimized with a whitelist of tokens and inf approvals if desired. - function sendTokens( - uint64 destChainSelector, - bytes memory receiver, - Client.EVMTokenAmount[] memory tokenAmounts - ) external validChain(destChainSelector) { - for (uint256 i = 0; i < tokenAmounts.length; ++i) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); + uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); + + // Transfer fee token from sender and approve router to pay for message + if (feeToken != address(0)) { + IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); + IERC20(feeToken).safeApprove(i_ccipRouter, fee); } - bytes memory data; - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); + + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ + value: feeToken == address(0) ? fee : 0 + } (destChainSelector, message); + emit MessageSent(messageId); } + } From c72d6c8282336245299bb08fdb31b0360b675d8a Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 7 Jun 2024 14:15:29 -0400 Subject: [PATCH 03/31] modify based on devrel feedback --- .../ccip/production-examples/CCIPClient.sol | 4 +- .../production-examples/CCIPClientBase.sol | 49 +++++++++++-------- .../ccip/production-examples/CCIPReceiver.sol | 11 ++--- .../CCIPReceiverWithACK.sol | 19 +++++-- .../ccip/production-examples/CCIPSender.sol | 4 +- .../interfaces/ICCIPClientBase.sol | 20 ++++++++ 6 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol index 2f84d2ce6b..3326e744e8 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol @@ -5,6 +5,8 @@ import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok import {CCIPReceiverWithACK, CCIPReceiver} from "./CCIPReceiverWithACK.sol"; import {CCIPSender} from "./CCIPSender.sol"; + +import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.sol"; import {CCIPClientBase} from "./CCIPClientBase.sol"; import {IRouterClient} from "../interfaces/IRouterClient.sol"; @@ -32,7 +34,7 @@ contract CCIPClient is CCIPReceiverWithACK { IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); } - CCIPClientBase.Chain memory chainInfo = s_chains[destChainSelector]; + ICCIPClientBase.ChainInfo memory chainInfo = s_chains[destChainSelector]; Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: chainInfo.recipient, diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol index b93b1da401..238b46746a 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol @@ -2,22 +2,18 @@ pragma solidity ^0.8.0; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -contract CCIPClientBase is OwnerIsCreator { - error InvalidRouter(address router); - error InvalidChain(uint64 chainSelector); - error InvalidSender(bytes sender); - error InvalidRecipient(bytes recipient); +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"; - address internal immutable i_ccipRouter; +import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.sol"; - struct Chain { - bytes extraArgsBytes; - bytes recipient; - } - - mapping(uint64 destChainSelector => Chain chainInfo) public s_chains; +contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { + using SafeERC20 for IERC20; + + address internal immutable i_ccipRouter; - mapping(bytes sender => bool isApproved) public s_senders; // Approved addresses of which to receive messages from + mapping(uint64 destChainSelector => mapping(bytes sender => bool approved)) public s_approvedSenders; + mapping(uint64 destChainSelector => ChainInfo chainInfo) public s_chains; constructor(address router) { if (router == address(0)) revert InvalidRouter(address(0)); @@ -42,21 +38,32 @@ contract CCIPClientBase is OwnerIsCreator { // Sender/Receiver Management ///////////////////////////////////////////////////////////////////// - function updateApprovedSenders(bytes[] calldata adds, bytes[] calldata removes) external onlyOwner { - for(uint256 i = 0; i < removes.length; ++i) { - delete s_senders[removes[i]]; + function updateApprovedSenders(approvedSenderUpdate[] calldata adds, approvedSenderUpdate[] calldata removes) external onlyOwner { + for(uint256 i = 0; i < adds.length; ++i) { + delete s_approvedSenders[removes[i].destChainSelector][removes[i].sender]; } for(uint256 i = 0; i < removes.length; ++i) { - s_senders[adds[i]] = true; + s_approvedSenders[adds[i].destChainSelector][adds[i].sender] = true; } } + ///////////////////////////////////////////////////////////////////// + // Fee Token Management + ///////////////////////////////////////////////////////////////////// + + fallback() external payable {} + receive() external payable {} + + function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { + IERC20(token).safeTransfer(to, amount); + } + ///////////////////////////////////////////////////////////////////// // Chain Management ///////////////////////////////////////////////////////////////////// - function enableChain(uint64 chainSelector, Chain calldata chainInfo) external onlyOwner { + function enableChain(uint64 chainSelector, ChainInfo calldata chainInfo) external onlyOwner { s_chains[chainSelector] = chainInfo; } @@ -69,9 +76,11 @@ contract CCIPClientBase is OwnerIsCreator { _; } - modifier validSender(bytes calldata sender) { - if (!s_senders[sender]) revert InvalidSender(sender); + modifier validSender(uint64 chainSelector, bytes calldata sender) { + if (!s_approvedSenders[chainSelector][sender]) revert InvalidSender(sender); _; } + + } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol index eb91cba333..4e5d6a58ef 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol @@ -69,11 +69,13 @@ contract CCIPReceiver is CCIPClientBase { external virtual onlySelf - validSender(message.sender) + validSender(message.sourceChainSelector, message.sender) validChain(message.sourceChainSelector) { // Insert Custom logic here } + function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual {} + /// @notice This function is callable by the owner when a message has failed /// to unblock the tokens that are associated with that message. /// @dev This function is only callable by the owner. @@ -87,11 +89,8 @@ contract CCIPReceiver is CCIPClientBase { // Do stuff to retry message, potentially just releasing the associated tokens Client.Any2EVMMessage memory message = s_messageContents[messageId]; - try this.processMessage(message) {} - catch (bytes memory err) { - emit MessageFailed(message.messageId, err); - return; - } + // Let the user override the implementation, since different workflow may be desired for retrying a merssage + _retryFailedMessage(message); s_failedMessages.remove(messageId); // If retry succeeds, remove from set of failed messages. diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol index 7c0a4142bb..7613205a17 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol @@ -14,7 +14,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { using EnumerableMap for EnumerableMap.Bytes32ToUintMap; // Current feeToken - IERC20 public immutable s_feeToken; + IERC20 public s_feeToken; bytes public constant ackMessageMagicBytes = "MESSAGE_ACKNOWLEDGED_"; @@ -42,8 +42,13 @@ contract CCIPReceiverWithACK is CCIPReceiver { if (address(feeToken) != address(0)) { feeToken.safeApprove(router, type(uint256).max); } + } - + function modifyFeeToken(address token) external onlyOwner { + s_feeToken = IERC20(token); + if (token != address(0)) { + s_feeToken.safeApprove(getRouter(), type(uint256).max); + } } /// @notice The entrypoint for the CCIP router to call. This function should @@ -54,7 +59,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { public override onlyRouter - validSender(message.sender) + validSender(message.sourceChainSelector, message.sender) validChain(message.sourceChainSelector) { try this.processMessage(message) {} @@ -70,8 +75,6 @@ contract CCIPReceiverWithACK is CCIPReceiver { } emit MessageSucceeded(message.messageId); - - _sendAck(message); } /// @notice Sends the acknowledgement message back through CCIP to original sender contract @@ -106,6 +109,10 @@ contract CCIPReceiverWithACK is CCIPReceiver { if (payload.messageType == MessageType.OUTGOING) { // Insert Processing workflow here. + + + // If the message was outgoin, then send an ack response. + _sendAck(message); } else if (payload.messageType == MessageType.ACK) { @@ -121,4 +128,6 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit MessageAckReceived(messageId); } } + + } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol index d92de9a118..26038cf8da 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol @@ -6,6 +6,8 @@ import {IRouterClient} from "../interfaces/IRouterClient.sol"; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {Client} from "../libraries/Client.sol"; + +import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.sol"; import {CCIPClientBase} from "./CCIPClientBase.sol"; import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; @@ -49,7 +51,7 @@ contract CCIPSender is CCIPClientBase { IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); } - CCIPClientBase.Chain memory chainInfo = s_chains[destChainSelector]; + ICCIPClientBase.ChainInfo memory chainInfo = s_chains[destChainSelector]; Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: chainInfo.recipient, diff --git a/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol new file mode 100644 index 0000000000..ee982c279e --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol @@ -0,0 +1,20 @@ +pragma solidity ^0.8.0; + +interface ICCIPClientBase { + error InvalidRouter(address router); + error InvalidChain(uint64 chainSelector); + error InvalidSender(bytes sender); + error InvalidRecipient(bytes recipient); + + struct approvedSenderUpdate { + uint64 destChainSelector; + bytes sender; + } + + struct ChainInfo { + bytes extraArgsBytes; + bytes recipient; + } + + function getRouter() external view returns (address); +} \ No newline at end of file From 99b0a89baaf9eb1a0c9db98d7f2c43afa9bed278 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 13 Jun 2024 15:35:42 -0400 Subject: [PATCH 04/31] initial tests for production-examples. Sufficient coverage but needs polish --- .../ccip/production-examples/CCIPClient.sol | 18 +- .../production-examples/CCIPClientBase.sol | 22 +- .../ccip/production-examples/CCIPReceiver.sol | 42 +++- .../production-examples/CCIPReceiverBasic.sol | 38 --- .../CCIPReceiverWithACK.sol | 22 +- .../ccip/production-examples/CCIPSender.sol | 24 +- .../ccip/production-examples/PingPongDemo.sol | 124 ++++++++++ .../interfaces/ICCIPClientBase.sol | 5 - .../CCIPReceiverTest.t.sol | 227 ++++++++++++++++++ .../CCIPReceiverWithAckTest.t.sol | 175 ++++++++++++++ .../production-examples/CCIPSenderTest.t.sol | 115 +++++++++ .../PingPongDemoTest.t.sol | 124 ++++++++++ 12 files changed, 852 insertions(+), 84 deletions(-) delete mode 100644 contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol create mode 100644 contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol create mode 100644 contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol create mode 100644 contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol create mode 100644 contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol create mode 100644 contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol index 3326e744e8..8aeacb1770 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol @@ -24,34 +24,36 @@ contract CCIPClient is CCIPReceiverWithACK { function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, - bytes calldata data, + bytes memory data, address feeToken ) public payable validChain(destChainSelector) { // TODO: Decide whether workflow should assume contract is funded with tokens to send already for (uint256 i = 0; i < tokenAmounts.length; ++i) { IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); } - ICCIPClientBase.ChainInfo memory chainInfo = s_chains[destChainSelector]; - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: chainInfo.recipient, + receiver: s_chains[destChainSelector], data: data, tokenAmounts: tokenAmounts, - extraArgs: chainInfo.extraArgsBytes, + extraArgs: s_extraArgsBytes[destChainSelector], feeToken: feeToken }); uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); // Transfer fee token from sender and approve router to pay for message - if (feeToken != address(0)) { + if (feeToken != address(0) && fee != 0) { IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); - IERC20(feeToken).safeApprove(i_ccipRouter, fee); + + // Use increaseAllowance in case the user is transfering the feeToken in tokenAmounts + IERC20(feeToken).safeIncreaseAllowance(i_ccipRouter, fee); } + else if (msg.value < fee) revert IRouterClient.InsufficientFeeTokenAmount(); + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ value: feeToken == address(0) ? fee : 0 } (destChainSelector, message); diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol index 238b46746a..123b9056d4 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol @@ -7,13 +7,14 @@ import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.sol"; -contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { +abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { using SafeERC20 for IERC20; address internal immutable i_ccipRouter; mapping(uint64 destChainSelector => mapping(bytes sender => bool approved)) public s_approvedSenders; - mapping(uint64 destChainSelector => ChainInfo chainInfo) public s_chains; + mapping(uint64 destChainSelector => bytes recipient) public s_chains; + mapping(uint64 destChainselector => bytes extraArgsBytes) public s_extraArgsBytes; constructor(address router) { if (router == address(0)) revert InvalidRouter(address(0)); @@ -39,11 +40,11 @@ contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { ///////////////////////////////////////////////////////////////////// function updateApprovedSenders(approvedSenderUpdate[] calldata adds, approvedSenderUpdate[] calldata removes) external onlyOwner { - for(uint256 i = 0; i < adds.length; ++i) { + for(uint256 i = 0; i < removes.length; ++i) { delete s_approvedSenders[removes[i].destChainSelector][removes[i].sender]; } - for(uint256 i = 0; i < removes.length; ++i) { + for(uint256 i = 0; i < adds.length; ++i) { s_approvedSenders[adds[i].destChainSelector][adds[i].sender] = true; } } @@ -63,24 +64,25 @@ contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { // Chain Management ///////////////////////////////////////////////////////////////////// - function enableChain(uint64 chainSelector, ChainInfo calldata chainInfo) external onlyOwner { - s_chains[chainSelector] = chainInfo; + function enableChain(uint64 chainSelector, bytes calldata recipient, bytes calldata extraArgsBytes) external onlyOwner { + s_chains[chainSelector] = recipient; + + if (extraArgsBytes.length != 0) s_extraArgsBytes[chainSelector] = extraArgsBytes; } function disableChain(uint64 chainSelector) external onlyOwner { delete s_chains[chainSelector]; + delete s_extraArgsBytes[chainSelector]; } modifier validChain(uint64 chainSelector) { - if (s_chains[chainSelector].extraArgsBytes.length == 0) revert InvalidChain(chainSelector); + if (s_chains[chainSelector].length == 0) revert InvalidChain(chainSelector); _; } - modifier validSender(uint64 chainSelector, bytes calldata sender) { + modifier validSender(uint64 chainSelector, bytes memory sender) { if (!s_approvedSenders[chainSelector][sender]) revert InvalidSender(sender); _; } - - } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol index 4e5d6a58ef..dc64df87f1 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol @@ -8,8 +8,11 @@ import {Client} from "../libraries/Client.sol"; import {CCIPClientBase} from "./CCIPClientBase.sol"; import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.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"; contract CCIPReceiver is CCIPClientBase { + using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; error OnlySelf(); @@ -25,15 +28,17 @@ contract CCIPReceiver is CCIPClientBase { // RESOLVED is first so that the default value is resolved. RESOLVED, // Could have any number of error codes here. - BASIC + FAILED } // The message contents of failed messages are stored here. - mapping(bytes32 messageId => Client.Any2EVMMessage contents) public s_messageContents; + mapping(bytes32 messageId => Client.Any2EVMMessage contents) internal s_messageContents; // Contains failed messages and their state. EnumerableMap.Bytes32ToUintMap internal s_failedMessages; + bool internal s_simRevert; + constructor(address router) CCIPClientBase(router) {} /// @notice The entrypoint for the CCIP router to call. This function should @@ -50,13 +55,16 @@ contract CCIPReceiver is CCIPClientBase { catch (bytes memory err) { // Could set different error codes based on the caught error. Each could be // handled differently. - s_failedMessages.set(message.messageId, uint256(ErrorCode.BASIC)); + s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); + s_messageContents[message.messageId] = message; + // Don't revert so CCIP doesn't revert. Emit event instead. // The message can be retried later without having to do manual execution of CCIP. emit MessageFailed(message.messageId, err); return; } + emit MessageSucceeded(message.messageId); } @@ -70,17 +78,26 @@ contract CCIPReceiver is CCIPClientBase { virtual onlySelf validSender(message.sourceChainSelector, message.sender) - validChain(message.sourceChainSelector) { + { // Insert Custom logic here + if (s_simRevert) revert ErrorCase(); } - function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual {} + function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual { + // Owner rescues tokens sent with a failed message + for(uint256 i = 0; i < message.destTokenAmounts.length; ++i) { + uint256 amount = message.destTokenAmounts[i].amount; + address token = message.destTokenAmounts[i].token; + + IERC20(token).safeTransfer(owner(), amount); + } + } /// @notice This function is callable by the owner when a message has failed /// to unblock the tokens that are associated with that message. /// @dev This function is only callable by the owner. function retryFailedMessage(bytes32 messageId) external onlyOwner { - if (s_failedMessages.get(messageId) != uint256(ErrorCode.BASIC)) revert MessageNotFailed(messageId); + if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); // Set the error code to 0 to disallow reentry and retry the same failed message // multiple times. @@ -97,6 +114,19 @@ contract CCIPReceiver is CCIPClientBase { emit MessageRecovered(messageId); } + function getMessageContents(bytes32 messageId) public view returns (Client.Any2EVMMessage memory) { + return s_messageContents[messageId]; + } + + function getMessageStatus(bytes32 messageId) public view returns (uint256) { + return s_failedMessages.get(messageId); + } + + // An example function to demonstrate recovery + function setSimRevert(bool simRevert) external onlyOwner { + s_simRevert = simRevert; + } + modifier onlySelf { if (msg.sender != address(this)) revert OnlySelf(); _; diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol deleted file mode 100644 index 0d3ab5f00c..0000000000 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol"; -import {CCIPClientBase} from "./CCIPClientBase.sol"; - -import {Client} from "../libraries/Client.sol"; - -import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; - -/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. -/// @notice Contract is NOT intended for deployment. CCIPReceiver is suggested instead. -abstract contract CCIPReceiverBasic is CCIPClientBase, IAny2EVMMessageReceiver, IERC165 { - constructor(address router) CCIPClientBase(router) {} - - /// @notice IERC165 supports an interfaceId - /// @param interfaceId The interfaceId to check - /// @return true if the interfaceId is supported - /// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver - /// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId - /// This allows CCIP to check if ccipReceive is available before calling it. - /// If this returns false or reverts, only tokens are transferred to the receiver. - /// If this returns true, tokens are transferred and ccipReceive is called atomically. - /// Additionally, if the receiver address does not have code associated with - /// it at the time of execution (EXTCODESIZE returns 0), only tokens will be transferred. - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; - } - - /// @inheritdoc IAny2EVMMessageReceiver - function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter { - _ccipReceive(message); - } - - /// @notice Override this function in your implementation. - /// @param message Any2EVMMessage - function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual; -} diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol index 7613205a17..59aa1a6139 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol @@ -20,9 +20,11 @@ contract CCIPReceiverWithACK is CCIPReceiver { mapping(bytes32 messageId => bool ackReceived) public s_messageAckReceived; + event MessageAckSent(bytes32 incomingMessageId); event MessageSent(bytes32); event MessageAckReceived(bytes32); error InvalidMagicBytes(); + event FeeTokenModified(address indexed oldToken, address indexed newToken); enum MessageType { OUTGOING, @@ -45,10 +47,21 @@ contract CCIPReceiverWithACK is CCIPReceiver { } function modifyFeeToken(address token) external onlyOwner { + // If the current fee token is not-native, zero out the allowance to the router for safety + if (address(s_feeToken) != address(0)) { + s_feeToken.safeApprove(getRouter(), 0); + } + + address oldFeeToken = address(s_feeToken); s_feeToken = IERC20(token); + + // Approve the router to spend the new fee token if (token != address(0)) { - s_feeToken.safeApprove(getRouter(), type(uint256).max); + s_feeToken.safeApprove(getRouter(), type(uint256).max); } + + emit FeeTokenModified(oldFeeToken, token); + } /// @notice The entrypoint for the CCIP router to call. This function should @@ -66,7 +79,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { catch (bytes memory err) { // Could set different error codes based on the caught error. Each could be // handled differently. - s_failedMessages.set(message.messageId, uint256(ErrorCode.BASIC)); + s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); s_messageContents[message.messageId] = message; // Don't revert so CCIP doesn't revert. Emit event instead. // The message can be retried later without having to do manual execution of CCIP. @@ -95,22 +108,22 @@ contract CCIPReceiverWithACK is CCIPReceiver { value: address(s_feeToken) == address(0) ? feeAmount : 0 }(incomingMessage.sourceChainSelector, outgoingMessage); + emit MessageAckSent(incomingMessage.messageId); emit MessageSent(messageId); } /// @notice overrides CCIPReceiver processMessage to make easier to modify function processMessage(Client.Any2EVMMessage calldata message) external + virtual override onlySelf { - (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); if (payload.messageType == MessageType.OUTGOING) { // Insert Processing workflow here. - // If the message was outgoin, then send an ack response. _sendAck(message); } @@ -129,5 +142,4 @@ contract CCIPReceiverWithACK is CCIPReceiver { } } - } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol index 26038cf8da..5b2e99702b 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol @@ -34,7 +34,6 @@ contract CCIPSender is CCIPClientBase { event MessageSent(bytes32 messageId); event MessageReceived(bytes32 messageId); - constructor(address router) CCIPClientBase(router) {} @@ -43,33 +42,34 @@ contract CCIPSender is CCIPClientBase { Client.EVMTokenAmount[] memory tokenAmounts, bytes calldata data, address feeToken - ) public payable validChain(destChainSelector) { - + ) public payable validChain(destChainSelector) returns (bytes32 messageId) { // TODO: Decide whether workflow should assume contract is funded with tokens to send already for (uint256 i = 0; i < tokenAmounts.length; ++i) { IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); } - ICCIPClientBase.ChainInfo memory chainInfo = s_chains[destChainSelector]; - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: chainInfo.recipient, + receiver: s_chains[destChainSelector], data: data, tokenAmounts: tokenAmounts, - extraArgs: chainInfo.extraArgsBytes, - feeToken: feeToken + feeToken: feeToken, + extraArgs: s_extraArgsBytes[destChainSelector] }); uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); // Transfer fee token from sender and approve router to pay for message - if (feeToken != address(0)) { + if (feeToken != address(0) && fee != 0) { IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); - IERC20(feeToken).safeApprove(i_ccipRouter, fee); + + // Use increaseAllowance in case the user is transfering the feeToken in tokenAmounts + IERC20(feeToken).safeIncreaseAllowance(i_ccipRouter, fee); } - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ + else if (msg.value < fee) revert IRouterClient.InsufficientFeeTokenAmount(); + + messageId = IRouterClient(i_ccipRouter).ccipSend{ value: feeToken == address(0) ? fee : 0 } (destChainSelector, message); diff --git a/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol b/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol new file mode 100644 index 0000000000..238cd60aaa --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; +import {IRouterClient} from "../interfaces/IRouterClient.sol"; + +import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; +import {Client} from "../libraries/Client.sol"; +import {CCIPClient} from "./CCIPClient.sol"; +import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.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"; + +/// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication +contract PingPongDemo is CCIPClient, ITypeAndVersion { + using SafeERC20 for IERC20; + + event Ping(uint256 pingPongCount); + event Pong(uint256 pingPongCount); + + // The chain ID of the counterpart ping pong contract + uint64 internal s_counterpartChainSelector; + + // The contract address of the counterpart ping pong contract + address internal s_counterpartAddress; + + // Pause ping-ponging + bool private s_isPaused; + + // CCIPClient will handle the token approval so there's no need to do it here + constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} + + function typeAndVersion() external pure virtual returns (string memory) { + return "PingPongDemo 1.3.0"; + } + + function startPingPong() external onlyOwner { + s_isPaused = false; + + // Start the game + _respond(1); + } + + function _respond(uint256 pingPongCount) internal virtual { + if (pingPongCount & 1 == 1) { + emit Ping(pingPongCount); + } else { + emit Pong(pingPongCount); + } + + bytes memory data = abi.encode(pingPongCount); + + ccipSend({ + destChainSelector: s_counterpartChainSelector, // destChaio + tokenAmounts: new Client.EVMTokenAmount[](0), + data: data, + feeToken: address(s_feeToken) + }); + } + + /// @notice This function the entrypoint for this contract to process messages. + /// @param message The message to process. + /// @dev This example just sends the tokens to the owner of this contracts. More + /// interesting functions could be implemented. + /// @dev It has to be external because of the try/catch. + function processMessage(Client.Any2EVMMessage calldata message) + external + override + onlySelf + validSender(message.sourceChainSelector, message.sender) + validChain(message.sourceChainSelector) { + + uint256 pingPongCount = abi.decode(message.data, (uint256)); + if (!s_isPaused) { + _respond(pingPongCount + 1); + } + } + + ///////////////////////////////////////////////////////////////////// + // Admin Functions + ///////////////////////////////////////////////////////////////////// + + function setCounterpart(uint64 counterpartChainSelector, address counterpartAddress) external onlyOwner { + s_counterpartChainSelector = counterpartChainSelector; + s_counterpartAddress = counterpartAddress; + + // Approve the counterpart contract under validSender + s_approvedSenders[counterpartChainSelector][abi.encode(counterpartAddress)] = true; + + // Approve the counterpart Chain selector under validChain + s_chains[counterpartChainSelector] = abi.encode(counterpartAddress); + } + + function setCounterpartChainSelector(uint64 counterpartChainSelector) external onlyOwner { + s_counterpartChainSelector = counterpartChainSelector; + } + + function setCounterpartAddress(address counterpartAddress) external onlyOwner { + s_counterpartAddress = counterpartAddress; + + s_chains[s_counterpartChainSelector] = abi.encode(counterpartAddress); + } + + ///////////////////////////////////////////////////////////////////// + // Plumbing + ///////////////////////////////////////////////////////////////////// + + function getCounterpartChainSelector() external view returns (uint64) { + return s_counterpartChainSelector; + } + + function getCounterpartAddress() external view returns (address) { + return s_counterpartAddress; + } + + function isPaused() external view returns (bool) { + return s_isPaused; + } + + function setPaused(bool pause) external onlyOwner { + s_isPaused = pause; + } +} diff --git a/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol index ee982c279e..ec9099d474 100644 --- a/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol @@ -11,10 +11,5 @@ interface ICCIPClientBase { bytes sender; } - struct ChainInfo { - bytes extraArgsBytes; - bytes recipient; - } - function getRouter() external view returns (address); } \ No newline at end of file diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol new file mode 100644 index 0000000000..0792fee188 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {CCIPReceiver} from "../../production-examples/CCIPReceiver.sol"; +import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientBase.sol"; + +import {Client} from "../../libraries/Client.sol"; +import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +contract CCIPReceiverTest is EVM2EVMOnRampSetup { + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageSucceeded(bytes32 indexed messageId); + event MessageRecovered(bytes32 indexed messageId); + + CCIPReceiver internal s_receiver; + uint64 internal sourceChainSelector = 7331; + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_receiver = new CCIPReceiver(address(s_destRouter)); + s_receiver.enableChain(sourceChainSelector, abi.encode(address(1)), ""); + + + ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate + ({ + destChainSelector: sourceChainSelector, + sender: abi.encode(address(s_receiver)) + }); + + s_receiver.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); + } + + function test_Recovery_with_intentional_revert() public { + bytes32 messageId = keccak256("messageId"); + address token = address(s_destFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), amount); + + // Make sure the contract call reverts so we can test recovery. + s_receiver.setSimRevert(true); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_destRouter)); + + vm.expectEmit(); + emit MessageFailed(messageId, abi.encodeWithSelector(CCIPReceiver.ErrorCase.selector)); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: sourceChainSelector, + sender: abi.encode(address(s_receiver)), + data: "", + destTokenAmounts: destTokenAmounts + }) + ); + + address tokenReceiver = OWNER; + uint256 tokenReceiverBalancePre = IERC20(token).balanceOf(tokenReceiver); + uint256 receiverBalancePre = IERC20(token).balanceOf(address(s_receiver)); + + // Recovery can only be done by the owner. + vm.startPrank(OWNER); + + vm.expectEmit(); + emit MessageRecovered(messageId); + + s_receiver.retryFailedMessage(messageId); + + // Assert the tokens have successfully been rescued from the contract. + assertEq(IERC20(token).balanceOf(tokenReceiver), tokenReceiverBalancePre + amount, "tokens not sent to tokenReceiver"); + assertEq(IERC20(token).balanceOf(address(s_receiver)), receiverBalancePre - amount, "tokens not subtracted from receiver"); + } + + function test_Recovery_from_invalid_sender() public { + bytes32 messageId = keccak256("messageId"); + address token = address(s_destFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), amount); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_destRouter)); + + vm.expectEmit(); + emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(ICCIPClientBase.InvalidSender.selector), abi.encode(address(1)))); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: sourceChainSelector, + sender: abi.encode(address(1)), + data: "", + destTokenAmounts: destTokenAmounts + }) + ); + + vm.stopPrank(); + + // Check that the message was stored properly by comparing each of the fields. + // There's no way to check that a function internally will revert from a top-level test, so we need to check state differences + Client.Any2EVMMessage memory failedMessage = s_receiver.getMessageContents(messageId); + assertEq(failedMessage.sender, abi.encode(address(1))); + assertEq(failedMessage.sourceChainSelector, sourceChainSelector); + assertEq(failedMessage.destTokenAmounts[0].token, token); + assertEq(failedMessage.destTokenAmounts[0].amount, amount); + + // Check that message status is failed + assertEq(s_receiver.getMessageStatus(messageId), 1); + + uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); + + vm.startPrank(OWNER); + + vm.expectEmit(); + emit IERC20.Transfer(address(s_receiver), OWNER, amount); + s_receiver.withdrawTokens(token, OWNER, amount); + + assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore + amount); + assertGt(IERC20(token).balanceOf(OWNER), 0); + } + + function test_HappyPath_Success() public { + bytes32 messageId = keccak256("messageId"); + address token = address(s_destFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), amount); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_destRouter)); + + vm.expectEmit(); + emit MessageSucceeded(messageId); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: sourceChainSelector, + sender: abi.encode(address(s_receiver)), // correct sender + data: "", + destTokenAmounts: destTokenAmounts + }) + ); + } + + function test_disableChain_andRevert_onccipReceive_REVERT() public { + s_receiver.disableChain(sourceChainSelector); + + bytes32 messageId = keccak256("messageId"); + address token = address(s_destFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), amount); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_destRouter)); + + vm.expectRevert(abi.encodeWithSelector(ICCIPClientBase.InvalidChain.selector, sourceChainSelector)); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: sourceChainSelector, + sender: abi.encode(address(1)), + data: "", + destTokenAmounts: destTokenAmounts + }) + ); + + } + + function test_removeSender_from_approvedList_and_revert() public { + ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate + ({ + destChainSelector: sourceChainSelector, + sender: abi.encode(address(s_receiver)) + }); + + s_receiver.updateApprovedSenders(new ICCIPClientBase.approvedSenderUpdate[](0), senderUpdates); + + assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); + + bytes32 messageId = keccak256("messageId"); + address token = address(s_destFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), amount); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_destRouter)); + + vm.expectEmit(); + emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(ICCIPClientBase.InvalidSender.selector), abi.encode(address(s_receiver)))); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: sourceChainSelector, + sender: abi.encode(address(s_receiver)), + data: "", + destTokenAmounts: destTokenAmounts + }) + ); + } +} diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol new file mode 100644 index 0000000000..05b45051aa --- /dev/null +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {CCIPReceiverWithACK} from "../../production-examples/CCIPReceiverWithACK.sol"; +import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientBase.sol"; + +import {Client} from "../../libraries/Client.sol"; +import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageSucceeded(bytes32 indexed messageId); + event MessageRecovered(bytes32 indexed messageId); + event MessageSent(bytes32); + event MessageAckSent(bytes32 incomingMessageId); + event MessageAckReceived(bytes32); + + + CCIPReceiverWithACK internal s_receiver; + uint64 internal destChainSelector = DEST_CHAIN_SELECTOR; + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_receiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); + s_receiver.enableChain(destChainSelector, abi.encode(address(s_receiver)), ""); + + ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate + ({ + destChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)) + }); + + s_receiver.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); + } + + function test_ccipReceive_and_respond_with_ack() public { + bytes32 messageId = keccak256("messageId"); + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), 1e24); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: "FAKE_DATA", + messageType: CCIPReceiverWithACK.MessageType.OUTGOING + }); + + Client.EVM2AnyMessage memory ackMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_receiver)), + data: abi.encode(s_receiver.ackMessageMagicBytes(), messageId), + tokenAmounts: destTokenAmounts, + feeToken: s_sourceFeeToken, + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(destChainSelector, ackMessage); + console.log("feeTokenAmount: %s", feeTokenAmount); + + uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)); + + vm.expectEmit(); + emit MessageAckSent(messageId); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + // Check that fee token is properly subtracted from balance to pay for ack message + assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)), receiverBalanceBefore - feeTokenAmount); + } + + function test_ccipReceive_ack_message() public { + bytes32 messageId = keccak256("messageId"); + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: abi.encode(s_receiver.ackMessageMagicBytes(), messageId), + messageType: CCIPReceiverWithACK.MessageType.ACK + }); + + vm.expectEmit(); + emit MessageAckReceived(messageId); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + assertTrue(s_receiver.s_messageAckReceived(messageId), "Ack message was not properly received"); + } + + function test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() public { + bytes32 messageId = keccak256("messageId"); + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + // Payload with incorrect magic bytes should revert + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: abi.encode("RANDOM_BYTES", messageId), + messageType: CCIPReceiverWithACK.MessageType.ACK + }); + + // Expect the processing to revert from invalid magic bytes + vm.expectEmit(); + emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(CCIPReceiverWithACK.InvalidMagicBytes.selector))); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + + // Check that message status is failed + assertEq(s_receiver.getMessageStatus(messageId), 1); + } + + function test_modifyFeeToken() public { + // WETH is used as a placeholder for any ERC20 token + address WETH = s_sourceRouter.getWrappedNative(); + + vm.expectEmit(); + emit IERC20.Approval(address(s_receiver), address(s_sourceRouter), 0); + + vm.expectEmit(); + emit CCIPReceiverWithACK.FeeTokenModified(s_sourceFeeToken, WETH); + + s_receiver.modifyFeeToken(WETH); + + IERC20 newFeeToken = s_receiver.s_feeToken(); + assertEq(address(newFeeToken), WETH); + assertEq(newFeeToken.allowance(address(s_receiver), address(s_sourceRouter)), type(uint).max); + assertEq(IERC20(s_sourceFeeToken).allowance(address(s_receiver), address(s_sourceRouter)), 0); + } + + function test_feeTokenApproval_in_constructor() public { + CCIPReceiverWithACK newReceiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); + + assertEq(IERC20(s_sourceFeeToken).allowance(address(newReceiver), address(s_sourceRouter)), type(uint).max); + } + + +} \ No newline at end of file diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol new file mode 100644 index 0000000000..b38b809d67 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {CCIPSender} from "../../production-examples/CCIPSender.sol"; +import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientBase.sol"; + +import {Client} from "../../libraries/Client.sol"; +import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +import {IRouterClient} from "../../interfaces/IRouterClient.sol"; +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +contract CCIPSenderTest is EVM2EVMOnRampSetup { + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageSucceeded(bytes32 indexed messageId); + event MessageRecovered(bytes32 indexed messageId); + + CCIPSender internal s_sender; + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_sender = new CCIPSender(address(s_sourceRouter)); + s_sender.enableChain(DEST_CHAIN_SELECTOR, abi.encode(address(s_sender)), ""); + } + + function test_ccipSend_withNonNativeFeetoken_andDestTokens() public { + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + IERC20(token).approve(address(s_sender), type(uint).max); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "", + tokenAmounts: destTokenAmounts, + feeToken: s_sourceFeeToken, + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); + + s_sender.ccipSend({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(s_sourceFeeToken) + }); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - amount - feeTokenAmount); + } + + function test_ccipSend_with_NativeFeeToken_andDestTokens() public { + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + IERC20(token).approve(address(s_sender), type(uint).max); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "", + tokenAmounts: destTokenAmounts, + feeToken: address(0), + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); + uint256 nativeFeeTokenBalanceBefore = OWNER.balance; + + s_sender.ccipSend{value: feeTokenAmount}({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(0) + }); + + // Assert that native fees are paid successfully and tokens are transferred + assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); + assertEq(OWNER.balance, nativeFeeTokenBalanceBefore - feeTokenAmount); + + } + + function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "FAKE_DATA", + tokenAmounts: destTokenAmounts, + feeToken: address(0), + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + + vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); + s_sender.ccipSend{value: feeTokenAmount / 2}({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(0) + }); + } +} \ No newline at end of file diff --git a/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol new file mode 100644 index 0000000000..b7f6e6100b --- /dev/null +++ b/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {PingPongDemo} from "../../production-examples/PingPongDemo.sol"; +import {Client} from "../../libraries/Client.sol"; +import "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +// setup +contract PingPongDappSetup is EVM2EVMOnRampSetup { + PingPongDemo internal s_pingPong; + IERC20 internal s_feeToken; + + address internal immutable i_pongContract = address(10); + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_feeToken = IERC20(s_sourceTokens[0]); + s_pingPong = new PingPongDemo(address(s_sourceRouter), s_feeToken); + s_pingPong.setCounterpart(DEST_CHAIN_SELECTOR, i_pongContract); + + uint256 fundingAmount = 1e18; + + // Fund the contract with LINK tokens + s_feeToken.transfer(address(s_pingPong), fundingAmount); + + IERC20(s_feeToken).approve(address(s_pingPong), type(uint).max); + } +} + +contract PingPong_example_startPingPong is PingPongDappSetup { + function test_StartPingPong_Success() public { + uint256 pingPongNumber = 1; + bytes memory data = abi.encode(pingPongNumber); + + Client.EVM2AnyMessage memory sentMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(i_pongContract), + data: data, + tokenAmounts: new Client.EVMTokenAmount[](0), + feeToken: s_sourceFeeToken, + extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 2e5})) + }); + + uint256 expectedFee = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, sentMessage); + + Internal.EVM2EVMMessage memory message = Internal.EVM2EVMMessage({ + sequenceNumber: 1, + feeTokenAmount: expectedFee, + sourceChainSelector: SOURCE_CHAIN_SELECTOR, + sender: address(s_pingPong), + receiver: i_pongContract, + nonce: 1, + data: data, + tokenAmounts: sentMessage.tokenAmounts, + sourceTokenData: new bytes[](sentMessage.tokenAmounts.length), + gasLimit: 2e5, + feeToken: sentMessage.feeToken, + strict: false, + messageId: "" + }); + message.messageId = Internal._hash(message, s_metadataHash); + + + vm.expectEmit(); + emit PingPongDemo.Ping(pingPongNumber); + + vm.expectEmit(); + emit EVM2EVMOnRamp.CCIPSendRequested(message); + + s_pingPong.startPingPong(); + } +} + +contract PingPong_example_ccipReceive is PingPongDappSetup { + function test_CcipReceive_Success() public { + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + + uint256 pingPongNumber = 5; + + Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ + messageId: bytes32("a"), + sourceChainSelector: DEST_CHAIN_SELECTOR, + sender: abi.encode(i_pongContract), + data: abi.encode(pingPongNumber), + destTokenAmounts: tokenAmounts + }); + + vm.startPrank(address(s_sourceRouter)); + + vm.expectEmit(); + emit PingPongDemo.Pong(pingPongNumber + 1); + + s_pingPong.ccipReceive(message); + } +} + +contract PingPong_example_plumbing is PingPongDappSetup { + function test_Fuzz_CounterPartChainSelector_Success(uint64 chainSelector) public { + s_pingPong.setCounterpartChainSelector(chainSelector); + + assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); + } + + function test_Fuzz_CounterPartAddress_Success(address counterpartAddress) public { + s_pingPong.setCounterpartAddress(counterpartAddress); + + assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); + } + + function test_Fuzz_CounterPartAddress_Success(uint64 chainSelector, address counterpartAddress) public { + s_pingPong.setCounterpart(chainSelector, counterpartAddress); + + assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); + assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); + } + + function test_Pausing_Success() public { + assertFalse(s_pingPong.isPaused()); + + s_pingPong.setPaused(true); + + assertTrue(s_pingPong.isPaused()); + } +} From ae52306fab3086f14ea85bfa33eb9f2e9b6cc749 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 14 Jun 2024 12:25:53 -0400 Subject: [PATCH 05/31] ccip-precommit and fix token approval bug where tokenAmounts includes the non-native fee token --- contracts/gas-snapshots/ccip.gas-snapshot | 276 ++++++++------- .../ccip/production-examples/CCIPClient.sol | 47 +-- .../production-examples/CCIPClientBase.sol | 16 +- .../ccip/production-examples/CCIPReceiver.sol | 31 +- .../CCIPReceiverWithACK.sol | 45 ++- .../ccip/production-examples/CCIPSender.sol | 48 +-- .../ccip/production-examples/PingPongDemo.sol | 17 +- .../interfaces/ICCIPClientBase.sol | 20 +- .../CCIPReceiverTest.t.sol | 94 ++--- .../CCIPReceiverWithAckTest.t.sol | 320 +++++++++--------- .../production-examples/CCIPSenderTest.t.sol | 207 ++++++----- .../PingPongDemoTest.t.sol | 5 +- 12 files changed, 570 insertions(+), 556 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 82d7b3870b..259bf2a517 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1,10 +1,10 @@ -ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19600) -ARMProxyStandaloneTest:test_Constructor() (gas: 374544) -ARMProxyStandaloneTest:test_SetARM() (gas: 16494) -ARMProxyStandaloneTest:test_SetARMzero() (gas: 11216) -ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 48029) -ARMProxyTest:test_ARMIsBlessed_Success() (gas: 48142) -ARMProxyTest:test_ARMIsCursed_Success() (gas: 50310) +ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 20673) +ARMProxyStandaloneTest:test_Constructor() (gas: 543485) +ARMProxyStandaloneTest:test_SetARM() (gas: 18216) +ARMProxyStandaloneTest:test_SetARMzero() (gas: 12144) +ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 50373) +ARMProxyTest:test_ARMIsBlessed_Success() (gas: 51621) +ARMProxyTest:test_ARMIsCursed_Success() (gas: 52689) AggregateTokenLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 19623) AggregateTokenLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 21208) AggregateTokenLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16403) @@ -35,6 +35,19 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243589) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) CCIPClientExample_sanity:test_Examples() (gas: 2132982) +CCIPReceiverTest:test_HappyPath_Success() (gas: 191836) +CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426491) +CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430334) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195877) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422996) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 52809) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 329625) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435480) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2380833) +CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72525) +CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 83896) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 331851) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 369012) CommitStore_constructor:test_Constructor_Success() (gas: 3113994) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 74815) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28693) @@ -388,27 +401,27 @@ EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15293) EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272276) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53472) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12856) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96729) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49688) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17384) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15677) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99741) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76096) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99748) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 144569) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80259) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80446) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 95713) -EtherSenderReceiverTest_constructor:test_constructor() (gas: 17511) -EtherSenderReceiverTest_getFee:test_getFee() (gas: 27289) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20333) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16715) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16654) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25415) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25265) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17895) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25287) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26292) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 103814) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 54732) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 21881) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 20674) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 116467) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 91360) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 116371) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 167929) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 98200) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 98574) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 117880) +EtherSenderReceiverTest_constructor:test_constructor() (gas: 19659) +EtherSenderReceiverTest_getFee:test_getFee() (gas: 41207) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 22872) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 18390) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 18420) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 34950) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 34697) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 23796) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 34674) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 36305) LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11058) LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35097) LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10970) @@ -441,11 +454,11 @@ LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 17926) LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11962) LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60025) LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11355) -MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5451) -MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3552) -MerkleMultiProofTest:test_MerkleRoot256() (gas: 394876) -MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3649) -MerkleMultiProofTest:test_SpecSync_gas() (gas: 34123) +MerkleMultiProofTest:test_CVE_2023_34459() (gas: 6372) +MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 4019) +MerkleMultiProofTest:test_MerkleRoot256() (gas: 668330) +MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 4074) +MerkleMultiProofTest:test_SpecSync_gas() (gas: 49338) MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 33965) MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60758) MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126294) @@ -497,53 +510,56 @@ MultiCommitStore_verify:test_NotBlessedWrongChainSelector_Success() (gas: 103743 MultiCommitStore_verify:test_NotBlessed_Success() (gas: 64090) MultiCommitStore_verify:test_Paused_Revert() (gas: 35772) MultiCommitStore_verify:test_TooManyLeaves_Revert() (gas: 36985) -MultiOCR3Base_setOCR3Configs:test_RepeatAddress_Revert() (gas: 85886) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 527475) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 305957) -MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12287) -MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 1338709) -MultiOCR3Base_setOCR3Configs:test_SingerCannotBeZeroAddress_Revert() (gas: 116292) -MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 228621) -MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 29072) -MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 34660) -MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 43386) -MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 53347) -MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 29948) -MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 51789) -MultiOCR3Base_transmit:test_TransmitSignersNonUniqueReports_gas_Success() (gas: 38541) -MultiOCR3Base_transmit:test_TransmitUniqueReportSigners_gas_Success() (gas: 45399) -MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 24324) -MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 20243) -MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 48376) -MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 18135) -MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 29533) -OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12278) -OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42337) -OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84491) -OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 37039) -OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24156) -OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17448) -OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26711) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27442) -OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21272) -OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12296) -OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12470) -OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 15142) -OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45579) -OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155192) -OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24407) -OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20607) -OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47298) -OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19623) -OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37683) -OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55309) -OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20962) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51674) -OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) -OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) -OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) +MultiOCR3Base_setOCR3Configs:test_RepeatAddress_Revert() (gas: 91944) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 560803) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 330401) +MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 13284) +MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 1431472) +MultiOCR3Base_setOCR3Configs:test_SingerCannotBeZeroAddress_Revert() (gas: 127260) +MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 240974) +MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 36335) +MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 43078) +MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 52294) +MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 63727) +MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 34937) +MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 65322) +MultiOCR3Base_transmit:test_TransmitSignersNonUniqueReports_gas_Success() (gas: 44899) +MultiOCR3Base_transmit:test_TransmitUniqueReportSigners_gas_Success() (gas: 52828) +MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 28477) +MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24363) +MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 57974) +MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 22068) +MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33947) +OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 15602) +OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 48997) +OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 97138) +OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 75776) +OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 32513) +OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 20081) +OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 29873) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 30506) +OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 25225) +OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 15608) +OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 15884) +OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 21917) +OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 56393) +OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 169648) +OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 32751) +OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 34918) +OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 55992) +OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 22520) +OCR2Base_transmit:test_ForkedChain_Revert() (gas: 42561) +OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 62252) +OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 24538) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 58490) +OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 27448) +OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 45597) +OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 23593) OnRampTokenPoolReentrancy:test_Success() (gas: 382249) PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151319) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 180748) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17789) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 194742) PingPong_plumbing:test_Pausing_Success() (gas: 17803) PingPong_startPingPong:test_StartPingPong_Success() (gas: 178914) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) @@ -587,58 +603,58 @@ PriceRegistry_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 19 PriceRegistry_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 89016) PriceRegistry_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 50865) PriceRegistry_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12340) -RMN_constructor:test_Constructor_Success() (gas: 58069) -RMN_ownerUnbless:test_Unbless_Success() (gas: 72058) -RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterRecovery() (gas: 236682) -RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 198660) -RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 14981) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 179808) -RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 17953) -RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 25911) -RMN_setConfig:test_NonOwner_Revert() (gas: 15041) -RMN_setConfig:test_RepeatedAddress_Revert() (gas: 21287) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 111242) -RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 39545) -RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 142354) -RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 14250) -RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 18152) -RMN_unvoteToCurse:test_InvalidCurseState_Revert() (gas: 18136) -RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 23178) -RMN_unvoteToCurse:test_InvalidVoter() (gas: 86618) -RMN_unvoteToCurse:test_OwnerSkips() (gas: 29220) -RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 26951) -RMN_unvoteToCurse:test_ValidCursesHash() (gas: 31488) -RMN_voteToBlessRoots:test_1RootSuccess_gas() (gas: 45263) -RMN_voteToBlessRoots:test_3RootSuccess_gas() (gas: 99305) -RMN_voteToBlessRoots:test_5RootSuccess_gas() (gas: 153460) -RMN_voteToBlessRoots:test_Curse_Revert() (gas: 244265) -RMN_voteToBlessRoots:test_InvalidVoter_Revert() (gas: 17029) -RMN_voteToBlessRoots:test_IsAlreadyBlessedIgnored_Success() (gas: 124904) -RMN_voteToBlessRoots:test_SenderAlreadyVotedIgnored_Success() (gas: 114423) -RMN_voteToCurse:test_AlreadyVoted_Revert() (gas: 74738) -RMN_voteToCurse:test_EmitCurse_Success() (gas: 243463) -RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 275862) -RMN_voteToCurse:test_InvalidVoter_Revert() (gas: 13671) -RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 194189) -RMN_voteToCurse:test_VoteToCurseSuccess_gas() (gas: 70265) -RateLimiter_constructor:test_Constructor_Success() (gas: 19650) -RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 15916) -RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22222) -RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31353) -RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20336) -RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40285) -RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15720) -RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25594) -RateLimiter_consume:test_Refill_Success() (gas: 37222) -RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18250) -RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24706) -RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38647) -RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46384) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38077) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19671) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 132584) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19463) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 132375) +RMN_constructor:test_Constructor_Success() (gas: 73405) +RMN_ownerUnbless:test_Unbless_Success() (gas: 100861) +RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterRecovery() (gas: 293002) +RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 262189) +RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 17812) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 221113) +RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 22975) +RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 35062) +RMN_setConfig:test_NonOwner_Revert() (gas: 19970) +RMN_setConfig:test_RepeatedAddress_Revert() (gas: 28350) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 134966) +RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 54015) +RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 168508) +RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 15952) +RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 23189) +RMN_unvoteToCurse:test_InvalidCurseState_Revert() (gas: 20289) +RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26158) +RMN_unvoteToCurse:test_InvalidVoter() (gas: 101587) +RMN_unvoteToCurse:test_OwnerSkips() (gas: 32751) +RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 30223) +RMN_unvoteToCurse:test_ValidCursesHash() (gas: 34924) +RMN_voteToBlessRoots:test_1RootSuccess_gas() (gas: 49816) +RMN_voteToBlessRoots:test_3RootSuccess_gas() (gas: 110890) +RMN_voteToBlessRoots:test_5RootSuccess_gas() (gas: 172035) +RMN_voteToBlessRoots:test_Curse_Revert() (gas: 262890) +RMN_voteToBlessRoots:test_InvalidVoter_Revert() (gas: 19455) +RMN_voteToBlessRoots:test_IsAlreadyBlessedIgnored_Success() (gas: 158114) +RMN_voteToBlessRoots:test_SenderAlreadyVotedIgnored_Success() (gas: 141392) +RMN_voteToCurse:test_AlreadyVoted_Revert() (gas: 81401) +RMN_voteToCurse:test_EmitCurse_Success() (gas: 261241) +RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 299234) +RMN_voteToCurse:test_InvalidVoter_Revert() (gas: 15464) +RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 256336) +RMN_voteToCurse:test_VoteToCurseSuccess_gas() (gas: 74169) +RateLimiter_constructor:test_Constructor_Success() (gas: 22964) +RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 19839) +RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 28311) +RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 39405) +RateLimiter_consume:test_ConsumeTokens_Success() (gas: 21919) +RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 57402) +RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 19531) +RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 33020) +RateLimiter_consume:test_Refill_Success() (gas: 48170) +RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 22450) +RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 31057) +RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 49681) +RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 63750) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 48188) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 22583) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 141720) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 22403) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 141539) Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89288) Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10648508) Router_applyRampUpdates:test_OnRampDisable() (gas: 55913) diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol index 8aeacb1770..a7a1fc0379 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol @@ -3,15 +3,10 @@ pragma solidity ^0.8.0; 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 {CCIPReceiverWithACK, CCIPReceiver} from "./CCIPReceiverWithACK.sol"; -import {CCIPSender} from "./CCIPSender.sol"; - -import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.sol"; -import {CCIPClientBase} from "./CCIPClientBase.sol"; +import {CCIPReceiverWithACK} from "./CCIPReceiverWithACK.sol"; import {IRouterClient} from "../interfaces/IRouterClient.sol"; import {Client} from "../libraries/Client.sol"; -import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; @@ -27,13 +22,6 @@ contract CCIPClient is CCIPReceiverWithACK { bytes memory data, address feeToken ) public payable validChain(destChainSelector) { - - // TODO: Decide whether workflow should assume contract is funded with tokens to send already - for (uint256 i = 0; i < tokenAmounts.length; ++i) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); - } - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: s_chains[destChainSelector], data: data, @@ -44,19 +32,36 @@ contract CCIPClient is CCIPReceiverWithACK { uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); - // Transfer fee token from sender and approve router to pay for message - if (feeToken != address(0) && fee != 0) { + // TODO: Decide whether workflow should assume contract is funded with tokens to send already + for (uint256 i = 0; i < tokenAmounts.length; ++i) { + // Transfer the tokens to pay for tokens in tokenAmounts + IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); + + // If they're not sending the fee token, then go ahead and approve + if (tokenAmounts[i].token != feeToken) { + IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); + } + // If they are sending the feeToken through, and also paying in it, then approve the router for both tokenAmount and the fee() + else if (tokenAmounts[i].token == feeToken && feeToken != address(0)) { + IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), fee); + IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount + fee); + } + } + + // If the user is paying in the fee token, and is NOT sending it through the bridge, then allowance() should be zero + // and we can send just transferFrom the sender and approve the router. This is because we only approve the router + // for the amount of tokens needed for this transaction, one at a time. + if (feeToken != address(0) && IERC20(feeToken).allowance(address(this), i_ccipRouter) == 0) { IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); // Use increaseAllowance in case the user is transfering the feeToken in tokenAmounts - IERC20(feeToken).safeIncreaseAllowance(i_ccipRouter, fee); + IERC20(feeToken).safeApprove(i_ccipRouter, fee); + } else if (feeToken == address(0) && msg.value < fee) { + revert IRouterClient.InsufficientFeeTokenAmount(); } - else if (msg.value < fee) revert IRouterClient.InsufficientFeeTokenAmount(); - - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ - value: feeToken == address(0) ? fee : 0 - } (destChainSelector, message); + bytes32 messageId = + IRouterClient(i_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); emit MessageSent(messageId); } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol index 123b9056d4..6261f9ba68 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol @@ -39,12 +39,15 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { // Sender/Receiver Management ///////////////////////////////////////////////////////////////////// - function updateApprovedSenders(approvedSenderUpdate[] calldata adds, approvedSenderUpdate[] calldata removes) external onlyOwner { - for(uint256 i = 0; i < removes.length; ++i) { + function updateApprovedSenders( + approvedSenderUpdate[] calldata adds, + approvedSenderUpdate[] calldata removes + ) external onlyOwner { + for (uint256 i = 0; i < removes.length; ++i) { delete s_approvedSenders[removes[i].destChainSelector][removes[i].sender]; } - for(uint256 i = 0; i < adds.length; ++i) { + for (uint256 i = 0; i < adds.length; ++i) { s_approvedSenders[adds[i].destChainSelector][adds[i].sender] = true; } } @@ -64,7 +67,11 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { // Chain Management ///////////////////////////////////////////////////////////////////// - function enableChain(uint64 chainSelector, bytes calldata recipient, bytes calldata extraArgsBytes) external onlyOwner { + function enableChain( + uint64 chainSelector, + bytes calldata recipient, + bytes calldata extraArgsBytes + ) external onlyOwner { s_chains[chainSelector] = recipient; if (extraArgsBytes.length != 0) s_extraArgsBytes[chainSelector] = extraArgsBytes; @@ -84,5 +91,4 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { if (!s_approvedSenders[chainSelector][sender]) revert InvalidSender(sender); _; } - } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol index dc64df87f1..935be077d4 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol @@ -1,15 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IRouterClient} from "../interfaces/IRouterClient.sol"; - -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {Client} from "../libraries/Client.sol"; import {CCIPClientBase} from "./CCIPClientBase.sol"; -import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.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/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; contract CCIPReceiver is CCIPClientBase { using SafeERC20 for IERC20; @@ -58,7 +55,7 @@ contract CCIPReceiver is CCIPClientBase { s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); s_messageContents[message.messageId] = message; - + // Don't revert so CCIP doesn't revert. Emit event instead. // The message can be retried later without having to do manual execution of CCIP. emit MessageFailed(message.messageId, err); @@ -73,19 +70,19 @@ contract CCIPReceiver is CCIPClientBase { /// @dev This example just sends the tokens to the owner of this contracts. More /// interesting functions could be implemented. /// @dev It has to be external because of the try/catch. - function processMessage(Client.Any2EVMMessage calldata message) + function processMessage(Client.Any2EVMMessage calldata message) external virtual - onlySelf - validSender(message.sourceChainSelector, message.sender) - { + onlySelf + validSender(message.sourceChainSelector, message.sender) + { // Insert Custom logic here if (s_simRevert) revert ErrorCase(); } function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual { // Owner rescues tokens sent with a failed message - for(uint256 i = 0; i < message.destTokenAmounts.length; ++i) { + for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { uint256 amount = message.destTokenAmounts[i].amount; address token = message.destTokenAmounts[i].token; @@ -108,7 +105,7 @@ contract CCIPReceiver is CCIPClientBase { // Let the user override the implementation, since different workflow may be desired for retrying a merssage _retryFailedMessage(message); - + s_failedMessages.remove(messageId); // If retry succeeds, remove from set of failed messages. emit MessageRecovered(messageId); @@ -117,17 +114,17 @@ contract CCIPReceiver is CCIPClientBase { function getMessageContents(bytes32 messageId) public view returns (Client.Any2EVMMessage memory) { return s_messageContents[messageId]; } - + function getMessageStatus(bytes32 messageId) public view returns (uint256) { return s_failedMessages.get(messageId); } - // An example function to demonstrate recovery - function setSimRevert(bool simRevert) external onlyOwner { - s_simRevert = simRevert; - } + // An example function to demonstrate recovery + function setSimRevert(bool simRevert) external onlyOwner { + s_simRevert = simRevert; + } - modifier onlySelf { + modifier onlySelf() { if (msg.sender != address(this)) revert OnlySelf(); _; } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol index 59aa1a6139..02c4965e56 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol @@ -23,10 +23,12 @@ contract CCIPReceiverWithACK is CCIPReceiver { event MessageAckSent(bytes32 incomingMessageId); event MessageSent(bytes32); event MessageAckReceived(bytes32); + error InvalidMagicBytes(); + event FeeTokenModified(address indexed oldToken, address indexed newToken); - enum MessageType { + enum MessageType { OUTGOING, ACK } @@ -42,7 +44,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { // If fee token is in LINK, then approve router to transfer if (address(feeToken) != address(0)) { - feeToken.safeApprove(router, type(uint256).max); + feeToken.safeApprove(router, type(uint256).max); } } @@ -61,7 +63,6 @@ contract CCIPReceiverWithACK is CCIPReceiver { } emit FeeTokenModified(oldFeeToken, token); - } /// @notice The entrypoint for the CCIP router to call. This function should @@ -104,42 +105,34 @@ contract CCIPReceiverWithACK is CCIPReceiver { uint256 feeAmount = IRouterClient(i_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ - value: address(s_feeToken) == address(0) ? feeAmount : 0 - }(incomingMessage.sourceChainSelector, outgoingMessage); + bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? feeAmount : 0}( + incomingMessage.sourceChainSelector, outgoingMessage + ); emit MessageAckSent(incomingMessage.messageId); emit MessageSent(messageId); } /// @notice overrides CCIPReceiver processMessage to make easier to modify - function processMessage(Client.Any2EVMMessage calldata message) - external - virtual - override - onlySelf - { + function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); if (payload.messageType == MessageType.OUTGOING) { - // Insert Processing workflow here. - - // If the message was outgoin, then send an ack response. - _sendAck(message); - } + // Insert Processing workflow here. - else if (payload.messageType == MessageType.ACK) { - // Decode message into the magic-bytes and the messageId to ensure the message is encoded correctly - (bytes memory magicBytes, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); + // If the message was outgoin, then send an ack response. + _sendAck(message); + } else if (payload.messageType == MessageType.ACK) { + // Decode message into the magic-bytes and the messageId to ensure the message is encoded correctly + (bytes memory magicBytes, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); - // Ensure Ack Message contains proper magic-bytes - if (keccak256(magicBytes) != keccak256(ackMessageMagicBytes)) revert InvalidMagicBytes(); + // Ensure Ack Message contains proper magic-bytes + if (keccak256(magicBytes) != keccak256(ackMessageMagicBytes)) revert InvalidMagicBytes(); - // Mark the message has finalized from a proper ack-message. - s_messageAckReceived[messageId] = true; + // Mark the message has finalized from a proper ack-message. + s_messageAckReceived[messageId] = true; - emit MessageAckReceived(messageId); + emit MessageAckReceived(messageId); } } - } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol index 5b2e99702b..6ad32923e9 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol @@ -3,11 +3,7 @@ pragma solidity ^0.8.0; import {IRouterClient} from "../interfaces/IRouterClient.sol"; -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; - import {Client} from "../libraries/Client.sol"; - -import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.sol"; import {CCIPClientBase} from "./CCIPClientBase.sol"; import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; @@ -28,13 +24,13 @@ import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok // new chain family receivers (e.g. a solana encoded receiver address) without upgrading. contract CCIPSender is CCIPClientBase { using SafeERC20 for IERC20; - + error InvalidConfig(); error InsufficientNativeFeeTokenAmount(); event MessageSent(bytes32 messageId); event MessageReceived(bytes32 messageId); - + constructor(address router) CCIPClientBase(router) {} function ccipSend( @@ -43,12 +39,6 @@ contract CCIPSender is CCIPClientBase { bytes calldata data, address feeToken ) public payable validChain(destChainSelector) returns (bytes32 messageId) { - // TODO: Decide whether workflow should assume contract is funded with tokens to send already - for (uint256 i = 0; i < tokenAmounts.length; ++i) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); - } - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: s_chains[destChainSelector], data: data, @@ -59,21 +49,35 @@ contract CCIPSender is CCIPClientBase { uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); - // Transfer fee token from sender and approve router to pay for message - if (feeToken != address(0) && fee != 0) { - IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); + // TODO: Decide whether workflow should assume contract is funded with tokens to send already + for (uint256 i = 0; i < tokenAmounts.length; ++i) { + // Transfer the tokens to pay for tokens in tokenAmounts + IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - // Use increaseAllowance in case the user is transfering the feeToken in tokenAmounts - IERC20(feeToken).safeIncreaseAllowance(i_ccipRouter, fee); + // If they're not sending the fee token, then go ahead and approve + if (tokenAmounts[i].token != feeToken) { + IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); + } + // If they are sending the feeToken through, and also paying in it, then approve the router for both tokenAmount and the fee() + else if (tokenAmounts[i].token == feeToken && feeToken != address(0)) { + IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), fee); + IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount + fee); + } } - else if (msg.value < fee) revert IRouterClient.InsufficientFeeTokenAmount(); + // If the user is paying in the fee token, and is NOT sending it through the bridge, then allowance() should be zero + // and we can send just transferFrom the sender and approve the router. This is because we only approve the router + // for the amount of tokens needed for this transaction, one at a time. + if (feeToken != address(0) && IERC20(feeToken).allowance(address(this), i_ccipRouter) == 0) { + IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); + IERC20(feeToken).safeApprove(i_ccipRouter, fee); + } else if (feeToken == address(0) && msg.value < fee) { + revert IRouterClient.InsufficientFeeTokenAmount(); + } - messageId = IRouterClient(i_ccipRouter).ccipSend{ - value: feeToken == address(0) ? fee : 0 - } (destChainSelector, message); + messageId = + IRouterClient(i_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); emit MessageSent(messageId); } - } diff --git a/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol b/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol index 238cd60aaa..92fd81c146 100644 --- a/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol @@ -2,12 +2,9 @@ pragma solidity ^0.8.0; import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; -import {IRouterClient} from "../interfaces/IRouterClient.sol"; -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {Client} from "../libraries/Client.sol"; import {CCIPClient} from "./CCIPClient.sol"; -import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.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"; @@ -64,20 +61,20 @@ contract PingPongDemo is CCIPClient, ITypeAndVersion { /// @dev This example just sends the tokens to the owner of this contracts. More /// interesting functions could be implemented. /// @dev It has to be external because of the try/catch. - function processMessage(Client.Any2EVMMessage calldata message) + function processMessage(Client.Any2EVMMessage calldata message) external override - onlySelf - validSender(message.sourceChainSelector, message.sender) - validChain(message.sourceChainSelector) { - + onlySelf + validSender(message.sourceChainSelector, message.sender) + validChain(message.sourceChainSelector) + { uint256 pingPongCount = abi.decode(message.data, (uint256)); if (!s_isPaused) { _respond(pingPongCount + 1); } } - ///////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////// // Admin Functions ///////////////////////////////////////////////////////////////////// @@ -102,7 +99,7 @@ contract PingPongDemo is CCIPClient, ITypeAndVersion { s_chains[s_counterpartChainSelector] = abi.encode(counterpartAddress); } - ///////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////// // Plumbing ///////////////////////////////////////////////////////////////////// diff --git a/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol index ec9099d474..8fa97788c3 100644 --- a/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol @@ -1,15 +1,15 @@ pragma solidity ^0.8.0; interface ICCIPClientBase { - error InvalidRouter(address router); - error InvalidChain(uint64 chainSelector); - error InvalidSender(bytes sender); - error InvalidRecipient(bytes recipient); + error InvalidRouter(address router); + error InvalidChain(uint64 chainSelector); + error InvalidSender(bytes sender); + error InvalidRecipient(bytes recipient); - struct approvedSenderUpdate { - uint64 destChainSelector; - bytes sender; - } + struct approvedSenderUpdate { + uint64 destChainSelector; + bytes sender; + } - function getRouter() external view returns (address); -} \ No newline at end of file + function getRouter() external view returns (address); +} diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol index 0792fee188..5dd12eaf7e 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol @@ -23,12 +23,10 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { s_receiver = new CCIPReceiver(address(s_destRouter)); s_receiver.enableChain(sourceChainSelector, abi.encode(address(1)), ""); - ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate - ({ - destChainSelector: sourceChainSelector, - sender: abi.encode(address(s_receiver)) + senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate({ + destChainSelector: sourceChainSelector, + sender: abi.encode(address(s_receiver)) }); s_receiver.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); @@ -76,8 +74,12 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { s_receiver.retryFailedMessage(messageId); // Assert the tokens have successfully been rescued from the contract. - assertEq(IERC20(token).balanceOf(tokenReceiver), tokenReceiverBalancePre + amount, "tokens not sent to tokenReceiver"); - assertEq(IERC20(token).balanceOf(address(s_receiver)), receiverBalancePre - amount, "tokens not subtracted from receiver"); + assertEq( + IERC20(token).balanceOf(tokenReceiver), tokenReceiverBalancePre + amount, "tokens not sent to tokenReceiver" + ); + assertEq( + IERC20(token).balanceOf(address(s_receiver)), receiverBalancePre - amount, "tokens not subtracted from receiver" + ); } function test_Recovery_from_invalid_sender() public { @@ -94,7 +96,9 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.startPrank(address(s_destRouter)); vm.expectEmit(); - emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(ICCIPClientBase.InvalidSender.selector), abi.encode(address(1)))); + emit MessageFailed( + messageId, abi.encodeWithSelector(bytes4(ICCIPClientBase.InvalidSender.selector), abi.encode(address(1))) + ); s_receiver.ccipReceive( Client.Any2EVMMessage({ @@ -115,7 +119,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { assertEq(failedMessage.sourceChainSelector, sourceChainSelector); assertEq(failedMessage.destTokenAmounts[0].token, token); assertEq(failedMessage.destTokenAmounts[0].amount, amount); - + // Check that message status is failed assertEq(s_receiver.getMessageStatus(messageId), 1); @@ -184,44 +188,44 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { destTokenAmounts: destTokenAmounts }) ); - } function test_removeSender_from_approvedList_and_revert() public { - ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate - ({ - destChainSelector: sourceChainSelector, - sender: abi.encode(address(s_receiver)) - }); - - s_receiver.updateApprovedSenders(new ICCIPClientBase.approvedSenderUpdate[](0), senderUpdates); - - assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); - - bytes32 messageId = keccak256("messageId"); - address token = address(s_destFeeToken); - uint256 amount = 111333333777; - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); - - // Make sure we give the receiver contract enough tokens like CCIP would. - deal(token, address(s_receiver), amount); - - // The receiver contract will revert if the router is not the sender. - vm.startPrank(address(s_destRouter)); - - vm.expectEmit(); - emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(ICCIPClientBase.InvalidSender.selector), abi.encode(address(s_receiver)))); - - s_receiver.ccipReceive( - Client.Any2EVMMessage({ - messageId: messageId, - sourceChainSelector: sourceChainSelector, - sender: abi.encode(address(s_receiver)), - data: "", - destTokenAmounts: destTokenAmounts - }) - ); + ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate({ + destChainSelector: sourceChainSelector, + sender: abi.encode(address(s_receiver)) + }); + + s_receiver.updateApprovedSenders(new ICCIPClientBase.approvedSenderUpdate[](0), senderUpdates); + + assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); + + bytes32 messageId = keccak256("messageId"); + address token = address(s_destFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), amount); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_destRouter)); + + vm.expectEmit(); + emit MessageFailed( + messageId, abi.encodeWithSelector(bytes4(ICCIPClientBase.InvalidSender.selector), abi.encode(address(s_receiver))) + ); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: sourceChainSelector, + sender: abi.encode(address(s_receiver)), + data: "", + destTokenAmounts: destTokenAmounts + }) + ); } } diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol index 05b45051aa..3d6b0f06e6 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol @@ -10,166 +10,160 @@ import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { - event MessageFailed(bytes32 indexed messageId, bytes reason); - event MessageSucceeded(bytes32 indexed messageId); - event MessageRecovered(bytes32 indexed messageId); - event MessageSent(bytes32); - event MessageAckSent(bytes32 incomingMessageId); - event MessageAckReceived(bytes32); - - - CCIPReceiverWithACK internal s_receiver; - uint64 internal destChainSelector = DEST_CHAIN_SELECTOR; - - function setUp() public virtual override { - EVM2EVMOnRampSetup.setUp(); - - s_receiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); - s_receiver.enableChain(destChainSelector, abi.encode(address(s_receiver)), ""); - - ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate - ({ - destChainSelector: destChainSelector, - sender: abi.encode(address(s_receiver)) - }); - - s_receiver.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); - } - - function test_ccipReceive_and_respond_with_ack() public { - bytes32 messageId = keccak256("messageId"); - address token = address(s_sourceFeeToken); - uint256 amount = 111333333777; - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); - - // Make sure we give the receiver contract enough tokens like CCIP would. - deal(token, address(s_receiver), 1e24); - - // The receiver contract will revert if the router is not the sender. - vm.startPrank(address(s_sourceRouter)); - - CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ - version: "", - data: "FAKE_DATA", - messageType: CCIPReceiverWithACK.MessageType.OUTGOING - }); - - Client.EVM2AnyMessage memory ackMessage = Client.EVM2AnyMessage({ - receiver: abi.encode(address(s_receiver)), - data: abi.encode(s_receiver.ackMessageMagicBytes(), messageId), - tokenAmounts: destTokenAmounts, - feeToken: s_sourceFeeToken, - extraArgs: "" - }); - - uint256 feeTokenAmount = s_sourceRouter.getFee(destChainSelector, ackMessage); - console.log("feeTokenAmount: %s", feeTokenAmount); - - uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)); - - vm.expectEmit(); - emit MessageAckSent(messageId); - - s_receiver.ccipReceive( - Client.Any2EVMMessage({ - messageId: messageId, - sourceChainSelector: destChainSelector, - sender: abi.encode(address(s_receiver)), - data: abi.encode(payload), - destTokenAmounts: destTokenAmounts - }) - ); - - // Check that fee token is properly subtracted from balance to pay for ack message - assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)), receiverBalanceBefore - feeTokenAmount); - } - - function test_ccipReceive_ack_message() public { - bytes32 messageId = keccak256("messageId"); - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); - - // The receiver contract will revert if the router is not the sender. - vm.startPrank(address(s_sourceRouter)); - - CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ - version: "", - data: abi.encode(s_receiver.ackMessageMagicBytes(), messageId), - messageType: CCIPReceiverWithACK.MessageType.ACK - }); - - vm.expectEmit(); - emit MessageAckReceived(messageId); - - s_receiver.ccipReceive( - Client.Any2EVMMessage({ - messageId: messageId, - sourceChainSelector: destChainSelector, - sender: abi.encode(address(s_receiver)), - data: abi.encode(payload), - destTokenAmounts: destTokenAmounts - }) - ); - - assertTrue(s_receiver.s_messageAckReceived(messageId), "Ack message was not properly received"); - } - - function test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() public { - bytes32 messageId = keccak256("messageId"); - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); - - // The receiver contract will revert if the router is not the sender. - vm.startPrank(address(s_sourceRouter)); - - // Payload with incorrect magic bytes should revert - CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ - version: "", - data: abi.encode("RANDOM_BYTES", messageId), - messageType: CCIPReceiverWithACK.MessageType.ACK - }); - - // Expect the processing to revert from invalid magic bytes - vm.expectEmit(); - emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(CCIPReceiverWithACK.InvalidMagicBytes.selector))); - - s_receiver.ccipReceive( - Client.Any2EVMMessage({ - messageId: messageId, - sourceChainSelector: destChainSelector, - sender: abi.encode(address(s_receiver)), - data: abi.encode(payload), - destTokenAmounts: destTokenAmounts - }) - ); - - - // Check that message status is failed - assertEq(s_receiver.getMessageStatus(messageId), 1); - } - - function test_modifyFeeToken() public { - // WETH is used as a placeholder for any ERC20 token - address WETH = s_sourceRouter.getWrappedNative(); - - vm.expectEmit(); - emit IERC20.Approval(address(s_receiver), address(s_sourceRouter), 0); - - vm.expectEmit(); - emit CCIPReceiverWithACK.FeeTokenModified(s_sourceFeeToken, WETH); - - s_receiver.modifyFeeToken(WETH); - - IERC20 newFeeToken = s_receiver.s_feeToken(); - assertEq(address(newFeeToken), WETH); - assertEq(newFeeToken.allowance(address(s_receiver), address(s_sourceRouter)), type(uint).max); - assertEq(IERC20(s_sourceFeeToken).allowance(address(s_receiver), address(s_sourceRouter)), 0); - } - - function test_feeTokenApproval_in_constructor() public { - CCIPReceiverWithACK newReceiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); - - assertEq(IERC20(s_sourceFeeToken).allowance(address(newReceiver), address(s_sourceRouter)), type(uint).max); - } - - -} \ No newline at end of file + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageSucceeded(bytes32 indexed messageId); + event MessageRecovered(bytes32 indexed messageId); + event MessageSent(bytes32); + event MessageAckSent(bytes32 incomingMessageId); + event MessageAckReceived(bytes32); + + CCIPReceiverWithACK internal s_receiver; + uint64 internal destChainSelector = DEST_CHAIN_SELECTOR; + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_receiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); + s_receiver.enableChain(destChainSelector, abi.encode(address(s_receiver)), ""); + + ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate({ + destChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)) + }); + + s_receiver.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); + } + + function test_ccipReceive_and_respond_with_ack() public { + bytes32 messageId = keccak256("messageId"); + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), 1e24); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: "FAKE_DATA", + messageType: CCIPReceiverWithACK.MessageType.OUTGOING + }); + + Client.EVM2AnyMessage memory ackMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_receiver)), + data: abi.encode(s_receiver.ackMessageMagicBytes(), messageId), + tokenAmounts: destTokenAmounts, + feeToken: s_sourceFeeToken, + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(destChainSelector, ackMessage); + + uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)); + + vm.expectEmit(); + emit MessageAckSent(messageId); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + // Check that fee token is properly subtracted from balance to pay for ack message + assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)), receiverBalanceBefore - feeTokenAmount); + } + + function test_ccipReceive_ack_message() public { + bytes32 messageId = keccak256("messageId"); + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: abi.encode(s_receiver.ackMessageMagicBytes(), messageId), + messageType: CCIPReceiverWithACK.MessageType.ACK + }); + + vm.expectEmit(); + emit MessageAckReceived(messageId); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + assertTrue(s_receiver.s_messageAckReceived(messageId), "Ack message was not properly received"); + } + + function test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() public { + bytes32 messageId = keccak256("messageId"); + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + // Payload with incorrect magic bytes should revert + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: abi.encode("RANDOM_BYTES", messageId), + messageType: CCIPReceiverWithACK.MessageType.ACK + }); + + // Expect the processing to revert from invalid magic bytes + vm.expectEmit(); + emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(CCIPReceiverWithACK.InvalidMagicBytes.selector))); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + // Check that message status is failed + assertEq(s_receiver.getMessageStatus(messageId), 1); + } + + function test_modifyFeeToken() public { + // WETH is used as a placeholder for any ERC20 token + address WETH = s_sourceRouter.getWrappedNative(); + + vm.expectEmit(); + emit IERC20.Approval(address(s_receiver), address(s_sourceRouter), 0); + + vm.expectEmit(); + emit CCIPReceiverWithACK.FeeTokenModified(s_sourceFeeToken, WETH); + + s_receiver.modifyFeeToken(WETH); + + IERC20 newFeeToken = s_receiver.s_feeToken(); + assertEq(address(newFeeToken), WETH); + assertEq(newFeeToken.allowance(address(s_receiver), address(s_sourceRouter)), type(uint256).max); + assertEq(IERC20(s_sourceFeeToken).allowance(address(s_receiver), address(s_sourceRouter)), 0); + } + + function test_feeTokenApproval_in_constructor() public { + CCIPReceiverWithACK newReceiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); + + assertEq(IERC20(s_sourceFeeToken).allowance(address(newReceiver), address(s_sourceRouter)), type(uint256).max); + } +} diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol index b38b809d67..fa75d0f416 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol @@ -7,109 +7,108 @@ import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientB import {Client} from "../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; -import {IRouterClient} from "../../interfaces/IRouterClient.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IRouterClient} from "../../interfaces/IRouterClient.sol"; -contract CCIPSenderTest is EVM2EVMOnRampSetup { - event MessageFailed(bytes32 indexed messageId, bytes reason); - event MessageSucceeded(bytes32 indexed messageId); - event MessageRecovered(bytes32 indexed messageId); - - CCIPSender internal s_sender; - - function setUp() public virtual override { - EVM2EVMOnRampSetup.setUp(); - - s_sender = new CCIPSender(address(s_sourceRouter)); - s_sender.enableChain(DEST_CHAIN_SELECTOR, abi.encode(address(s_sender)), ""); - } - - function test_ccipSend_withNonNativeFeetoken_andDestTokens() public { - address token = address(s_sourceFeeToken); - uint256 amount = 111333333777; - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); - - // Make sure we give the receiver contract enough tokens like CCIP would. - IERC20(token).approve(address(s_sender), type(uint).max); - - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(address(s_sender)), - data: "", - tokenAmounts: destTokenAmounts, - feeToken: s_sourceFeeToken, - extraArgs: "" - }); - - uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); - uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); - - s_sender.ccipSend({ - destChainSelector: DEST_CHAIN_SELECTOR, - tokenAmounts: destTokenAmounts, - data: "", - feeToken: address(s_sourceFeeToken) - }); - - // Assert that tokens were transfered for bridging + fees - assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - amount - feeTokenAmount); - } - - function test_ccipSend_with_NativeFeeToken_andDestTokens() public { - address token = address(s_sourceFeeToken); - uint256 amount = 111333333777; - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); - - // Make sure we give the receiver contract enough tokens like CCIP would. - IERC20(token).approve(address(s_sender), type(uint).max); - - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(address(s_sender)), - data: "", - tokenAmounts: destTokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); - uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); - uint256 nativeFeeTokenBalanceBefore = OWNER.balance; - - s_sender.ccipSend{value: feeTokenAmount}({ - destChainSelector: DEST_CHAIN_SELECTOR, - tokenAmounts: destTokenAmounts, - data: "", - feeToken: address(0) - }); - - // Assert that native fees are paid successfully and tokens are transferred - assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); - assertEq(OWNER.balance, nativeFeeTokenBalanceBefore - feeTokenAmount); - - } - - function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { - address token = address(s_sourceFeeToken); - uint256 amount = 111333333777; - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); - - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(address(s_sender)), - data: "FAKE_DATA", - tokenAmounts: destTokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); - - vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); - s_sender.ccipSend{value: feeTokenAmount / 2}({ - destChainSelector: DEST_CHAIN_SELECTOR, - tokenAmounts: destTokenAmounts, - data: "", - feeToken: address(0) - }); - } -} \ No newline at end of file +contract CCIPSenderTest is EVM2EVMOnRampSetup { + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageSucceeded(bytes32 indexed messageId); + event MessageRecovered(bytes32 indexed messageId); + + CCIPSender internal s_sender; + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_sender = new CCIPSender(address(s_sourceRouter)); + s_sender.enableChain(DEST_CHAIN_SELECTOR, abi.encode(address(s_sender)), ""); + } + + function test_ccipSend_withNonNativeFeetoken_andDestTokens() public { + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + IERC20(token).approve(address(s_sender), type(uint256).max); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "", + tokenAmounts: destTokenAmounts, + feeToken: s_sourceFeeToken, + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); + + s_sender.ccipSend({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(s_sourceFeeToken) + }); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - amount - feeTokenAmount); + } + + function test_ccipSend_with_NativeFeeToken_andDestTokens() public { + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + IERC20(token).approve(address(s_sender), type(uint256).max); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "", + tokenAmounts: destTokenAmounts, + feeToken: address(0), + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); + uint256 nativeFeeTokenBalanceBefore = OWNER.balance; + + s_sender.ccipSend{value: feeTokenAmount}({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(0) + }); + + // Assert that native fees are paid successfully and tokens are transferred + assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); + assertEq(OWNER.balance, nativeFeeTokenBalanceBefore - feeTokenAmount); + } + + function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "FAKE_DATA", + tokenAmounts: destTokenAmounts, + feeToken: address(0), + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + + vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); + s_sender.ccipSend{value: feeTokenAmount / 2}({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(0) + }); + } +} diff --git a/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol index b7f6e6100b..77649f5c7a 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; -import {PingPongDemo} from "../../production-examples/PingPongDemo.sol"; import {Client} from "../../libraries/Client.sol"; +import {PingPongDemo} from "../../production-examples/PingPongDemo.sol"; import "../onRamp/EVM2EVMOnRampSetup.t.sol"; // setup @@ -24,7 +24,7 @@ contract PingPongDappSetup is EVM2EVMOnRampSetup { // Fund the contract with LINK tokens s_feeToken.transfer(address(s_pingPong), fundingAmount); - IERC20(s_feeToken).approve(address(s_pingPong), type(uint).max); + IERC20(s_feeToken).approve(address(s_pingPong), type(uint256).max); } } @@ -60,7 +60,6 @@ contract PingPong_example_startPingPong is PingPongDappSetup { }); message.messageId = Internal._hash(message, s_metadataHash); - vm.expectEmit(); emit PingPongDemo.Ping(pingPongNumber); From e4d62099e3d532a902cfcdea1719860677328361 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 19 Jun 2024 10:59:20 -0400 Subject: [PATCH 06/31] fill in coverage gaps and fix devrel feedback --- contracts/gas-snapshots/ccip.gas-snapshot | 1289 +++++++++-------- .../ccip/production-examples/CCIPClient.sol | 67 +- .../production-examples/CCIPClientBase.sol | 6 + .../CCIPReceiverWithACK.sol | 41 +- .../ccip/production-examples/CCIPSender.sol | 8 +- .../production-examples/CCIPClientTest.t.sol | 216 +++ .../CCIPReceiverTest.t.sol | 13 + .../CCIPReceiverWithAckTest.t.sol | 16 +- .../production-examples/CCIPSenderTest.t.sol | 31 +- 9 files changed, 1002 insertions(+), 685 deletions(-) create mode 100644 contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 259bf2a517..8d30dfbc95 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -5,402 +5,409 @@ ARMProxyStandaloneTest:test_SetARMzero() (gas: 12144) ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 50373) ARMProxyTest:test_ARMIsBlessed_Success() (gas: 51621) ARMProxyTest:test_ARMIsCursed_Success() (gas: 52689) -AggregateTokenLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 19623) -AggregateTokenLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 21208) -AggregateTokenLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16403) -AggregateTokenLimiter__rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18306) -AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 26920) -AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19691) -AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 40911) -AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15353) -AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10531) -AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13047) -AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 18989) -AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17479) -AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30062) -AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32071) -BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 26415) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55133) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243563) -BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 23907) -BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27582) -BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55103) -BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241429) -BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17633) -BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 26218) -BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 55608) -BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 110324) -BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 26415) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55133) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243589) -BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientExample_sanity:test_Examples() (gas: 2132982) -CCIPReceiverTest:test_HappyPath_Success() (gas: 191836) -CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426491) -CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430334) +AggregateTokenLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 23709) +AggregateTokenLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 25663) +AggregateTokenLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 20854) +AggregateTokenLimiter__rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 19835) +AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 31944) +AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 23227) +AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 55032) +AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 17640) +AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 11188) +AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13880) +AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 20448) +AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 19396) +AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 38776) +AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 41521) +BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31794) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60751) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 293783) +BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 28207) +BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31400) +BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60751) +BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 291287) +BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 20610) +BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 31794) +BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 62977) +BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 119582) +BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31794) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60751) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 293809) +BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 28542) +CCIPClientExample_sanity:test_Examples() (gas: 3197070) +CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 332345) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 346013) +CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 84106) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 239971) +CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 549201) +CCIPReceiverTest:test_HappyPath_Success() (gas: 191835) +CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426492) +CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430352) CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195877) CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422996) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 52809) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 329625) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435480) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2380833) -CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72525) -CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 83896) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 331851) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 369012) -CommitStore_constructor:test_Constructor_Success() (gas: 3113994) -CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 74815) -CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28693) -CommitStore_report:test_InvalidInterval_Revert() (gas: 28633) -CommitStore_report:test_InvalidRootRevert() (gas: 27866) -CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 55389) -CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 61208) -CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 55387) -CommitStore_report:test_Paused_Revert() (gas: 21259) -CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 86378) -CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56272) -CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 64015) -CommitStore_report:test_StaleReportWithRoot_Success() (gas: 119320) -CommitStore_report:test_Unhealthy_Revert() (gas: 44725) -CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 102844) -CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 27649) -CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11325) -CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 140403) -CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37263) -CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37399) -CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 127733) -CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11047) -CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 16626) -CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11046) -CommitStore_verify:test_Blessed_Success() (gas: 96260) -CommitStore_verify:test_NotBlessed_Success() (gas: 58781) -CommitStore_verify:test_Paused_Revert() (gas: 18496) -CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) -DefensiveExampleTest:test_Recovery() (gas: 424253) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1064563) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 409685) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 145611) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12420) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreAlreadyInUse_Revert() (gas: 45053) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreMismatchingOnRamp_Revert() (gas: 45088) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRampAndPrevOffRamp_Revert() (gas: 140669) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 140358) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevOffRamp_Revert() (gas: 140528) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 133961) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 63990) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 13026) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 286471) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 231876) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 157405) -EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 184928) -EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 142242) -EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 530985) -EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10418) -EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 17138) -EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5969142) -EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 144277) -EVM2EVMMultiOffRamp_execute:test_DisabledSourceChain_Revert() (gas: 37423) -EVM2EVMMultiOffRamp_execute:test_EmptyReport_Revert() (gas: 21734) -EVM2EVMMultiOffRamp_execute:test_InvalidMessageId_Revert() (gas: 41735) -EVM2EVMMultiOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 454821) -EVM2EVMMultiOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 51703) -EVM2EVMMultiOffRamp_execute:test_MessageTooLarge_Revert() (gas: 160327) -EVM2EVMMultiOffRamp_execute:test_MismatchingOnRampAddress_Revert() (gas: 44560) -EVM2EVMMultiOffRamp_execute:test_MismatchingSourceChainSelector_Revert() (gas: 41649) -EVM2EVMMultiOffRamp_execute:test_NonExistingSourceChain_Revert() (gas: 37638) -EVM2EVMMultiOffRamp_execute:test_ReceiverError_Success() (gas: 176646) -EVM2EVMMultiOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 189942) -EVM2EVMMultiOffRamp_execute:test_RootNotCommitted_Revert() (gas: 46468) -EVM2EVMMultiOffRamp_execute:test_RouterYULCall_Revert() (gas: 412640) -EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokensOtherChain_Success() (gas: 241122) -EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 188632) -EVM2EVMMultiOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 257609) -EVM2EVMMultiOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 124915) -EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 397671) -EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 62202) -EVM2EVMMultiOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 59646) -EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 539702) -EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 475955) -EVM2EVMMultiOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35823) -EVM2EVMMultiOffRamp_execute:test_UnhealthySingleChainCurse_Revert() (gas: 529388) -EVM2EVMMultiOffRamp_execute:test_Unhealthy_Revert() (gas: 526973) -EVM2EVMMultiOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 71735) -EVM2EVMMultiOffRamp_execute:test_WithCurseOnAnotherSourceChain_Success() (gas: 494162) -EVM2EVMMultiOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 155593) -EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20638) -EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 261016) -EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20220) -EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 206630) -EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48744) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48251) -EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 247691) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 247409) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 299590) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 280074) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249177) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237259) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 6174587) -EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 142578) -EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3607928) -EVM2EVMMultiOffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 118398) -EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 87335) -EVM2EVMMultiOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 503492) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 205538) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 28244) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchMultipleReports_Revert() (gas: 160660) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 79950) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 28720) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 208307) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithMultiReportGasOverride_Success() (gas: 652700) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithPartialMessages_Success() (gas: 295113) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 207711) -EVM2EVMMultiOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2339173) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnOnRampAddress_Success() (gas: 10983) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnSourceChain_Success() (gas: 11036) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHash_Success() (gas: 9146) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140176) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 167679) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 32041) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 28420) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 64933) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 50982) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 72413) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 198135) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 151537) -EVM2EVMMultiOffRamp_report:test_IncorrectArrayType_Revert() (gas: 10026) -EVM2EVMMultiOffRamp_report:test_LargeBatch_Success() (gas: 1489143) -EVM2EVMMultiOffRamp_report:test_MultipleReports_Success() (gas: 232122) -EVM2EVMMultiOffRamp_report:test_NonArray_Revert() (gas: 22751) -EVM2EVMMultiOffRamp_report:test_SingleReport_Success() (gas: 139874) -EVM2EVMMultiOffRamp_report:test_ZeroReports_Revert() (gas: 9850) -EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40324) -EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38510) -EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 141645) -EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 219925) -EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 228582) -EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 314606) -EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 293615) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16208) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigNewPrevOnRampOnExistingChain_Revert() (gas: 29352) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput() (gas: 12405) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 166139) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() (gas: 194697) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkTokenEqAddressZero_Revert() (gas: 190277) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 192535) -EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 5894971) -EVM2EVMMultiOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 34293) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 152632) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 154658) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 161011) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 152247) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 61482) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 61744) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 27967) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 27906) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 86435) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 34950) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29652) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 108295) -EVM2EVMMultiOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 23070) -EVM2EVMMultiOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 248801) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 40229) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25916) -EVM2EVMMultiOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59599) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 191397) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 135213) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 162246) -EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3621455) -EVM2EVMMultiOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30855) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 44218) -EVM2EVMMultiOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 129149) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 545795) -EVM2EVMMultiOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 92274) -EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 121091) -EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 12002) -EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 24010) -EVM2EVMMultiOnRamp_getFee:test_EmptyMessage_Success() (gas: 77414) -EVM2EVMMultiOnRamp_getFee:test_HighGasMessage_Success() (gas: 233262) -EVM2EVMMultiOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 17099) -EVM2EVMMultiOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95772) -EVM2EVMMultiOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 162349) -EVM2EVMMultiOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 20318) -EVM2EVMMultiOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 119983) -EVM2EVMMultiOnRamp_getFee:test_TooManyTokens_Revert() (gas: 18280) -EVM2EVMMultiOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 70936) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 32119) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 16171) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 36113) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 349738) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 133550) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 711741) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 160957) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 26995) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23318) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 57323) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44275) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 190545) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 143942) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 129795) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 219770) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 228427) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 314267) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 293451) -EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17118) -EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 150794) -EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5284412) -EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 141586) -EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21394) -EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36373) -EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51698) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 444512) -EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 46354) -EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152427) -EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101091) -EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 166940) -EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 179787) -EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41204) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 404614) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 161381) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 176738) -EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248687) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 116815) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 388142) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54147) -EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 134070) -EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52074) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 528397) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 466480) -EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35351) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 516386) -EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 63854) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 125298) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 145405) -EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20637) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 260882) -EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20264) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 206509) -EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48776) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48264) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 295086) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 72666) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 235646) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 284275) -EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 265224) -EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 231817) -EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 133871) -EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 39495) -EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213578) -EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 487875) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 190831) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25884) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43447) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25964) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 193065) -EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 192526) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 1968764) -EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8893) -EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40302) -EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38488) -EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 144043) -EVM2EVMOffRamp_updateRateLimitTokens:test_NonOwner_Revert() (gas: 16755) -EVM2EVMOffRamp_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 161216) -EVM2EVMOffRamp_updateRateLimitTokens:test_UpdateRateLimitTokens_Success() (gas: 198747) -EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5653804) -EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 35786) -EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Success() (gas: 100231) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 118627) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 118669) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130405) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 138931) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 130085) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 40511) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 40706) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25537) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25323) -EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 85998) -EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36487) -EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29069) -EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107552) -EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22661) -EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 226519) -EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 56550) -EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25507) -EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59124) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182698) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 178301) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 137645) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3597819) -EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30191) -EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43322) -EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 109497) -EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 335657) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 112600) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72556) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 147980) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 190833) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 122085) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 95415) -EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 21021) -EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 21401) -EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 78556) -EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 234404) -EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16737) -EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95293) -EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 161424) -EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24115) -EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 118998) -EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 19924) -EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 66455) -EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460) -EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 37609) -EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 47351) -EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 35157) -EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 30434) -EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 134217) -EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15238) -EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 30242) -EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 23364) -EVM2EVMOnRamp_getTokenTransferCost:test_ValidatedPriceStaleness_Revert() (gas: 45576) -EVM2EVMOnRamp_getTokenTransferCost:test_WETHTokenBpsFee_Success() (gas: 41127) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 30287) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40669) -EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29660) -EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32615) -EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 134879) -EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143092) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29089) -EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127459) -EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133360) -EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146371) -EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 140962) -EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 297851) -EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15324) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 46083) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 22073) -EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 57382) -EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13482) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16467) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14020) -EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61788) -EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 469462) -EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57290) -EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14683) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 84820) -EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60696) -EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 173721) -EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 190364) -EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53631) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14453) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14229) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 84025) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17321) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83281) -EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15293) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272276) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53472) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12856) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18808) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 53004) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 332255) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435492) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2511735) +CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72547) +CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 81734) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 334866) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 223788) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 370570) +CommitStore_constructor:test_Constructor_Success() (gas: 4405986) +CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 87008) +CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 33012) +CommitStore_report:test_InvalidInterval_Revert() (gas: 32908) +CommitStore_report:test_InvalidRootRevert() (gas: 31664) +CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 63307) +CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 72867) +CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 63328) +CommitStore_report:test_Paused_Revert() (gas: 22402) +CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 97004) +CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60147) +CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 72497) +CommitStore_report:test_StaleReportWithRoot_Success() (gas: 139699) +CommitStore_report:test_Unhealthy_Revert() (gas: 46984) +CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 121708) +CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 32353) +CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 12082) +CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 168757) +CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 44708) +CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 44671) +CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 148974) +CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11970) +CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 17646) +CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11969) +CommitStore_verify:test_Blessed_Success() (gas: 108857) +CommitStore_verify:test_NotBlessed_Success() (gas: 66607) +CommitStore_verify:test_Paused_Revert() (gas: 19843) +CommitStore_verify:test_TooManyLeaves_Revert() (gas: 85894) +DefensiveExampleTest:test_HappyPath_Success() (gas: 247055) +DefensiveExampleTest:test_Recovery() (gas: 483144) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1424090) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 445794) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 158045) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 13428) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreAlreadyInUse_Revert() (gas: 50945) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreMismatchingOnRamp_Revert() (gas: 50893) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRampAndPrevOffRamp_Revert() (gas: 150703) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 150311) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevOffRamp_Revert() (gas: 150603) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 150566) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 68364) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15414) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 360240) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 305290) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 194051) +EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 238856) +EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 170178) +EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 690562) +EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 12011) +EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 20621) +EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 8427548) +EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 153762) +EVM2EVMMultiOffRamp_execute:test_DisabledSourceChain_Revert() (gas: 46961) +EVM2EVMMultiOffRamp_execute:test_EmptyReport_Revert() (gas: 24768) +EVM2EVMMultiOffRamp_execute:test_InvalidMessageId_Revert() (gas: 52977) +EVM2EVMMultiOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 564421) +EVM2EVMMultiOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 65439) +EVM2EVMMultiOffRamp_execute:test_MessageTooLarge_Revert() (gas: 184814) +EVM2EVMMultiOffRamp_execute:test_MismatchingOnRampAddress_Revert() (gas: 58571) +EVM2EVMMultiOffRamp_execute:test_MismatchingSourceChainSelector_Revert() (gas: 52841) +EVM2EVMMultiOffRamp_execute:test_NonExistingSourceChain_Revert() (gas: 47363) +EVM2EVMMultiOffRamp_execute:test_ReceiverError_Success() (gas: 208422) +EVM2EVMMultiOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 230128) +EVM2EVMMultiOffRamp_execute:test_RootNotCommitted_Revert() (gas: 59634) +EVM2EVMMultiOffRamp_execute:test_RouterYULCall_Revert() (gas: 589335) +EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokensOtherChain_Success() (gas: 294306) +EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 240267) +EVM2EVMMultiOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 303543) +EVM2EVMMultiOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 146696) +EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 484648) +EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 78704) +EVM2EVMMultiOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 73966) +EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 672752) +EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 589533) +EVM2EVMMultiOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 45501) +EVM2EVMMultiOffRamp_execute:test_UnhealthySingleChainCurse_Revert() (gas: 687062) +EVM2EVMMultiOffRamp_execute:test_Unhealthy_Revert() (gas: 684131) +EVM2EVMMultiOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 101093) +EVM2EVMMultiOffRamp_execute:test_WithCurseOnAnotherSourceChain_Success() (gas: 620009) +EVM2EVMMultiOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 190864) +EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 26592) +EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 299985) +EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 26164) +EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 241583) +EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 61135) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 60267) +EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 299445) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 299991) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 379816) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 352542) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 332448) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 317987) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 8650901) +EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 168124) +EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 5663582) +EVM2EVMMultiOffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 148228) +EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 111564) +EVM2EVMMultiOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 707649) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 259665) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 39022) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchMultipleReports_Revert() (gas: 267050) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 127928) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 39497) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 261664) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithMultiReportGasOverride_Success() (gas: 883156) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithPartialMessages_Success() (gas: 390497) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 260930) +EVM2EVMMultiOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3541490) +EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnOnRampAddress_Success() (gas: 14260) +EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnSourceChain_Success() (gas: 14470) +EVM2EVMMultiOffRamp_metadataHash:test_MetadataHash_Success() (gas: 11030) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 163927) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 196543) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 40223) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 36106) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 81222) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 62265) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 90042) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 237653) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 183877) +EVM2EVMMultiOffRamp_report:test_IncorrectArrayType_Revert() (gas: 10928) +EVM2EVMMultiOffRamp_report:test_LargeBatch_Success() (gas: 2161853) +EVM2EVMMultiOffRamp_report:test_MultipleReports_Success() (gas: 303079) +EVM2EVMMultiOffRamp_report:test_NonArray_Revert() (gas: 28939) +EVM2EVMMultiOffRamp_report:test_SingleReport_Success() (gas: 165433) +EVM2EVMMultiOffRamp_report:test_ZeroReports_Revert() (gas: 10722) +EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 48007) +EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 46657) +EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 181613) +EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 263732) +EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 273905) +EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 416761) +EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 350816) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 20590) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigNewPrevOnRampOnExistingChain_Revert() (gas: 33708) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput() (gas: 13435) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 203174) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() (gas: 226186) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkTokenEqAddressZero_Revert() (gas: 221756) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 223945) +EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 8702407) +EVM2EVMMultiOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 39044) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 170573) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 172370) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 183089) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 169811) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 67001) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 67429) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 31644) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 31350) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 96406) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 39554) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 34183) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 120623) +EVM2EVMMultiOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 26215) +EVM2EVMMultiOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 288554) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 45780) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 29271) +EVM2EVMMultiOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 69570) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 244605) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146316) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 179881) +EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 5207680) +EVM2EVMMultiOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 37549) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 48298) +EVM2EVMMultiOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 139851) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 598599) +EVM2EVMMultiOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 100330) +EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 149822) +EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 15820) +EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 34512) +EVM2EVMMultiOnRamp_getFee:test_EmptyMessage_Success() (gas: 108818) +EVM2EVMMultiOnRamp_getFee:test_HighGasMessage_Success() (gas: 280215) +EVM2EVMMultiOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 20261) +EVM2EVMMultiOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 106664) +EVM2EVMMultiOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 260955) +EVM2EVMMultiOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24836) +EVM2EVMMultiOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 184409) +EVM2EVMMultiOnRamp_getFee:test_TooManyTokens_Revert() (gas: 23582) +EVM2EVMMultiOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 91717) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 35584) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 19574) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 42494) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 417249) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 156501) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 854100) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 189054) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 35146) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 30985) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 72644) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 54735) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 229024) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 175249) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 154141) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 263600) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 273773) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 416452) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 350686) +EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 20656) +EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 159036) +EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 7392808) +EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 148969) +EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 24316) +EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 47276) +EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 67188) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 552518) +EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 59660) +EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 175734) +EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 137785) +EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 197219) +EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 218417) +EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 53906) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 580157) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 214542) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 226493) +EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 293592) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 138053) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 473481) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 69050) +EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 162419) +EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 65780) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 659912) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 579482) +EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 45041) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 672734) +EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 92115) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 161308) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 179424) +EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 26605) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 299855) +EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 26177) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 241451) +EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 61148) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 60280) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 350246) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 98266) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 287090) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 362055) +EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 334499) +EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 311656) +EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 158895) +EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 43453) +EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 4982300) +EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 103869) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 688151) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 240997) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 35590) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 64491) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 35379) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 242418) +EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 241809) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3109700) +EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 10218) +EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 47985) +EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 46635) +EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 185260) +EVM2EVMOffRamp_updateRateLimitTokens:test_NonOwner_Revert() (gas: 25284) +EVM2EVMOffRamp_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 169745) +EVM2EVMOffRamp_updateRateLimitTokens:test_UpdateRateLimitTokens_Success() (gas: 206926) +EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 8041122) +EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 40226) +EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Success() (gas: 115237) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 140777) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 140775) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 148048) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 160784) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 147373) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 45557) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 45873) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 29048) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 28690) +EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 95681) +EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 40758) +EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 33265) +EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 119353) +EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 25727) +EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 265528) +EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 64856) +EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 28783) +EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 68824) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 250211) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 232440) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 154865) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 5181980) +EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 36477) +EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 46948) +EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 119802) +EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 383061) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 123227) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 80148) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 171393) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 234472) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 150393) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 111736) +EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 29989) +EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 30863) +EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 108580) +EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 279977) +EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 19553) +EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 105758) +EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 258681) +EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 28360) +EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 181837) +EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 24874) +EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 86491) +EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) +EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 44581) +EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 58708) +EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 45268) +EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 40077) +EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 215348) +EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 17641) +EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 39727) +EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 26972) +EVM2EVMOnRamp_getTokenTransferCost:test_ValidatedPriceStaleness_Revert() (gas: 52972) +EVM2EVMOnRamp_getTokenTransferCost:test_WETHTokenBpsFee_Success() (gas: 51897) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 39772) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 51832) +EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 38618) +EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 36639) +EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 145985) +EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 157682) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 32474) +EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 135093) +EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 141798) +EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 161209) +EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 155499) +EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 329288) +EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15908) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 54188) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 29678) +EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 73220) +EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14450) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 17652) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14974) +EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 67996) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 552173) +EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 61806) +EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 16566) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 97293) +EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 64585) +EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 185506) +EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 415528) +EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 58119) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 17738) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 15497) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 117544) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 18746) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 93019) +EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 16423) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 327399) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 58705) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 13702) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 103814) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 54732) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 21881) @@ -422,94 +429,94 @@ EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrit EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 23796) EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 34674) EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 36305) -LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11058) -LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35097) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10970) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18036) -LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3248818) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3245195) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 11358) -LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17135) -LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 69142) -LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 17319) -LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 12027) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60025) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11355) -LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3001716) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30016) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79992) -LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59474) -LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 2998137) -LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11358) -LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 61917) -LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 55833) -LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 224959) -LockReleaseTokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17102) -LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 69075) -LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 17297) -LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11057) -LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35140) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 10992) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 17926) -LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11962) -LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60025) -LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11355) +LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 12033) +LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 36772) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 11968) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 19761) +LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 5048447) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 5044318) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 12661) +LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 19578) +LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 80020) +LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 20014) +LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 14853) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64803) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) +LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 4676497) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 34104) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 91362) +LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 65134) +LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 4672391) +LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 12639) +LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 70664) +LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 63066) +LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 274584) +LockReleaseTokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 19556) +LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 79998) +LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 19992) +LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 12055) +LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 36838) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11990) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 19651) +LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 14766) +LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64785) +LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) MerkleMultiProofTest:test_CVE_2023_34459() (gas: 6372) MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 4019) MerkleMultiProofTest:test_MerkleRoot256() (gas: 668330) MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 4074) MerkleMultiProofTest:test_SpecSync_gas() (gas: 49338) -MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 33965) -MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60758) -MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126294) -MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 63302) -MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 43853) -MultiAggregateRateLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 19623) -MultiAggregateRateLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 21208) -MultiAggregateRateLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16403) -MultiAggregateRateLimiter__rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18306) -MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 26920) -MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19691) -MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 40911) -MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15353) -MultiAggregateRateLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10531) -MultiAggregateRateLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13047) -MultiAggregateRateLimiter_setAdmin:test_Owner_Success() (gas: 18989) -MultiAggregateRateLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17479) -MultiAggregateRateLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30062) -MultiAggregateRateLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32071) -MultiCommitStore_applySourceChainConfigUpdates:test_InvalidSourceChainConfig_Revert() (gas: 29592) -MultiCommitStore_applySourceChainConfigUpdates:test_OnlyOwner_Revert() (gas: 12743) -MultiCommitStore_constructor:test_Constructor_Failure() (gas: 316394) -MultiCommitStore_constructor:test_Constructor_Success() (gas: 3407009) -MultiCommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 101519) -MultiCommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 34518) -MultiCommitStore_report:test_InvalidInterval_Revert() (gas: 32755) -MultiCommitStore_report:test_InvalidRootRevert() (gas: 31855) -MultiCommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 62667) -MultiCommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 67143) -MultiCommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 62665) -MultiCommitStore_report:test_Paused_Revert() (gas: 38331) -MultiCommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 113183) -MultiCommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60786) -MultiCommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 71295) -MultiCommitStore_report:test_SourceChainNotEnabled_Revert() (gas: 32131) -MultiCommitStore_report:test_StaleReportWithRoot_Success() (gas: 127903) -MultiCommitStore_report:test_Unhealthy_Revert() (gas: 50684) -MultiCommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 128252) -MultiCommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 17799) -MultiCommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11409) -MultiCommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 137048) -MultiCommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37263) -MultiCommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37399) -MultiCommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 131200) -MultiCommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11047) -MultiCommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 33700) -MultiCommitStore_verify:test_Blessed_Success() (gas: 101669) -MultiCommitStore_verify:test_NotBlessedWrongChainSelector_Success() (gas: 103743) -MultiCommitStore_verify:test_NotBlessed_Success() (gas: 64090) -MultiCommitStore_verify:test_Paused_Revert() (gas: 35772) -MultiCommitStore_verify:test_TooManyLeaves_Revert() (gas: 36985) +MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 37132) +MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 64034) +MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 135207) +MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 68119) +MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 48343) +MultiAggregateRateLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 23709) +MultiAggregateRateLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 25663) +MultiAggregateRateLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 20854) +MultiAggregateRateLimiter__rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 19835) +MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 31944) +MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 23227) +MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 55032) +MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 17640) +MultiAggregateRateLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 11188) +MultiAggregateRateLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13880) +MultiAggregateRateLimiter_setAdmin:test_Owner_Success() (gas: 20448) +MultiAggregateRateLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 19396) +MultiAggregateRateLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 38776) +MultiAggregateRateLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 41521) +MultiCommitStore_applySourceChainConfigUpdates:test_InvalidSourceChainConfig_Revert() (gas: 36408) +MultiCommitStore_applySourceChainConfigUpdates:test_OnlyOwner_Revert() (gas: 14849) +MultiCommitStore_constructor:test_Constructor_Failure() (gas: 336501) +MultiCommitStore_constructor:test_Constructor_Success() (gas: 4986622) +MultiCommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 112928) +MultiCommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 41870) +MultiCommitStore_report:test_InvalidInterval_Revert() (gas: 38299) +MultiCommitStore_report:test_InvalidRootRevert() (gas: 36783) +MultiCommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 69287) +MultiCommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 76388) +MultiCommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 69308) +MultiCommitStore_report:test_Paused_Revert() (gas: 39480) +MultiCommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 127193) +MultiCommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 65793) +MultiCommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 82830) +MultiCommitStore_report:test_SourceChainNotEnabled_Revert() (gas: 37359) +MultiCommitStore_report:test_StaleReportWithRoot_Success() (gas: 153425) +MultiCommitStore_report:test_Unhealthy_Revert() (gas: 56262) +MultiCommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 149222) +MultiCommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 21337) +MultiCommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 12164) +MultiCommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 166019) +MultiCommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 44708) +MultiCommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 44671) +MultiCommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 147985) +MultiCommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11970) +MultiCommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 34646) +MultiCommitStore_verify:test_Blessed_Success() (gas: 116132) +MultiCommitStore_verify:test_NotBlessedWrongChainSelector_Success() (gas: 118311) +MultiCommitStore_verify:test_NotBlessed_Success() (gas: 73792) +MultiCommitStore_verify:test_Paused_Revert() (gas: 37291) +MultiCommitStore_verify:test_TooManyLeaves_Revert() (gas: 86266) MultiOCR3Base_setOCR3Configs:test_RepeatAddress_Revert() (gas: 91944) MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 560803) MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 330401) @@ -555,54 +562,54 @@ OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 58490) OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 27448) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 45597) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 23593) -OnRampTokenPoolReentrancy:test_Success() (gas: 382249) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151319) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 180748) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17789) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 194742) -PingPong_plumbing:test_Pausing_Success() (gas: 17803) -PingPong_startPingPong:test_StartPingPong_Success() (gas: 178914) -PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) -PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) -PriceRegistry_applyPriceUpdatersUpdates:test_ApplyPriceUpdaterUpdates_Success() (gas: 82654) -PriceRegistry_applyPriceUpdatersUpdates:test_OnlyCallableByOwner_Revert() (gas: 12624) -PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67332) -PriceRegistry_constructor:test_Setup_Success() (gas: 1868487) -PriceRegistry_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 72964) -PriceRegistry_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 31054) -PriceRegistry_convertTokenAmount:test_StaleFeeToken_Revert() (gas: 36931) -PriceRegistry_convertTokenAmount:test_StaleLinkToken_Revert() (gas: 33954) -PriceRegistry_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 70558) -PriceRegistry_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 16838) -PriceRegistry_getTokenAndGasPrices:test_StaleTokenPrice_Revert() (gas: 32343) -PriceRegistry_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16140) -PriceRegistry_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 45707) -PriceRegistry_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 62174) -PriceRegistry_getTokenPrices:test_GetTokenPrices_Success() (gas: 84717) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 2094577) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 2094557) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 2074676) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 2094396) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 2094535) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 2094347) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 62042) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 61989) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 61129) -PriceRegistry_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 2093891) -PriceRegistry_getValidatedTokenPrice:test_StaleFeeToken_Revert() (gas: 19511) -PriceRegistry_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 109043) -PriceRegistry_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 13858) -PriceRegistry_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 2092591) -PriceRegistry_updatePrices:test_OnlyCallableByUpdaterOrOwner_Revert() (gas: 14051) -PriceRegistry_updatePrices:test_OnlyGasPrice_Success() (gas: 23484) -PriceRegistry_updatePrices:test_OnlyTokenPrice_Success() (gas: 30495) -PriceRegistry_updatePrices:test_UpdateMultiplePrices_Success() (gas: 151016) -PriceRegistry_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50615) -PriceRegistry_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63624) -PriceRegistry_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 19976) -PriceRegistry_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 89016) -PriceRegistry_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 50865) -PriceRegistry_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12340) +OnRampTokenPoolReentrancy:test_Success() (gas: 498702) +PingPong_ccipReceive:test_CcipReceive_Success() (gas: 174376) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308399) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17899) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 232502) +PingPong_plumbing:test_Pausing_Success() (gas: 19122) +PingPong_startPingPong:test_StartPingPong_Success() (gas: 213447) +PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 91666) +PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 14424) +PriceRegistry_applyPriceUpdatersUpdates:test_ApplyPriceUpdaterUpdates_Success() (gas: 91323) +PriceRegistry_applyPriceUpdatersUpdates:test_OnlyCallableByOwner_Revert() (gas: 14490) +PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 70798) +PriceRegistry_constructor:test_Setup_Success() (gas: 2929422) +PriceRegistry_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 80038) +PriceRegistry_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 36081) +PriceRegistry_convertTokenAmount:test_StaleFeeToken_Revert() (gas: 42981) +PriceRegistry_convertTokenAmount:test_StaleLinkToken_Revert() (gas: 39399) +PriceRegistry_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 76518) +PriceRegistry_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 19223) +PriceRegistry_getTokenAndGasPrices:test_StaleTokenPrice_Revert() (gas: 37655) +PriceRegistry_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 17728) +PriceRegistry_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 50033) +PriceRegistry_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 69118) +PriceRegistry_getTokenPrices:test_GetTokenPrices_Success() (gas: 94783) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 3422580) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 3422537) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 3402679) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 3422373) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 3422498) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 3422292) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 68382) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 68216) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 66082) +PriceRegistry_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 3421724) +PriceRegistry_getValidatedTokenPrice:test_StaleFeeToken_Revert() (gas: 22010) +PriceRegistry_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 115683) +PriceRegistry_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 15409) +PriceRegistry_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 3419540) +PriceRegistry_updatePrices:test_OnlyCallableByUpdaterOrOwner_Revert() (gas: 15233) +PriceRegistry_updatePrices:test_OnlyGasPrice_Success() (gas: 27501) +PriceRegistry_updatePrices:test_OnlyTokenPrice_Success() (gas: 34882) +PriceRegistry_updatePrices:test_UpdateMultiplePrices_Success() (gas: 172375) +PriceRegistry_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 57323) +PriceRegistry_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 76423) +PriceRegistry_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 22336) +PriceRegistry_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 101464) +PriceRegistry_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 57329) +PriceRegistry_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 13298) RMN_constructor:test_Constructor_Success() (gas: 73405) RMN_ownerUnbless:test_Unbless_Success() (gas: 100861) RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterRecovery() (gas: 293002) @@ -655,119 +662,119 @@ RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetC RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 141720) RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 22403) RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 141539) -Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89288) -Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10648508) -Router_applyRampUpdates:test_OnRampDisable() (gas: 55913) -Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12311) -Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 114300) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 201586) -Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 129182) -Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 216470) -Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 66439) -Router_ccipSend:test_InvalidMsgValue() (gas: 31992) -Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 68875) -Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 174414) -Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 56201) -Router_ccipSend:test_NativeFeeToken_Success() (gas: 173008) -Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 243384) -Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24778) -Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44692) -Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 175224) -Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 243794) -Router_constructor:test_Constructor_Success() (gas: 13074) -Router_getArmProxy:test_getArmProxy() (gas: 10561) -Router_getFee:test_GetFeeSupportedChain_Success() (gas: 46599) -Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17138) -Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460) -Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11316) -Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20261) -Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11159) -Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 422138) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 52437) -Router_routeMessage:test_AutoExec_Success() (gas: 42764) -Router_routeMessage:test_ExecutionEvent_Success() (gas: 158089) -Router_routeMessage:test_ManualExec_Success() (gas: 35410) -Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25167) -Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44669) -Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55600) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 421979) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20157) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 52047) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 45092) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12629) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 67056) -TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 11350) -TokenAdminRegistry_getPool:test_getPool_Success() (gas: 17603) -TokenAdminRegistry_getPools:test_getPools_Success() (gas: 39902) -TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 93605) -TokenAdminRegistry_isTokenSupportedOnRemoteChain:test_isTokenSupportedOnRemoteChain_Success() (gas: 31099) -TokenAdminRegistry_registerAdministrator:test_registerAdministrator_OnlyRegistryModule_Revert() (gas: 13237) -TokenAdminRegistry_registerAdministrator:test_registerAdministrator_Success() (gas: 93231) -TokenAdminRegistry_registerAdministrator:test_registerAdministrator__disableReRegistration_Revert() (gas: 95925) -TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_AlreadyRegistered_Revert() (gas: 89541) -TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_OnlyOwner_Revert() (gas: 14345) -TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_Success() (gas: 97519) -TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_ZeroAddress_Revert() (gas: 12710) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 12585) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 54545) -TokenAdminRegistry_setDisableReRegistration:test_setDisableReRegistration_Success() (gas: 34157) -TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 19214) -TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 18057) -TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36097) -TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30764) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18079) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 50351) -TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5881566) -TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 6151241) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6672064) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6856113) -TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 2114838) -TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12089) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23280) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177516) -TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23648) -TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8319) -TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24743) -TokenPool_applyChainUpdates:test_DisabledNonZeroRateLimit_Revert() (gas: 224004) -TokenPool_applyChainUpdates:test_InvalidRatelimitRate_Revert() (gas: 443888) -TokenPool_applyChainUpdates:test_NonExistentChain_Revert() (gas: 17559) -TokenPool_applyChainUpdates:test_OnlyCallableByOwner_Revert() (gas: 11385) -TokenPool_applyChainUpdates:test_Success() (gas: 395619) -TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70616) -TokenPool_constructor:test_immutableFields_Success() (gas: 20501) -TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 225682) -TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 230283) -TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 251040) -TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 303097) -TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 229974) -TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 214997) -TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 258095) -TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 14884) -TokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 12543) -TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15598) -TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13173) -TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 233639) -TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17109) -TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 136619) -TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 15919) -TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 245670) -TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16303) -TokenProxy_ccipSend:test_CcipSend_Success() (gas: 262076) -TokenProxy_constructor:test_Constructor() (gas: 13812) -TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16827) -TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12658) -TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15849) -TokenProxy_getFee:test_GetFee_Success() (gas: 87484) -USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 24960) -USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35394) -USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30137) -USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133168) -USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 430575) -USDCTokenPool_lockOrBurn:test_lockOrBurn_InvalidReceiver_Revert() (gas: 52688) -USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 70039) -USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50391) -USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 64670) -USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66150) -USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11333) -USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11942) \ No newline at end of file +Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 93496) +Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 12361570) +Router_applyRampUpdates:test_OnRampDisable() (gas: 65150) +Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 13275) +Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 134328) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 241086) +Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 152103) +Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 258841) +Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 80636) +Router_ccipSend:test_InvalidMsgValue() (gas: 35918) +Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 83448) +Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 210014) +Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 67795) +Router_ccipSend:test_NativeFeeToken_Success() (gas: 207770) +Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 272955) +Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 28707) +Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 48624) +Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 212313) +Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 287016) +Router_constructor:test_Constructor_Success() (gas: 14515) +Router_getArmProxy:test_getArmProxy() (gas: 11328) +Router_getFee:test_GetFeeSupportedChain_Success() (gas: 58121) +Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 20945) +Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) +Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 12807) +Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 21382) +Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 12776) +Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 603372) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 59811) +Router_routeMessage:test_AutoExec_Success() (gas: 52687) +Router_routeMessage:test_ExecutionEvent_Success() (gas: 183234) +Router_routeMessage:test_ManualExec_Success() (gas: 41795) +Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 28359) +Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 47836) +Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 11766) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 62339) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 568153) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 22129) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 60930) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 53318) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 14159) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 70315) +TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 12702) +TokenAdminRegistry_getPool:test_getPool_Success() (gas: 18693) +TokenAdminRegistry_getPools:test_getPools_Success() (gas: 48227) +TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 100704) +TokenAdminRegistry_isTokenSupportedOnRemoteChain:test_isTokenSupportedOnRemoteChain_Success() (gas: 35933) +TokenAdminRegistry_registerAdministrator:test_registerAdministrator_OnlyRegistryModule_Revert() (gas: 15289) +TokenAdminRegistry_registerAdministrator:test_registerAdministrator_Success() (gas: 97344) +TokenAdminRegistry_registerAdministrator:test_registerAdministrator__disableReRegistration_Revert() (gas: 101521) +TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_AlreadyRegistered_Revert() (gas: 93362) +TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_OnlyOwner_Revert() (gas: 16869) +TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_Success() (gas: 103741) +TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_ZeroAddress_Revert() (gas: 14314) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 14115) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 58261) +TokenAdminRegistry_setDisableReRegistration:test_setDisableReRegistration_Success() (gas: 40953) +TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 22042) +TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 20183) +TokenAdminRegistry_setPool:test_setPool_Success() (gas: 41191) +TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 35983) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 20292) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 57039) +TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 8748577) +TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 9165545) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 9687186) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 9885574) +TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 3260771) +TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 13369) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 26629) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 189373) +TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 25697) +TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8788) +TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 28144) +TokenPool_applyChainUpdates:test_DisabledNonZeroRateLimit_Revert() (gas: 234116) +TokenPool_applyChainUpdates:test_InvalidRatelimitRate_Revert() (gas: 478928) +TokenPool_applyChainUpdates:test_NonExistentChain_Revert() (gas: 21411) +TokenPool_applyChainUpdates:test_OnlyCallableByOwner_Revert() (gas: 12332) +TokenPool_applyChainUpdates:test_Success() (gas: 449692) +TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 74044) +TokenPool_constructor:test_immutableFields_Success() (gas: 23273) +TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 235207) +TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 239770) +TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 266182) +TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 313703) +TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 239062) +TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 229816) +TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 268288) +TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17310) +TokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 15148) +TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 17567) +TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 15292) +TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 243812) +TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 20582) +TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 161359) +TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 18599) +TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 292819) +TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 19019) +TokenProxy_ccipSend:test_CcipSend_Success() (gas: 312488) +TokenProxy_constructor:test_Constructor() (gas: 15309) +TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 20176) +TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 14693) +TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 18513) +TokenProxy_getFee:test_GetFee_Success() (gas: 121887) +USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 37526) +USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 40218) +USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 34558) +USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 147543) +USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 499187) +USDCTokenPool_lockOrBurn:test_lockOrBurn_InvalidReceiver_Revert() (gas: 59110) +USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 81154) +USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 58745) +USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 75981) +USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 74539) +USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 12298) +USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 14722) \ No newline at end of file diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol index a7a1fc0379..51984cbd92 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol @@ -12,6 +12,7 @@ contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; error InvalidConfig(); + error CannotAcknowledgeUnsentMessage(bytes32); /// @notice You can't import CCIPReceiver and Sender due to similar parents so functionality of CCIPSender is duplicated here constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} @@ -21,7 +22,7 @@ contract CCIPClient is CCIPReceiverWithACK { Client.EVMTokenAmount[] memory tokenAmounts, bytes memory data, address feeToken - ) public payable validChain(destChainSelector) { + ) public payable validChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: s_chains[destChainSelector], data: data, @@ -32,37 +33,67 @@ contract CCIPClient is CCIPReceiverWithACK { uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); - // TODO: Decide whether workflow should assume contract is funded with tokens to send already + bool sendingFeeTokenNormally; + for (uint256 i = 0; i < tokenAmounts.length; ++i) { // Transfer the tokens to pay for tokens in tokenAmounts - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); + // If they are sending the feeToken through, and its the same as the ack fee token, and also paying in it, then you don't need to approve + // it at all cause its already set as type(uint).max. You can't use safeIncreaseAllowance() either cause it will overflow the token allowance + if (tokenAmounts[i].token == feeToken && feeToken != address(0) && feeToken == address(s_feeToken)) { + sendingFeeTokenNormally = true; + IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), fee); + } // If they're not sending the fee token, then go ahead and approve - if (tokenAmounts[i].token != feeToken) { + else { IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); } - // If they are sending the feeToken through, and also paying in it, then approve the router for both tokenAmount and the fee() - else if (tokenAmounts[i].token == feeToken && feeToken != address(0)) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), fee); - IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount + fee); - } } - // If the user is paying in the fee token, and is NOT sending it through the bridge, then allowance() should be zero - // and we can send just transferFrom the sender and approve the router. This is because we only approve the router - // for the amount of tokens needed for this transaction, one at a time. - if (feeToken != address(0) && IERC20(feeToken).allowance(address(this), i_ccipRouter) == 0) { + // Since the fee token was already set in the ReceiverWithACK parent, we don't need to approve it to spend, only to ensure we have enough + // funds for the transfer + if (!sendingFeeTokenNormally && feeToken == address(s_feeToken) && feeToken != address(0)) { IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); - - // Use increaseAllowance in case the user is transfering the feeToken in tokenAmounts - IERC20(feeToken).safeApprove(i_ccipRouter, fee); } else if (feeToken == address(0) && msg.value < fee) { revert IRouterClient.InsufficientFeeTokenAmount(); } - bytes32 messageId = + messageId = IRouterClient(i_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); - emit MessageSent(messageId); + s_messageStatus[messageId] = CCIPReceiverWithACK.MessageStatus.SENT; + + // Since the message was outgoing, and not ACK, use bytes32(0) to reflect this + emit MessageSent(messageId, bytes32(0)); + + return messageId; + } + + /// CCIPReceiver processMessage to make easier to modify + /// @notice function requres that + function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { + (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); + + if (payload.messageType == MessageType.OUTGOING) { + // Insert Processing workflow here. + + // If the message was outgoing, then send an ack response. + _sendAck(message); + } else if (payload.messageType == MessageType.ACK) { + // Decode message into the magic-bytes and the messageId to ensure the message is encoded correctly + (bytes memory magicBytes, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); + + // Ensure Ack Message contains proper magic-bytes + if (keccak256(magicBytes) != keccak256(ACKMESSAGEMAGICBYTES)) revert InvalidMagicBytes(); + + // Make sure the ACK message was originally sent by this contract + if (s_messageStatus[messageId] != MessageStatus.SENT) revert CannotAcknowledgeUnsentMessage(messageId); + + // Mark the message has finalized from a proper ack-message. + s_messageStatus[messageId] = MessageStatus.ACKNOWLEDGED; + + emit MessageAckReceived(messageId); + } } } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol index 6261f9ba68..d16e3cdd03 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol @@ -4,11 +4,13 @@ import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.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 {Address} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.sol"; abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { using SafeERC20 for IERC20; + using Address for address; address internal immutable i_ccipRouter; @@ -59,6 +61,10 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { fallback() external payable {} receive() external payable {} + function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { + Address.sendValue(to, amount); + } + function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).safeTransfer(to, amount); } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol index 02c4965e56..5999ea958b 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol @@ -16,15 +16,17 @@ contract CCIPReceiverWithACK is CCIPReceiver { // Current feeToken IERC20 public s_feeToken; - bytes public constant ackMessageMagicBytes = "MESSAGE_ACKNOWLEDGED_"; + bytes public constant ACKMESSAGEMAGICBYTES = "MESSAGE_ACKNOWLEDGED_"; - mapping(bytes32 messageId => bool ackReceived) public s_messageAckReceived; + // mapping(bytes32 messageId => bool ackReceived) public s_messageAckReceived; + mapping(bytes32 messageId => MessageStatus status) public s_messageStatus; event MessageAckSent(bytes32 incomingMessageId); - event MessageSent(bytes32); + event MessageSent(bytes32 indexed incomingMessageId, bytes32 indexed ACKMessageId); event MessageAckReceived(bytes32); error InvalidMagicBytes(); + error MessageAlreadyAcknowledged(bytes32 messageId); event FeeTokenModified(address indexed oldToken, address indexed newToken); @@ -33,6 +35,12 @@ contract CCIPReceiverWithACK is CCIPReceiver { ACK } + enum MessageStatus { + QUIET, + SENT, + ACKNOWLEDGED + } + struct MessagePayload { bytes version; bytes data; @@ -97,40 +105,43 @@ contract CCIPReceiverWithACK is CCIPReceiver { Client.EVM2AnyMessage memory outgoingMessage = Client.EVM2AnyMessage({ receiver: incomingMessage.sender, - data: abi.encode(ackMessageMagicBytes, incomingMessage.messageId), + data: abi.encode(ACKMESSAGEMAGICBYTES, incomingMessage.messageId), tokenAmounts: tokenAmounts, - extraArgs: "", - feeToken: address(s_feeToken) // We leave the feeToken empty indicating we'll pay raw native. + extraArgs: s_extraArgsBytes[incomingMessage.sourceChainSelector], + feeToken: address(s_feeToken) }); uint256 feeAmount = IRouterClient(i_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? feeAmount : 0}( - incomingMessage.sourceChainSelector, outgoingMessage - ); + bytes32 ACKmessageId = IRouterClient(i_ccipRouter).ccipSend{ + value: address(s_feeToken) == address(0) ? feeAmount : 0 + }(incomingMessage.sourceChainSelector, outgoingMessage); - emit MessageAckSent(incomingMessage.messageId); - emit MessageSent(messageId); + emit MessageSent(incomingMessage.messageId, ACKmessageId); } - /// @notice overrides CCIPReceiver processMessage to make easier to modify + /// CCIPReceiver processMessage to make easier to modify + /// @notice Function does NOT require the status of an incoming ACK be "sent" because this implementation does not send, only receives function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); if (payload.messageType == MessageType.OUTGOING) { // Insert Processing workflow here. - // If the message was outgoin, then send an ack response. + // If the message was outgoing, then send an ack response. _sendAck(message); } else if (payload.messageType == MessageType.ACK) { // Decode message into the magic-bytes and the messageId to ensure the message is encoded correctly (bytes memory magicBytes, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); // Ensure Ack Message contains proper magic-bytes - if (keccak256(magicBytes) != keccak256(ackMessageMagicBytes)) revert InvalidMagicBytes(); + if (keccak256(magicBytes) != keccak256(ACKMESSAGEMAGICBYTES)) revert InvalidMagicBytes(); + + // Make sure the ACK message has not already been acknowledged + if (s_messageStatus[messageId] == MessageStatus.ACKNOWLEDGED) revert MessageAlreadyAcknowledged(messageId); // Mark the message has finalized from a proper ack-message. - s_messageAckReceived[messageId] = true; + s_messageStatus[messageId] = MessageStatus.ACKNOWLEDGED; emit MessageAckReceived(messageId); } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol index 6ad32923e9..aa2b98feff 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol @@ -35,7 +35,7 @@ contract CCIPSender is CCIPClientBase { function ccipSend( uint64 destChainSelector, - Client.EVMTokenAmount[] memory tokenAmounts, + Client.EVMTokenAmount[] calldata tokenAmounts, bytes calldata data, address feeToken ) public payable validChain(destChainSelector) returns (bytes32 messageId) { @@ -52,7 +52,7 @@ contract CCIPSender is CCIPClientBase { // TODO: Decide whether workflow should assume contract is funded with tokens to send already for (uint256 i = 0; i < tokenAmounts.length; ++i) { // Transfer the tokens to pay for tokens in tokenAmounts - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); // If they're not sending the fee token, then go ahead and approve if (tokenAmounts[i].token != feeToken) { @@ -60,7 +60,7 @@ contract CCIPSender is CCIPClientBase { } // If they are sending the feeToken through, and also paying in it, then approve the router for both tokenAmount and the fee() else if (tokenAmounts[i].token == feeToken && feeToken != address(0)) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), fee); + IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), fee); IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount + fee); } } @@ -79,5 +79,7 @@ contract CCIPSender is CCIPClientBase { IRouterClient(i_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); emit MessageSent(messageId); + + return messageId; } } diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol new file mode 100644 index 0000000000..1e67376f40 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IRouterClient} from "../../interfaces/IRouterClient.sol"; +import {CCIPClient} from "../../production-examples/CCIPClient.sol"; +import {CCIPReceiverWithACK} from "../../production-examples/CCIPClient.sol"; +import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientBase.sol"; + +import {Client} from "../../libraries/Client.sol"; +import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +contract CCIPClientTest is EVM2EVMOnRampSetup { + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageSucceeded(bytes32 indexed messageId); + event MessageRecovered(bytes32 indexed messageId); + event MessageSent(bytes32 indexed, bytes32 indexed); + event MessageAckSent(bytes32 incomingMessageId); + event MessageAckReceived(bytes32); + + CCIPClient internal s_sender; + uint64 internal destChainSelector = DEST_CHAIN_SELECTOR; + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_sender = new CCIPClient(address(s_sourceRouter), IERC20(s_sourceFeeToken)); + s_sender.enableChain(destChainSelector, abi.encode(address(s_sender)), ""); + + ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate({ + destChainSelector: destChainSelector, + sender: abi.encode(address(s_sender)) + }); + + s_sender.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); + } + + function test_ccipReceiveAndSendAck() public { + bytes32 messageId = keccak256("messageId"); + bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; + address token = address(s_sourceFeeToken); + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_sender), 1e24); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: "FAKE_DATA", + messageType: CCIPReceiverWithACK.MessageType.OUTGOING + }); + + Client.EVM2AnyMessage memory ackMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: abi.encode(s_sender.ACKMESSAGEMAGICBYTES(), messageId), + tokenAmounts: destTokenAmounts, + feeToken: s_sourceFeeToken, + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(destChainSelector, ackMessage); + + uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_sender)); + + vm.expectEmit(); + emit MessageSent(messageId, ackMessageId); + + s_sender.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_sender)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + // Check that fee token is properly subtracted from balance to pay for ack message + assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_sender)), receiverBalanceBefore - feeTokenAmount); + } + + function test_ccipSend_withNonNativeFeetoken_andNoDestTokens() public { + address token = address(s_sourceFeeToken); + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // Make sure we give the receiver contract enough tokens like CCIP would. + IERC20(token).approve(address(s_sender), type(uint256).max); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "", + tokenAmounts: destTokenAmounts, + feeToken: s_sourceFeeToken, + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); + + s_sender.ccipSend({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(s_sourceFeeToken) + }); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); + } + + function test_ccipSendAndReceiveAck_in_return() public { + address token = address(s_sourceFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + IERC20(token).approve(address(s_sender), type(uint256).max); + + bytes32 messageId = s_sender.ccipSend({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(s_sourceFeeToken) + }); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: abi.encode(s_sender.ACKMESSAGEMAGICBYTES(), messageId), + messageType: CCIPReceiverWithACK.MessageType.ACK + }); + + vm.expectEmit(); + emit MessageAckReceived(messageId); + + s_sender.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_sender)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + assertEq( + uint256(s_sender.s_messageStatus(messageId)), + uint256(CCIPReceiverWithACK.MessageStatus.ACKNOWLEDGED), + "Ack message was not properly received" + ); + } + + function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "FAKE_DATA", + tokenAmounts: destTokenAmounts, + feeToken: address(0), + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + + vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); + s_sender.ccipSend{value: feeTokenAmount / 2}({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(0) + }); + } + + function test_send_tokens_that_are_not_feeToken() public { + address token = s_sourceTokens[1]; + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + + IERC20(token).approve(address(s_sender), type(uint256).max); + IERC20(s_sourceFeeToken).approve(address(s_sender), type(uint256).max); + deal(token, address(this), 1e24); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "", + tokenAmounts: destTokenAmounts, + feeToken: s_sourceFeeToken, + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); + + s_sender.ccipSend({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(s_sourceFeeToken) + }); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); + } +} diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol index 5dd12eaf7e..3d83adbaa2 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol @@ -228,4 +228,17 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { }) ); } + + function test_withdraw_nativeToken_to_owner() public { + uint256 amount = 100 ether; + deal(address(s_receiver), amount); + + uint256 balanceBefore = OWNER.balance; + + vm.startPrank(OWNER); + + s_receiver.withdrawNativeToken(payable(OWNER), amount); + + assertEq(OWNER.balance, balanceBefore + amount); + } } diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol index 3d6b0f06e6..22a1f26658 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol @@ -13,7 +13,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { event MessageFailed(bytes32 indexed messageId, bytes reason); event MessageSucceeded(bytes32 indexed messageId); event MessageRecovered(bytes32 indexed messageId); - event MessageSent(bytes32); + event MessageSent(bytes32 indexed incomingmessageId, bytes32 indexed ackmessageId); event MessageAckSent(bytes32 incomingMessageId); event MessageAckReceived(bytes32); @@ -37,8 +37,8 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { function test_ccipReceive_and_respond_with_ack() public { bytes32 messageId = keccak256("messageId"); + bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; address token = address(s_sourceFeeToken); - uint256 amount = 111333333777; Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); // Make sure we give the receiver contract enough tokens like CCIP would. @@ -55,7 +55,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { Client.EVM2AnyMessage memory ackMessage = Client.EVM2AnyMessage({ receiver: abi.encode(address(s_receiver)), - data: abi.encode(s_receiver.ackMessageMagicBytes(), messageId), + data: abi.encode(s_receiver.ACKMESSAGEMAGICBYTES(), messageId), tokenAmounts: destTokenAmounts, feeToken: s_sourceFeeToken, extraArgs: "" @@ -66,7 +66,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)); vm.expectEmit(); - emit MessageAckSent(messageId); + emit MessageSent(messageId, ackMessageId); s_receiver.ccipReceive( Client.Any2EVMMessage({ @@ -91,7 +91,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ version: "", - data: abi.encode(s_receiver.ackMessageMagicBytes(), messageId), + data: abi.encode(s_receiver.ACKMESSAGEMAGICBYTES(), messageId), messageType: CCIPReceiverWithACK.MessageType.ACK }); @@ -108,7 +108,11 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { }) ); - assertTrue(s_receiver.s_messageAckReceived(messageId), "Ack message was not properly received"); + assertEq( + uint256(s_receiver.s_messageStatus(messageId)), + uint256(CCIPReceiverWithACK.MessageStatus.ACKNOWLEDGED), + "Ack message was not properly received" + ); } function test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() public { diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol index fa75d0f416..99213132d3 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol @@ -55,6 +55,35 @@ contract CCIPSenderTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - amount - feeTokenAmount); } + function test_ccipSend_withNonNativeFeetoken_andNoDestTokens() public { + address token = address(s_sourceFeeToken); + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + + // Make sure we give the receiver contract enough tokens like CCIP would. + IERC20(token).approve(address(s_sender), type(uint256).max); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(address(s_sender)), + data: "", + tokenAmounts: destTokenAmounts, + feeToken: s_sourceFeeToken, + extraArgs: "" + }); + + uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); + + s_sender.ccipSend({ + destChainSelector: DEST_CHAIN_SELECTOR, + tokenAmounts: destTokenAmounts, + data: "", + feeToken: address(s_sourceFeeToken) + }); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); + } + function test_ccipSend_with_NativeFeeToken_andDestTokens() public { address token = address(s_sourceFeeToken); uint256 amount = 111333333777; @@ -89,8 +118,6 @@ contract CCIPSenderTest is EVM2EVMOnRampSetup { } function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { - address token = address(s_sourceFeeToken); - uint256 amount = 111333333777; Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ From 4546faf9b8d5f51383cbd83a1f293735fc45c249 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 20 Jun 2024 10:37:47 -0400 Subject: [PATCH 07/31] fix headings, add typeAndVersion, move interface file, and other formatting --- contracts/gas-snapshots/ccip.gas-snapshot | 22 ++++----- .../interfaces/ICCIPClientBase.sol | 0 .../ccip/production-examples/CCIPClient.sol | 4 ++ .../production-examples/CCIPClientBase.sol | 29 ++++++------ .../ccip/production-examples/CCIPReceiver.sol | 34 ++++++++++---- .../CCIPReceiverWithACK.sol | 46 ++++++++++--------- .../ccip/production-examples/CCIPSender.sol | 4 ++ .../ccip/production-examples/PingPongDemo.sol | 26 +++++------ .../production-examples/CCIPClientTest.t.sol | 4 +- .../CCIPReceiverTest.t.sol | 2 +- .../CCIPReceiverWithAckTest.t.sol | 2 +- .../production-examples/CCIPSenderTest.t.sol | 2 +- 12 files changed, 102 insertions(+), 73 deletions(-) rename contracts/src/v0.8/ccip/{production-examples => }/interfaces/ICCIPClientBase.sol (100%) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 8d30dfbc95..a8cd7c4430 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -39,17 +39,17 @@ CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 332345) CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 346013) CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 84106) CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 239971) -CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 549201) -CCIPReceiverTest:test_HappyPath_Success() (gas: 191835) -CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426492) -CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430352) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195877) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422996) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18808) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 53004) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 332255) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435492) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2511735) +CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 551328) +CCIPReceiverTest:test_HappyPath_Success() (gas: 191871) +CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426569) +CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430405) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195931) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422998) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18764) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 53048) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 332299) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435470) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2527173) CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72547) CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 81734) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 334866) diff --git a/contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol b/contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol similarity index 100% rename from contracts/src/v0.8/ccip/production-examples/interfaces/ICCIPClientBase.sol rename to contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol index 51984cbd92..66735b5c89 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol @@ -17,6 +17,10 @@ contract CCIPClient is CCIPReceiverWithACK { /// @notice You can't import CCIPReceiver and Sender due to similar parents so functionality of CCIPSender is duplicated here constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} + function typeAndVersion() external pure virtual override returns (string memory) { + return "CCIPReceiverWithACK 1.0.0-dev"; + } + function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol index d16e3cdd03..1b7135bcb5 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol @@ -1,14 +1,15 @@ pragma solidity ^0.8.0; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; +import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.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 {Address} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; -import {ICCIPClientBase} from "./interfaces/ICCIPClientBase.sol"; +import {ICCIPClientBase} from "../interfaces/ICCIPClientBase.sol"; -abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { +abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVersion { using SafeERC20 for IERC20; using Address for address; @@ -23,9 +24,9 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { i_ccipRouter = router; } - ///////////////////////////////////////////////////////////////////// - // Router Management - ///////////////////////////////////////////////////////////////////// + // ================================================================ + // │ Router Management │ + // ================================================================ function getRouter() public view returns (address) { return i_ccipRouter; @@ -37,9 +38,9 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { _; } - ///////////////////////////////////////////////////////////////////// - // Sender/Receiver Management - ///////////////////////////////////////////////////////////////////// + // ================================================================ + // │ Sender/Receiver Management │ + // ================================================================ function updateApprovedSenders( approvedSenderUpdate[] calldata adds, @@ -54,9 +55,9 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { } } - ///////////////////////////////////////////////////////////////////// - // Fee Token Management - ///////////////////////////////////////////////////////////////////// + // ================================================================ + // │ Fee Token Management │ + // =============================================================== fallback() external payable {} receive() external payable {} @@ -69,9 +70,9 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator { IERC20(token).safeTransfer(to, amount); } - ///////////////////////////////////////////////////////////////////// - // Chain Management - ///////////////////////////////////////////////////////////////////// + // ================================================================ + // │ Chain Management │ + // ================================================================ function enableChain( uint64 chainSelector, diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol index 935be077d4..70f24b718f 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol @@ -38,6 +38,14 @@ contract CCIPReceiver is CCIPClientBase { constructor(address router) CCIPClientBase(router) {} + function typeAndVersion() external pure virtual returns (string memory) { + return "CCIPReceiver 1.0.0-dev"; + } + + // ================================================================ + // │ Incoming Message Processing | + // ================================================================ + /// @notice The entrypoint for the CCIP router to call. This function should /// never revert, all errors should be handled internally in this contract. /// @param message The message to process. @@ -80,15 +88,9 @@ contract CCIPReceiver is CCIPClientBase { if (s_simRevert) revert ErrorCase(); } - function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual { - // Owner rescues tokens sent with a failed message - for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { - uint256 amount = message.destTokenAmounts[i].amount; - address token = message.destTokenAmounts[i].token; - - IERC20(token).safeTransfer(owner(), amount); - } - } + // ================================================================ + // │ Failed Message Processing | + // ================================================================ /// @notice This function is callable by the owner when a message has failed /// to unblock the tokens that are associated with that message. @@ -111,6 +113,20 @@ contract CCIPReceiver is CCIPClientBase { emit MessageRecovered(messageId); } + function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual { + // Owner rescues tokens sent with a failed message + for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { + uint256 amount = message.destTokenAmounts[i].amount; + address token = message.destTokenAmounts[i].token; + + IERC20(token).safeTransfer(owner(), amount); + } + } + + // ================================================================ + // │ Message Tracking │ + // ================================================================ + function getMessageContents(bytes32 messageId) public view returns (Client.Any2EVMMessage memory) { return s_messageContents[messageId]; } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol index 5999ea958b..3ebfe629b6 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol @@ -56,6 +56,10 @@ contract CCIPReceiverWithACK is CCIPReceiver { } } + function typeAndVersion() external pure virtual override returns (string memory) { + return "CCIPReceiverWithACK 1.0.0-dev"; + } + function modifyFeeToken(address token) external onlyOwner { // If the current fee token is not-native, zero out the allowance to the router for safety if (address(s_feeToken) != address(0)) { @@ -99,27 +103,6 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit MessageSucceeded(message.messageId); } - /// @notice Sends the acknowledgement message back through CCIP to original sender contract - function _sendAck(Client.Any2EVMMessage calldata incomingMessage) internal { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - - Client.EVM2AnyMessage memory outgoingMessage = Client.EVM2AnyMessage({ - receiver: incomingMessage.sender, - data: abi.encode(ACKMESSAGEMAGICBYTES, incomingMessage.messageId), - tokenAmounts: tokenAmounts, - extraArgs: s_extraArgsBytes[incomingMessage.sourceChainSelector], - feeToken: address(s_feeToken) - }); - - uint256 feeAmount = IRouterClient(i_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); - - bytes32 ACKmessageId = IRouterClient(i_ccipRouter).ccipSend{ - value: address(s_feeToken) == address(0) ? feeAmount : 0 - }(incomingMessage.sourceChainSelector, outgoingMessage); - - emit MessageSent(incomingMessage.messageId, ACKmessageId); - } - /// CCIPReceiver processMessage to make easier to modify /// @notice Function does NOT require the status of an incoming ACK be "sent" because this implementation does not send, only receives function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { @@ -146,4 +129,25 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit MessageAckReceived(messageId); } } + + /// @notice Sends the acknowledgement message back through CCIP to original sender contract + function _sendAck(Client.Any2EVMMessage calldata incomingMessage) internal { + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + + Client.EVM2AnyMessage memory outgoingMessage = Client.EVM2AnyMessage({ + receiver: incomingMessage.sender, + data: abi.encode(ACKMESSAGEMAGICBYTES, incomingMessage.messageId), + tokenAmounts: tokenAmounts, + extraArgs: s_extraArgsBytes[incomingMessage.sourceChainSelector], + feeToken: address(s_feeToken) + }); + + uint256 feeAmount = IRouterClient(i_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); + + bytes32 ACKmessageId = IRouterClient(i_ccipRouter).ccipSend{ + value: address(s_feeToken) == address(0) ? feeAmount : 0 + }(incomingMessage.sourceChainSelector, outgoingMessage); + + emit MessageSent(incomingMessage.messageId, ACKmessageId); + } } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol index aa2b98feff..12a41f5b1a 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol @@ -33,6 +33,10 @@ contract CCIPSender is CCIPClientBase { constructor(address router) CCIPClientBase(router) {} + function typeAndVersion() external pure override returns (string memory) { + return "CCIPSender 1.0.0-dev"; + } + function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] calldata tokenAmounts, diff --git a/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol b/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol index 92fd81c146..461759f195 100644 --- a/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; - import {Client} from "../libraries/Client.sol"; import {CCIPClient} from "./CCIPClient.sol"; @@ -10,7 +8,7 @@ import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; /// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication -contract PingPongDemo is CCIPClient, ITypeAndVersion { +contract PingPongDemo is CCIPClient { using SafeERC20 for IERC20; event Ping(uint256 pingPongCount); @@ -28,7 +26,7 @@ contract PingPongDemo is CCIPClient, ITypeAndVersion { // CCIPClient will handle the token approval so there's no need to do it here constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} - function typeAndVersion() external pure virtual returns (string memory) { + function typeAndVersion() external pure virtual override returns (string memory) { return "PingPongDemo 1.3.0"; } @@ -74,9 +72,9 @@ contract PingPongDemo is CCIPClient, ITypeAndVersion { } } - ///////////////////////////////////////////////////////////////////// - // Admin Functions - ///////////////////////////////////////////////////////////////////// + // ================================================================ + // │ Admin Functions │ + // ================================================================ function setCounterpart(uint64 counterpartChainSelector, address counterpartAddress) external onlyOwner { s_counterpartChainSelector = counterpartChainSelector; @@ -99,9 +97,13 @@ contract PingPongDemo is CCIPClient, ITypeAndVersion { s_chains[s_counterpartChainSelector] = abi.encode(counterpartAddress); } - ///////////////////////////////////////////////////////////////////// - // Plumbing - ///////////////////////////////////////////////////////////////////// + function setPaused(bool pause) external onlyOwner { + s_isPaused = pause; + } + + // ================================================================ + // │ State Management │ + // ================================================================ function getCounterpartChainSelector() external view returns (uint64) { return s_counterpartChainSelector; @@ -114,8 +116,4 @@ contract PingPongDemo is CCIPClient, ITypeAndVersion { function isPaused() external view returns (bool) { return s_isPaused; } - - function setPaused(bool pause) external onlyOwner { - s_isPaused = pause; - } } diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol index 1e67376f40..53f4fe67c1 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; import {IRouterClient} from "../../interfaces/IRouterClient.sol"; import {CCIPClient} from "../../production-examples/CCIPClient.sol"; import {CCIPReceiverWithACK} from "../../production-examples/CCIPClient.sol"; -import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientBase.sol"; import {Client} from "../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; @@ -202,6 +202,7 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); + uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); s_sender.ccipSend({ destChainSelector: DEST_CHAIN_SELECTOR, @@ -212,5 +213,6 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { // Assert that tokens were transfered for bridging + fees assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); + assertEq(IERC20(s_sourceFeeToken).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); } } diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol index 3d83adbaa2..7e943915f3 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; import {CCIPReceiver} from "../../production-examples/CCIPReceiver.sol"; -import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientBase.sol"; import {Client} from "../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol index 22a1f26658..52e8dd374a 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; import {CCIPReceiverWithACK} from "../../production-examples/CCIPReceiverWithACK.sol"; -import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientBase.sol"; import {Client} from "../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol b/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol index 99213132d3..702f9416b9 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol +++ b/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; import {CCIPSender} from "../../production-examples/CCIPSender.sol"; -import {ICCIPClientBase} from "../../production-examples/interfaces/ICCIPClientBase.sol"; import {Client} from "../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; From 8d2f283617908176b2f4915bbff45d5402a9b65e Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 24 Jun 2024 12:29:36 -0400 Subject: [PATCH 08/31] being deprecating existing arc's and fix tests to reflect new production-examples --- contracts/gas-snapshots/ccip.gas-snapshot | 1492 ++++++++--------- .../ccip/applications/CCIPClientExample.sol | 348 ++-- .../v0.8/ccip/applications/CCIPReceiver.sol | 118 +- .../ccip/applications/DefensiveExample.sol | 234 +-- .../ccip/applications/EtherSenderReceiver.sol | 364 ++-- .../v0.8/ccip/applications/PingPongDemo.sol | 204 +-- .../ccip/applications/SelfFundedPingPong.sol | 108 +- .../production-examples/CCIPReceiverBasic.sol | 40 + .../ccip/production-examples/CCIPSender.sol | 2 +- .../test/applications/DefensiveExample.t.sol | 194 +-- .../applications/EtherSenderReceiver.t.sol | 1436 ++++++++-------- .../test/applications/ImmutableExample.t.sol | 122 +- .../ccip/test/applications/PingPongDemo.t.sol | 240 +-- .../applications/SelfFundedPingPong.t.sol | 198 +-- .../helpers/EtherSenderReceiverHelper.sol | 71 +- .../helpers/receivers/ConformingReceiver.sol | 6 +- .../helpers/receivers/ReentrancyAbuser.sol | 6 +- .../receivers/ReentrancyAbuserMultiRamp.sol | 6 +- 18 files changed, 2632 insertions(+), 2557 deletions(-) create mode 100644 contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index a8cd7c4430..d556e3ae29 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1,41 +1,40 @@ -ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 20673) -ARMProxyStandaloneTest:test_Constructor() (gas: 543485) -ARMProxyStandaloneTest:test_SetARM() (gas: 18216) -ARMProxyStandaloneTest:test_SetARMzero() (gas: 12144) -ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 50373) -ARMProxyTest:test_ARMIsBlessed_Success() (gas: 51621) -ARMProxyTest:test_ARMIsCursed_Success() (gas: 52689) -AggregateTokenLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 23709) -AggregateTokenLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 25663) -AggregateTokenLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 20854) -AggregateTokenLimiter__rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 19835) -AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 31944) -AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 23227) -AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 55032) -AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 17640) -AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 11188) -AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13880) -AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 20448) -AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 19396) -AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 38776) -AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 41521) -BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31794) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60751) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 293783) -BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 28207) -BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31400) -BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60751) -BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 291287) -BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 20610) -BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 31794) -BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 62977) -BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 119582) -BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31794) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60751) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 293809) -BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 28542) -CCIPClientExample_sanity:test_Examples() (gas: 3197070) -CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 332345) +ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19600) +ARMProxyStandaloneTest:test_Constructor() (gas: 374544) +ARMProxyStandaloneTest:test_SetARM() (gas: 16494) +ARMProxyStandaloneTest:test_SetARMzero() (gas: 11216) +ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 48029) +ARMProxyTest:test_ARMIsBlessed_Success() (gas: 48142) +ARMProxyTest:test_ARMIsCursed_Success() (gas: 50310) +AggregateTokenLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 19623) +AggregateTokenLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 21208) +AggregateTokenLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16403) +AggregateTokenLimiter__rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18306) +AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 26920) +AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19691) +AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 40911) +AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15353) +AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10531) +AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13047) +AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 18989) +AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17479) +AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30062) +AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32071) +BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 26415) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55133) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243563) +BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 23907) +BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27582) +BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55103) +BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241429) +BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17633) +BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 26218) +BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 55608) +BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 110324) +BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 26415) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55133) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243589) +BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) +CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 329845) CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 346013) CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 84106) CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 239971) @@ -47,734 +46,705 @@ CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195931 CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422998) CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18764) CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 53048) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 332299) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 329799) CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435470) CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2527173) CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72547) CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 81734) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 334866) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 223788) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 370570) -CommitStore_constructor:test_Constructor_Success() (gas: 4405986) -CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 87008) -CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 33012) -CommitStore_report:test_InvalidInterval_Revert() (gas: 32908) -CommitStore_report:test_InvalidRootRevert() (gas: 31664) -CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 63307) -CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 72867) -CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 63328) -CommitStore_report:test_Paused_Revert() (gas: 22402) -CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 97004) -CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60147) -CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 72497) -CommitStore_report:test_StaleReportWithRoot_Success() (gas: 139699) -CommitStore_report:test_Unhealthy_Revert() (gas: 46984) -CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 121708) -CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 32353) -CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 12082) -CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 168757) -CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 44708) -CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 44671) -CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 148974) -CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11970) -CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 17646) -CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11969) -CommitStore_verify:test_Blessed_Success() (gas: 108857) -CommitStore_verify:test_NotBlessed_Success() (gas: 66607) -CommitStore_verify:test_Paused_Revert() (gas: 19843) -CommitStore_verify:test_TooManyLeaves_Revert() (gas: 85894) -DefensiveExampleTest:test_HappyPath_Success() (gas: 247055) -DefensiveExampleTest:test_Recovery() (gas: 483144) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1424090) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 445794) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 158045) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 13428) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreAlreadyInUse_Revert() (gas: 50945) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreMismatchingOnRamp_Revert() (gas: 50893) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRampAndPrevOffRamp_Revert() (gas: 150703) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 150311) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevOffRamp_Revert() (gas: 150603) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 150566) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 68364) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15414) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 360240) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 305290) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 194051) -EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 238856) -EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 170178) -EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 690562) -EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 12011) -EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 20621) -EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 8427548) -EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 153762) -EVM2EVMMultiOffRamp_execute:test_DisabledSourceChain_Revert() (gas: 46961) -EVM2EVMMultiOffRamp_execute:test_EmptyReport_Revert() (gas: 24768) -EVM2EVMMultiOffRamp_execute:test_InvalidMessageId_Revert() (gas: 52977) -EVM2EVMMultiOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 564421) -EVM2EVMMultiOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 65439) -EVM2EVMMultiOffRamp_execute:test_MessageTooLarge_Revert() (gas: 184814) -EVM2EVMMultiOffRamp_execute:test_MismatchingOnRampAddress_Revert() (gas: 58571) -EVM2EVMMultiOffRamp_execute:test_MismatchingSourceChainSelector_Revert() (gas: 52841) -EVM2EVMMultiOffRamp_execute:test_NonExistingSourceChain_Revert() (gas: 47363) -EVM2EVMMultiOffRamp_execute:test_ReceiverError_Success() (gas: 208422) -EVM2EVMMultiOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 230128) -EVM2EVMMultiOffRamp_execute:test_RootNotCommitted_Revert() (gas: 59634) -EVM2EVMMultiOffRamp_execute:test_RouterYULCall_Revert() (gas: 589335) -EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokensOtherChain_Success() (gas: 294306) -EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 240267) -EVM2EVMMultiOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 303543) -EVM2EVMMultiOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 146696) -EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 484648) -EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 78704) -EVM2EVMMultiOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 73966) -EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 672752) -EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 589533) -EVM2EVMMultiOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 45501) -EVM2EVMMultiOffRamp_execute:test_UnhealthySingleChainCurse_Revert() (gas: 687062) -EVM2EVMMultiOffRamp_execute:test_Unhealthy_Revert() (gas: 684131) -EVM2EVMMultiOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 101093) -EVM2EVMMultiOffRamp_execute:test_WithCurseOnAnotherSourceChain_Success() (gas: 620009) -EVM2EVMMultiOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 190864) -EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 26592) -EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 299985) -EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 26164) -EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 241583) -EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 61135) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 60267) -EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 299445) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 299991) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 379816) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 352542) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 332448) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 317987) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 8650901) -EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 168124) -EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 5663582) -EVM2EVMMultiOffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 148228) -EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 111564) -EVM2EVMMultiOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 707649) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 259665) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 39022) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchMultipleReports_Revert() (gas: 267050) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 127928) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 39497) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 261664) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithMultiReportGasOverride_Success() (gas: 883156) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithPartialMessages_Success() (gas: 390497) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 260930) -EVM2EVMMultiOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3541490) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnOnRampAddress_Success() (gas: 14260) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnSourceChain_Success() (gas: 14470) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHash_Success() (gas: 11030) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 163927) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 196543) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 40223) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 36106) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 81222) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 62265) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 90042) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 237653) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 183877) -EVM2EVMMultiOffRamp_report:test_IncorrectArrayType_Revert() (gas: 10928) -EVM2EVMMultiOffRamp_report:test_LargeBatch_Success() (gas: 2161853) -EVM2EVMMultiOffRamp_report:test_MultipleReports_Success() (gas: 303079) -EVM2EVMMultiOffRamp_report:test_NonArray_Revert() (gas: 28939) -EVM2EVMMultiOffRamp_report:test_SingleReport_Success() (gas: 165433) -EVM2EVMMultiOffRamp_report:test_ZeroReports_Revert() (gas: 10722) -EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 48007) -EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 46657) -EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 181613) -EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 263732) -EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 273905) -EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 416761) -EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 350816) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 20590) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigNewPrevOnRampOnExistingChain_Revert() (gas: 33708) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput() (gas: 13435) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 203174) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() (gas: 226186) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkTokenEqAddressZero_Revert() (gas: 221756) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 223945) -EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 8702407) -EVM2EVMMultiOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 39044) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 170573) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 172370) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 183089) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 169811) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 67001) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 67429) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 31644) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 31350) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 96406) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 39554) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 34183) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 120623) -EVM2EVMMultiOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 26215) -EVM2EVMMultiOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 288554) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 45780) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 29271) -EVM2EVMMultiOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 69570) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 244605) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146316) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 179881) -EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 5207680) -EVM2EVMMultiOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 37549) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 48298) -EVM2EVMMultiOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 139851) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 598599) -EVM2EVMMultiOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 100330) -EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 149822) -EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 15820) -EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 34512) -EVM2EVMMultiOnRamp_getFee:test_EmptyMessage_Success() (gas: 108818) -EVM2EVMMultiOnRamp_getFee:test_HighGasMessage_Success() (gas: 280215) -EVM2EVMMultiOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 20261) -EVM2EVMMultiOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 106664) -EVM2EVMMultiOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 260955) -EVM2EVMMultiOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24836) -EVM2EVMMultiOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 184409) -EVM2EVMMultiOnRamp_getFee:test_TooManyTokens_Revert() (gas: 23582) -EVM2EVMMultiOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 91717) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 35584) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 19574) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 42494) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 417249) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 156501) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 854100) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 189054) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 35146) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 30985) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 72644) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 54735) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 229024) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 175249) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 154141) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 263600) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 273773) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 416452) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 350686) -EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 20656) -EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 159036) -EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 7392808) -EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 148969) -EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 24316) -EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 47276) -EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 67188) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 552518) -EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 59660) -EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 175734) -EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 137785) -EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 197219) -EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 218417) -EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 53906) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 580157) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 214542) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 226493) -EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 293592) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 138053) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 473481) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 69050) -EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 162419) -EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 65780) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 659912) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 579482) -EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 45041) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 672734) -EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 92115) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 161308) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 179424) -EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 26605) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 299855) -EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 26177) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 241451) -EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 61148) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 60280) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 350246) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 98266) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 287090) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 362055) -EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 334499) -EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 311656) -EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 158895) -EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 43453) -EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 4982300) -EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 103869) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 688151) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 240997) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 35590) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 64491) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 35379) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 242418) -EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 241809) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3109700) -EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 10218) -EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 47985) -EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 46635) -EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 185260) -EVM2EVMOffRamp_updateRateLimitTokens:test_NonOwner_Revert() (gas: 25284) -EVM2EVMOffRamp_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 169745) -EVM2EVMOffRamp_updateRateLimitTokens:test_UpdateRateLimitTokens_Success() (gas: 206926) -EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 8041122) -EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 40226) -EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Success() (gas: 115237) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 140777) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 140775) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 148048) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 160784) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 147373) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 45557) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 45873) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 29048) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 28690) -EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 95681) -EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 40758) -EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 33265) -EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 119353) -EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 25727) -EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 265528) -EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 64856) -EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 28783) -EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 68824) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 250211) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 232440) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 154865) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 5181980) -EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 36477) -EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 46948) -EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 119802) -EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 383061) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 123227) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 80148) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 171393) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 234472) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 150393) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 111736) -EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 29989) -EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 30863) -EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 108580) -EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 279977) -EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 19553) -EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 105758) -EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 258681) -EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 28360) -EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 181837) -EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 24874) -EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 86491) -EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) -EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 44581) -EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 58708) -EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 45268) -EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 40077) -EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 215348) -EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 17641) -EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 39727) -EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 26972) -EVM2EVMOnRamp_getTokenTransferCost:test_ValidatedPriceStaleness_Revert() (gas: 52972) -EVM2EVMOnRamp_getTokenTransferCost:test_WETHTokenBpsFee_Success() (gas: 51897) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 39772) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 51832) -EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 38618) -EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 36639) -EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 145985) -EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 157682) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 32474) -EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 135093) -EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 141798) -EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 161209) -EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 155499) -EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 329288) -EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15908) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 54188) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 29678) -EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 73220) -EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14450) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 17652) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14974) -EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 67996) -EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 552173) -EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 61806) -EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 16566) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 97293) -EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 64585) -EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 185506) -EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 415528) -EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 58119) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 17738) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 15497) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 117544) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 18746) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 93019) -EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 16423) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 327399) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 58705) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 13702) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 103814) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 54732) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 21881) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 20674) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 116467) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 91360) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 116371) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 167929) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 98200) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 98574) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 117880) -EtherSenderReceiverTest_constructor:test_constructor() (gas: 19659) -EtherSenderReceiverTest_getFee:test_getFee() (gas: 41207) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 22872) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 18390) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 18420) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 34950) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 34697) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 23796) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 34674) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 36305) -LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 12033) -LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 36772) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 11968) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 19761) -LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 5048447) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 5044318) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 12661) -LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 19578) -LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 80020) -LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 20014) -LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 14853) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64803) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) -LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 4676497) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 34104) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 91362) -LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 65134) -LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 4672391) -LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 12639) -LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 70664) -LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 63066) -LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 274584) -LockReleaseTokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 19556) -LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 79998) -LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 19992) -LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 12055) -LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 36838) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11990) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 19651) -LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 14766) -LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64785) -LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) -MerkleMultiProofTest:test_CVE_2023_34459() (gas: 6372) -MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 4019) -MerkleMultiProofTest:test_MerkleRoot256() (gas: 668330) -MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 4074) -MerkleMultiProofTest:test_SpecSync_gas() (gas: 49338) -MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 37132) -MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 64034) -MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 135207) -MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 68119) -MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 48343) -MultiAggregateRateLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 23709) -MultiAggregateRateLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 25663) -MultiAggregateRateLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 20854) -MultiAggregateRateLimiter__rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 19835) -MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 31944) -MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 23227) -MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 55032) -MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 17640) -MultiAggregateRateLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 11188) -MultiAggregateRateLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13880) -MultiAggregateRateLimiter_setAdmin:test_Owner_Success() (gas: 20448) -MultiAggregateRateLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 19396) -MultiAggregateRateLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 38776) -MultiAggregateRateLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 41521) -MultiCommitStore_applySourceChainConfigUpdates:test_InvalidSourceChainConfig_Revert() (gas: 36408) -MultiCommitStore_applySourceChainConfigUpdates:test_OnlyOwner_Revert() (gas: 14849) -MultiCommitStore_constructor:test_Constructor_Failure() (gas: 336501) -MultiCommitStore_constructor:test_Constructor_Success() (gas: 4986622) -MultiCommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 112928) -MultiCommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 41870) -MultiCommitStore_report:test_InvalidInterval_Revert() (gas: 38299) -MultiCommitStore_report:test_InvalidRootRevert() (gas: 36783) -MultiCommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 69287) -MultiCommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 76388) -MultiCommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 69308) -MultiCommitStore_report:test_Paused_Revert() (gas: 39480) -MultiCommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 127193) -MultiCommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 65793) -MultiCommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 82830) -MultiCommitStore_report:test_SourceChainNotEnabled_Revert() (gas: 37359) -MultiCommitStore_report:test_StaleReportWithRoot_Success() (gas: 153425) -MultiCommitStore_report:test_Unhealthy_Revert() (gas: 56262) -MultiCommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 149222) -MultiCommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 21337) -MultiCommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 12164) -MultiCommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 166019) -MultiCommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 44708) -MultiCommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 44671) -MultiCommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 147985) -MultiCommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11970) -MultiCommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 34646) -MultiCommitStore_verify:test_Blessed_Success() (gas: 116132) -MultiCommitStore_verify:test_NotBlessedWrongChainSelector_Success() (gas: 118311) -MultiCommitStore_verify:test_NotBlessed_Success() (gas: 73792) -MultiCommitStore_verify:test_Paused_Revert() (gas: 37291) -MultiCommitStore_verify:test_TooManyLeaves_Revert() (gas: 86266) -MultiOCR3Base_setOCR3Configs:test_RepeatAddress_Revert() (gas: 91944) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 560803) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 330401) -MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 13284) -MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 1431472) -MultiOCR3Base_setOCR3Configs:test_SingerCannotBeZeroAddress_Revert() (gas: 127260) -MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 240974) -MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 36335) -MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 43078) -MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 52294) -MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 63727) -MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 34937) -MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 65322) -MultiOCR3Base_transmit:test_TransmitSignersNonUniqueReports_gas_Success() (gas: 44899) -MultiOCR3Base_transmit:test_TransmitUniqueReportSigners_gas_Success() (gas: 52828) -MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 28477) -MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24363) -MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 57974) -MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 22068) -MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33947) -OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 15602) -OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 48997) -OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 97138) -OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 75776) -OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 32513) -OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 20081) -OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 29873) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 30506) -OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 25225) -OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 15608) -OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 15884) -OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 21917) -OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 56393) -OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 169648) -OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 32751) -OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 34918) -OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 55992) -OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 22520) -OCR2Base_transmit:test_ForkedChain_Revert() (gas: 42561) -OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 62252) -OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 24538) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 58490) -OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 27448) -OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 45597) -OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 23593) -OnRampTokenPoolReentrancy:test_Success() (gas: 498702) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 174376) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308399) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 368070) +CommitStore_constructor:test_Constructor_Success() (gas: 3113994) +CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 74815) +CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28693) +CommitStore_report:test_InvalidInterval_Revert() (gas: 28633) +CommitStore_report:test_InvalidRootRevert() (gas: 27866) +CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 55389) +CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 61208) +CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 55387) +CommitStore_report:test_Paused_Revert() (gas: 21259) +CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 86378) +CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56336) +CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 64015) +CommitStore_report:test_StaleReportWithRoot_Success() (gas: 119320) +CommitStore_report:test_Unhealthy_Revert() (gas: 44725) +CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 102844) +CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 27649) +CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11325) +CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 140403) +CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37263) +CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37399) +CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 127733) +CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11047) +CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 16626) +CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11046) +CommitStore_verify:test_Blessed_Success() (gas: 96260) +CommitStore_verify:test_NotBlessed_Success() (gas: 58781) +CommitStore_verify:test_Paused_Revert() (gas: 18496) +CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1067897) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 409685) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 145611) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12420) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreAlreadyInUse_Revert() (gas: 45053) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreMismatchingOnRamp_Revert() (gas: 45088) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRampAndPrevOffRamp_Revert() (gas: 140669) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 140358) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevOffRamp_Revert() (gas: 140528) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 133961) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 63990) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 13026) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 286471) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 231876) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 157405) +EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 184928) +EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 142242) +EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 530985) +EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10418) +EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 17138) +EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5969142) +EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 144277) +EVM2EVMMultiOffRamp_execute:test_DisabledSourceChain_Revert() (gas: 37423) +EVM2EVMMultiOffRamp_execute:test_EmptyReport_Revert() (gas: 21734) +EVM2EVMMultiOffRamp_execute:test_InvalidMessageId_Revert() (gas: 41735) +EVM2EVMMultiOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 454821) +EVM2EVMMultiOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 51703) +EVM2EVMMultiOffRamp_execute:test_MessageTooLarge_Revert() (gas: 160327) +EVM2EVMMultiOffRamp_execute:test_MismatchingOnRampAddress_Revert() (gas: 44560) +EVM2EVMMultiOffRamp_execute:test_MismatchingSourceChainSelector_Revert() (gas: 41649) +EVM2EVMMultiOffRamp_execute:test_NonExistingSourceChain_Revert() (gas: 37638) +EVM2EVMMultiOffRamp_execute:test_ReceiverError_Success() (gas: 176646) +EVM2EVMMultiOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 189942) +EVM2EVMMultiOffRamp_execute:test_RootNotCommitted_Revert() (gas: 46468) +EVM2EVMMultiOffRamp_execute:test_RouterYULCall_Revert() (gas: 1364518) +EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokensOtherChain_Success() (gas: 241122) +EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 188632) +EVM2EVMMultiOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 257609) +EVM2EVMMultiOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 125233) +EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 397671) +EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 62202) +EVM2EVMMultiOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 59646) +EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 539702) +EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 477229) +EVM2EVMMultiOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35823) +EVM2EVMMultiOffRamp_execute:test_UnhealthySingleChainCurse_Revert() (gas: 529388) +EVM2EVMMultiOffRamp_execute:test_Unhealthy_Revert() (gas: 526973) +EVM2EVMMultiOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 71735) +EVM2EVMMultiOffRamp_execute:test_WithCurseOnAnotherSourceChain_Success() (gas: 494162) +EVM2EVMMultiOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 155593) +EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20638) +EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 261016) +EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20220) +EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 204130) +EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48744) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48251) +EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 247691) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 247409) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 299590) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 280074) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249177) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237259) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 6174587) +EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 142578) +EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3607928) +EVM2EVMMultiOffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 118398) +EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 87335) +EVM2EVMMultiOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1455423) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 205538) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 28244) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchMultipleReports_Revert() (gas: 160660) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 79950) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 28720) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 208307) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithMultiReportGasOverride_Success() (gas: 652700) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithPartialMessages_Success() (gas: 295113) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 207711) +EVM2EVMMultiOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3108851) +EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnOnRampAddress_Success() (gas: 10983) +EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnSourceChain_Success() (gas: 11036) +EVM2EVMMultiOffRamp_metadataHash:test_MetadataHash_Success() (gas: 9146) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140176) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 167679) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 32041) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 28420) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 64933) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 50982) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 72413) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 198135) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 151537) +EVM2EVMMultiOffRamp_report:test_IncorrectArrayType_Revert() (gas: 10026) +EVM2EVMMultiOffRamp_report:test_LargeBatch_Success() (gas: 1489143) +EVM2EVMMultiOffRamp_report:test_MultipleReports_Success() (gas: 232122) +EVM2EVMMultiOffRamp_report:test_NonArray_Revert() (gas: 22751) +EVM2EVMMultiOffRamp_report:test_SingleReport_Success() (gas: 139874) +EVM2EVMMultiOffRamp_report:test_ZeroReports_Revert() (gas: 9850) +EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40324) +EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38510) +EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 141645) +EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 219925) +EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 228582) +EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 314606) +EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 293615) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16208) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigNewPrevOnRampOnExistingChain_Revert() (gas: 29352) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput() (gas: 12405) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 166139) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() (gas: 194697) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkTokenEqAddressZero_Revert() (gas: 190277) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 192535) +EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 5894971) +EVM2EVMMultiOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 34293) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 152632) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 154658) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 161011) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 152247) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 61482) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 61744) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 27967) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 27906) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 86435) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 34950) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29652) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 108295) +EVM2EVMMultiOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 23070) +EVM2EVMMultiOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 246301) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 40229) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25916) +EVM2EVMMultiOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59599) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 191397) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 135213) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 162246) +EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3618955) +EVM2EVMMultiOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30855) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 44218) +EVM2EVMMultiOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 129149) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 545795) +EVM2EVMMultiOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 92274) +EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 121091) +EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 12002) +EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 24010) +EVM2EVMMultiOnRamp_getFee:test_EmptyMessage_Success() (gas: 77414) +EVM2EVMMultiOnRamp_getFee:test_HighGasMessage_Success() (gas: 233262) +EVM2EVMMultiOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 17099) +EVM2EVMMultiOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95772) +EVM2EVMMultiOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 162349) +EVM2EVMMultiOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 20318) +EVM2EVMMultiOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 119983) +EVM2EVMMultiOnRamp_getFee:test_TooManyTokens_Revert() (gas: 18280) +EVM2EVMMultiOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 70936) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 32119) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 16171) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 36113) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 349738) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 133550) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 711741) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 160957) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 26995) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23318) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 57323) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44275) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 190545) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 143942) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 129795) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 219770) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 228427) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 314267) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 293451) +EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17118) +EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 150794) +EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5284412) +EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 141586) +EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21394) +EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36373) +EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51698) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 444512) +EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 46354) +EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152427) +EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101091) +EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 166940) +EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 179787) +EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41204) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1356507) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 161381) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 176738) +EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248687) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 117126) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 388142) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54147) +EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 134070) +EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52074) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 528397) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 467745) +EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35351) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 516386) +EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 63854) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 125298) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 145405) +EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20637) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 260882) +EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20264) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 204009) +EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48776) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48264) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 295086) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 72666) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 235646) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 284275) +EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 265224) +EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 231817) +EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 133871) +EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 39495) +EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213578) +EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1439903) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 190831) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25884) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43447) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25964) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 193065) +EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 192526) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2764180) +EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8893) +EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40302) +EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38488) +EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 144043) +EVM2EVMOffRamp_updateRateLimitTokens:test_NonOwner_Revert() (gas: 16755) +EVM2EVMOffRamp_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 161216) +EVM2EVMOffRamp_updateRateLimitTokens:test_UpdateRateLimitTokens_Success() (gas: 198747) +EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5653804) +EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 35786) +EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Success() (gas: 100231) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 118627) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 118669) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130405) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 138931) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 130085) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 40511) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 40706) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25537) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25323) +EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 85998) +EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36487) +EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29069) +EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107552) +EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22661) +EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 224019) +EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 56550) +EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25507) +EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59124) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182698) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 178301) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 137645) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3595319) +EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30191) +EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43322) +EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 109497) +EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 335657) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 112600) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72556) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 147980) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 190833) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 122085) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 95415) +EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 21021) +EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 21401) +EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 78556) +EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 234404) +EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16737) +EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95293) +EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 161424) +EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24115) +EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 118998) +EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 19924) +EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 66455) +EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460) +EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 37609) +EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 47351) +EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 35157) +EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 30434) +EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 134217) +EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15238) +EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 30242) +EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 23364) +EVM2EVMOnRamp_getTokenTransferCost:test_ValidatedPriceStaleness_Revert() (gas: 45576) +EVM2EVMOnRamp_getTokenTransferCost:test_WETHTokenBpsFee_Success() (gas: 41127) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 30287) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40669) +EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29660) +EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32615) +EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 134879) +EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143092) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 26589) +EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127459) +EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133360) +EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146371) +EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 140962) +EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 297851) +EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15324) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 46083) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 22073) +EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 57382) +EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13482) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16467) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14020) +EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61788) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 469462) +EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57290) +EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14683) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 84820) +EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60696) +EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 173721) +EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 190364) +EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53631) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14453) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14229) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 84025) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17321) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83281) +EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15293) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272276) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53472) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12856) +LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11058) +LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35097) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10970) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18036) +LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3248818) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3245195) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 11358) +LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17135) +LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 69142) +LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 17319) +LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 12027) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60025) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11355) +LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3001716) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30016) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79992) +LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59474) +LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 2998137) +LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11358) +LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 61917) +LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 55833) +LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 224959) +LockReleaseTokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17102) +LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 69075) +LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 17297) +LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11057) +LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35140) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 10992) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 17926) +LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11962) +LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60025) +LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11355) +MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5451) +MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3552) +MerkleMultiProofTest:test_MerkleRoot256() (gas: 394876) +MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3649) +MerkleMultiProofTest:test_SpecSync_gas() (gas: 34123) +MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 33965) +MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60758) +MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126294) +MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 63302) +MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 43853) +MultiAggregateRateLimiter__getTokenValue:test_GetTokenValue_Success() (gas: 19623) +MultiAggregateRateLimiter__getTokenValue:test_NoTokenPrice_Reverts() (gas: 21208) +MultiAggregateRateLimiter__rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16403) +MultiAggregateRateLimiter__rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18306) +MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 26920) +MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19691) +MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 40911) +MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15353) +MultiAggregateRateLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10531) +MultiAggregateRateLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13047) +MultiAggregateRateLimiter_setAdmin:test_Owner_Success() (gas: 18989) +MultiAggregateRateLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17479) +MultiAggregateRateLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30062) +MultiAggregateRateLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32071) +MultiCommitStore_applySourceChainConfigUpdates:test_InvalidSourceChainConfig_Revert() (gas: 29592) +MultiCommitStore_applySourceChainConfigUpdates:test_OnlyOwner_Revert() (gas: 12743) +MultiCommitStore_constructor:test_Constructor_Failure() (gas: 316394) +MultiCommitStore_constructor:test_Constructor_Success() (gas: 3407009) +MultiCommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 101519) +MultiCommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 34518) +MultiCommitStore_report:test_InvalidInterval_Revert() (gas: 32755) +MultiCommitStore_report:test_InvalidRootRevert() (gas: 31855) +MultiCommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 62667) +MultiCommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 67143) +MultiCommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 62665) +MultiCommitStore_report:test_Paused_Revert() (gas: 38331) +MultiCommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 113183) +MultiCommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60887) +MultiCommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 71295) +MultiCommitStore_report:test_SourceChainNotEnabled_Revert() (gas: 32131) +MultiCommitStore_report:test_StaleReportWithRoot_Success() (gas: 127903) +MultiCommitStore_report:test_Unhealthy_Revert() (gas: 50684) +MultiCommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 128252) +MultiCommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 17799) +MultiCommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11409) +MultiCommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 137048) +MultiCommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37263) +MultiCommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37399) +MultiCommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 131200) +MultiCommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11047) +MultiCommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 33700) +MultiCommitStore_verify:test_Blessed_Success() (gas: 101669) +MultiCommitStore_verify:test_NotBlessedWrongChainSelector_Success() (gas: 103743) +MultiCommitStore_verify:test_NotBlessed_Success() (gas: 64090) +MultiCommitStore_verify:test_Paused_Revert() (gas: 35772) +MultiCommitStore_verify:test_TooManyLeaves_Revert() (gas: 36985) +MultiOCR3Base_setOCR3Configs:test_RepeatAddress_Revert() (gas: 85886) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 527475) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 305957) +MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12287) +MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 1338709) +MultiOCR3Base_setOCR3Configs:test_SingerCannotBeZeroAddress_Revert() (gas: 116292) +MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 228621) +MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 29072) +MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 34660) +MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 43386) +MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 53347) +MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 29948) +MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 51789) +MultiOCR3Base_transmit:test_TransmitSignersNonUniqueReports_gas_Success() (gas: 38684) +MultiOCR3Base_transmit:test_TransmitUniqueReportSigners_gas_Success() (gas: 45603) +MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 24336) +MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 20243) +MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 48376) +MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 18135) +MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 29533) +OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12278) +OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42337) +OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84491) +OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 37039) +OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24156) +OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17448) +OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26711) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27454) +OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21272) +OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12296) +OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12470) +OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 15142) +OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45579) +OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155192) +OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24407) +OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20607) +OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47298) +OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19623) +OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37683) +OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55309) +OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20962) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51686) +OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) +OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) +OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) +OnRampTokenPoolReentrancy:test_Success() (gas: 382249) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 305899) PingPong_example_plumbing:test_Pausing_Success() (gas: 17899) PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 232502) -PingPong_plumbing:test_Pausing_Success() (gas: 19122) -PingPong_startPingPong:test_StartPingPong_Success() (gas: 213447) -PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 91666) -PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 14424) -PriceRegistry_applyPriceUpdatersUpdates:test_ApplyPriceUpdaterUpdates_Success() (gas: 91323) -PriceRegistry_applyPriceUpdatersUpdates:test_OnlyCallableByOwner_Revert() (gas: 14490) -PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 70798) -PriceRegistry_constructor:test_Setup_Success() (gas: 2929422) -PriceRegistry_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 80038) -PriceRegistry_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 36081) -PriceRegistry_convertTokenAmount:test_StaleFeeToken_Revert() (gas: 42981) -PriceRegistry_convertTokenAmount:test_StaleLinkToken_Revert() (gas: 39399) -PriceRegistry_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 76518) -PriceRegistry_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 19223) -PriceRegistry_getTokenAndGasPrices:test_StaleTokenPrice_Revert() (gas: 37655) -PriceRegistry_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 17728) -PriceRegistry_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 50033) -PriceRegistry_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 69118) -PriceRegistry_getTokenPrices:test_GetTokenPrices_Success() (gas: 94783) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 3422580) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 3422537) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 3402679) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 3422373) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 3422498) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 3422292) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 68382) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 68216) -PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 66082) -PriceRegistry_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 3421724) -PriceRegistry_getValidatedTokenPrice:test_StaleFeeToken_Revert() (gas: 22010) -PriceRegistry_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 115683) -PriceRegistry_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 15409) -PriceRegistry_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 3419540) -PriceRegistry_updatePrices:test_OnlyCallableByUpdaterOrOwner_Revert() (gas: 15233) -PriceRegistry_updatePrices:test_OnlyGasPrice_Success() (gas: 27501) -PriceRegistry_updatePrices:test_OnlyTokenPrice_Success() (gas: 34882) -PriceRegistry_updatePrices:test_UpdateMultiplePrices_Success() (gas: 172375) -PriceRegistry_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 57323) -PriceRegistry_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 76423) -PriceRegistry_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 22336) -PriceRegistry_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 101464) -PriceRegistry_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 57329) -PriceRegistry_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 13298) -RMN_constructor:test_Constructor_Success() (gas: 73405) -RMN_ownerUnbless:test_Unbless_Success() (gas: 100861) -RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterRecovery() (gas: 293002) -RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 262189) -RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 17812) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 221113) -RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 22975) -RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 35062) -RMN_setConfig:test_NonOwner_Revert() (gas: 19970) -RMN_setConfig:test_RepeatedAddress_Revert() (gas: 28350) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 134966) -RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 54015) -RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 168508) -RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 15952) -RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 23189) -RMN_unvoteToCurse:test_InvalidCurseState_Revert() (gas: 20289) -RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26158) -RMN_unvoteToCurse:test_InvalidVoter() (gas: 101587) -RMN_unvoteToCurse:test_OwnerSkips() (gas: 32751) -RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 30223) -RMN_unvoteToCurse:test_ValidCursesHash() (gas: 34924) -RMN_voteToBlessRoots:test_1RootSuccess_gas() (gas: 49816) -RMN_voteToBlessRoots:test_3RootSuccess_gas() (gas: 110890) -RMN_voteToBlessRoots:test_5RootSuccess_gas() (gas: 172035) -RMN_voteToBlessRoots:test_Curse_Revert() (gas: 262890) -RMN_voteToBlessRoots:test_InvalidVoter_Revert() (gas: 19455) -RMN_voteToBlessRoots:test_IsAlreadyBlessedIgnored_Success() (gas: 158114) -RMN_voteToBlessRoots:test_SenderAlreadyVotedIgnored_Success() (gas: 141392) -RMN_voteToCurse:test_AlreadyVoted_Revert() (gas: 81401) -RMN_voteToCurse:test_EmitCurse_Success() (gas: 261241) -RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 299234) -RMN_voteToCurse:test_InvalidVoter_Revert() (gas: 15464) -RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 256336) -RMN_voteToCurse:test_VoteToCurseSuccess_gas() (gas: 74169) -RateLimiter_constructor:test_Constructor_Success() (gas: 22964) -RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 19839) -RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 28311) -RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 39405) -RateLimiter_consume:test_ConsumeTokens_Success() (gas: 21919) -RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 57402) -RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 19531) -RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 33020) -RateLimiter_consume:test_Refill_Success() (gas: 48170) -RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 22450) -RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 31057) -RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 49681) -RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 63750) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 48188) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 22583) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 141720) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 22403) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 141539) -Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 93496) -Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 12361570) -Router_applyRampUpdates:test_OnRampDisable() (gas: 65150) -Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 13275) -Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 134328) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 241086) -Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 152103) -Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 258841) -Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 80636) -Router_ccipSend:test_InvalidMsgValue() (gas: 35918) -Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 83448) -Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 210014) -Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 67795) -Router_ccipSend:test_NativeFeeToken_Success() (gas: 207770) -Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 272955) -Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 28707) -Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 48624) -Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 212313) -Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 287016) -Router_constructor:test_Constructor_Success() (gas: 14515) -Router_getArmProxy:test_getArmProxy() (gas: 11328) -Router_getFee:test_GetFeeSupportedChain_Success() (gas: 58121) -Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 20945) -Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) -Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 12807) -Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 21382) -Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 12776) -Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 603372) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 59811) -Router_routeMessage:test_AutoExec_Success() (gas: 52687) -Router_routeMessage:test_ExecutionEvent_Success() (gas: 183234) -Router_routeMessage:test_ManualExec_Success() (gas: 41795) -Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 28359) -Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 47836) -Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 11766) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 62339) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 568153) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 22129) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 60930) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 53318) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 14159) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 70315) -TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 12702) -TokenAdminRegistry_getPool:test_getPool_Success() (gas: 18693) -TokenAdminRegistry_getPools:test_getPools_Success() (gas: 48227) -TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 100704) -TokenAdminRegistry_isTokenSupportedOnRemoteChain:test_isTokenSupportedOnRemoteChain_Success() (gas: 35933) -TokenAdminRegistry_registerAdministrator:test_registerAdministrator_OnlyRegistryModule_Revert() (gas: 15289) -TokenAdminRegistry_registerAdministrator:test_registerAdministrator_Success() (gas: 97344) -TokenAdminRegistry_registerAdministrator:test_registerAdministrator__disableReRegistration_Revert() (gas: 101521) -TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_AlreadyRegistered_Revert() (gas: 93362) -TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_OnlyOwner_Revert() (gas: 16869) -TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_Success() (gas: 103741) -TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_ZeroAddress_Revert() (gas: 14314) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 14115) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 58261) -TokenAdminRegistry_setDisableReRegistration:test_setDisableReRegistration_Success() (gas: 40953) -TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 22042) -TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 20183) -TokenAdminRegistry_setPool:test_setPool_Success() (gas: 41191) -TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 35983) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 20292) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 57039) -TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 8748577) -TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 9165545) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 9687186) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 9885574) -TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 3260771) -TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 13369) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 26629) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 189373) -TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 25697) -TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8788) -TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 28144) -TokenPool_applyChainUpdates:test_DisabledNonZeroRateLimit_Revert() (gas: 234116) -TokenPool_applyChainUpdates:test_InvalidRatelimitRate_Revert() (gas: 478928) -TokenPool_applyChainUpdates:test_NonExistentChain_Revert() (gas: 21411) -TokenPool_applyChainUpdates:test_OnlyCallableByOwner_Revert() (gas: 12332) -TokenPool_applyChainUpdates:test_Success() (gas: 449692) -TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 74044) -TokenPool_constructor:test_immutableFields_Success() (gas: 23273) -TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 235207) -TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 239770) -TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 266182) -TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 313703) -TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 239062) -TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 229816) -TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 268288) -TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17310) -TokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 15148) -TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 17567) -TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 15292) -TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 243812) -TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 20582) -TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 161359) -TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 18599) -TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 292819) -TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 19019) -TokenProxy_ccipSend:test_CcipSend_Success() (gas: 312488) -TokenProxy_constructor:test_Constructor() (gas: 15309) -TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 20176) -TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 14693) -TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 18513) -TokenProxy_getFee:test_GetFee_Success() (gas: 121887) -USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 37526) -USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 40218) -USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 34558) -USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 147543) -USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 499187) -USDCTokenPool_lockOrBurn:test_lockOrBurn_InvalidReceiver_Revert() (gas: 59110) -USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 81154) -USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 58745) -USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 75981) -USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 74539) -USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 12298) -USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 14722) \ No newline at end of file +PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) +PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) +PriceRegistry_applyPriceUpdatersUpdates:test_ApplyPriceUpdaterUpdates_Success() (gas: 82654) +PriceRegistry_applyPriceUpdatersUpdates:test_OnlyCallableByOwner_Revert() (gas: 12624) +PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67332) +PriceRegistry_constructor:test_Setup_Success() (gas: 1868487) +PriceRegistry_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 72964) +PriceRegistry_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 31054) +PriceRegistry_convertTokenAmount:test_StaleFeeToken_Revert() (gas: 36931) +PriceRegistry_convertTokenAmount:test_StaleLinkToken_Revert() (gas: 33954) +PriceRegistry_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 70558) +PriceRegistry_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 16838) +PriceRegistry_getTokenAndGasPrices:test_StaleTokenPrice_Revert() (gas: 32343) +PriceRegistry_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16140) +PriceRegistry_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 45707) +PriceRegistry_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 62174) +PriceRegistry_getTokenPrices:test_GetTokenPrices_Success() (gas: 84717) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 2094577) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 2094557) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 2074676) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 2094396) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 2094535) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 2094347) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 62042) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 61989) +PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 61129) +PriceRegistry_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 2093891) +PriceRegistry_getValidatedTokenPrice:test_StaleFeeToken_Revert() (gas: 19511) +PriceRegistry_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 109043) +PriceRegistry_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 13858) +PriceRegistry_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 2092591) +PriceRegistry_updatePrices:test_OnlyCallableByUpdaterOrOwner_Revert() (gas: 14051) +PriceRegistry_updatePrices:test_OnlyGasPrice_Success() (gas: 23484) +PriceRegistry_updatePrices:test_OnlyTokenPrice_Success() (gas: 30495) +PriceRegistry_updatePrices:test_UpdateMultiplePrices_Success() (gas: 151016) +PriceRegistry_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50615) +PriceRegistry_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63624) +PriceRegistry_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 19976) +PriceRegistry_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 89016) +PriceRegistry_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 50865) +PriceRegistry_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12340) +RMN_constructor:test_Constructor_Success() (gas: 58069) +RMN_ownerUnbless:test_Unbless_Success() (gas: 72058) +RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterRecovery() (gas: 236682) +RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 198660) +RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 14981) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 179810) +RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 17953) +RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 25911) +RMN_setConfig:test_NonOwner_Revert() (gas: 15041) +RMN_setConfig:test_RepeatedAddress_Revert() (gas: 21287) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 111456) +RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 39545) +RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 142354) +RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 14250) +RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 18152) +RMN_unvoteToCurse:test_InvalidCurseState_Revert() (gas: 18136) +RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 23178) +RMN_unvoteToCurse:test_InvalidVoter() (gas: 86618) +RMN_unvoteToCurse:test_OwnerSkips() (gas: 29220) +RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 26951) +RMN_unvoteToCurse:test_ValidCursesHash() (gas: 31488) +RMN_voteToBlessRoots:test_1RootSuccess_gas() (gas: 45454) +RMN_voteToBlessRoots:test_3RootSuccess_gas() (gas: 99549) +RMN_voteToBlessRoots:test_5RootSuccess_gas() (gas: 153757) +RMN_voteToBlessRoots:test_Curse_Revert() (gas: 244265) +RMN_voteToBlessRoots:test_InvalidVoter_Revert() (gas: 17029) +RMN_voteToBlessRoots:test_IsAlreadyBlessedIgnored_Success() (gas: 124904) +RMN_voteToBlessRoots:test_SenderAlreadyVotedIgnored_Success() (gas: 114423) +RMN_voteToCurse:test_AlreadyVoted_Revert() (gas: 74738) +RMN_voteToCurse:test_EmitCurse_Success() (gas: 243463) +RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 275862) +RMN_voteToCurse:test_InvalidVoter_Revert() (gas: 13671) +RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 194189) +RMN_voteToCurse:test_VoteToCurseSuccess_gas() (gas: 70265) +RateLimiter_constructor:test_Constructor_Success() (gas: 19650) +RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 15916) +RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22222) +RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31353) +RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20336) +RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40285) +RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15720) +RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25594) +RateLimiter_consume:test_Refill_Success() (gas: 37222) +RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18250) +RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24706) +RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38647) +RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46384) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38077) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19671) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 132584) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19463) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 132375) +Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89288) +Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10648508) +Router_applyRampUpdates:test_OnRampDisable() (gas: 55913) +Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12311) +Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 114300) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 201586) +Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 129182) +Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 216470) +Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 66439) +Router_ccipSend:test_InvalidMsgValue() (gas: 31992) +Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 68875) +Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 174414) +Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 56201) +Router_ccipSend:test_NativeFeeToken_Success() (gas: 173008) +Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 243384) +Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24778) +Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44692) +Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 175224) +Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 243794) +Router_constructor:test_Constructor_Success() (gas: 13074) +Router_getArmProxy:test_getArmProxy() (gas: 10561) +Router_getFee:test_GetFeeSupportedChain_Success() (gas: 46599) +Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17138) +Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460) +Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11316) +Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 17761) +Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11159) +Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 422138) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 50437) +Router_routeMessage:test_AutoExec_Success() (gas: 42764) +Router_routeMessage:test_ExecutionEvent_Success() (gas: 158089) +Router_routeMessage:test_ManualExec_Success() (gas: 35410) +Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25167) +Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44669) +Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 52047) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 45092) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12629) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 67056) +TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 11350) +TokenAdminRegistry_getPool:test_getPool_Success() (gas: 17603) +TokenAdminRegistry_getPools:test_getPools_Success() (gas: 39902) +TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 93605) +TokenAdminRegistry_isTokenSupportedOnRemoteChain:test_isTokenSupportedOnRemoteChain_Success() (gas: 31099) +TokenAdminRegistry_registerAdministrator:test_registerAdministrator_OnlyRegistryModule_Revert() (gas: 13237) +TokenAdminRegistry_registerAdministrator:test_registerAdministrator_Success() (gas: 93231) +TokenAdminRegistry_registerAdministrator:test_registerAdministrator__disableReRegistration_Revert() (gas: 95925) +TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_AlreadyRegistered_Revert() (gas: 89541) +TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_OnlyOwner_Revert() (gas: 14345) +TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_Success() (gas: 97519) +TokenAdminRegistry_registerAdministratorPermissioned:test_registerAdministratorPermissioned_ZeroAddress_Revert() (gas: 12710) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 12585) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 54545) +TokenAdminRegistry_setDisableReRegistration:test_setDisableReRegistration_Success() (gas: 34157) +TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 19214) +TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 18057) +TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36097) +TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30764) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18079) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 50351) +TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5881566) +TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 6151241) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6669564) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6853613) +TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 2114838) +TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12089) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23280) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177516) +TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23648) +TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8319) +TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24743) +TokenPool_applyChainUpdates:test_DisabledNonZeroRateLimit_Revert() (gas: 224004) +TokenPool_applyChainUpdates:test_InvalidRatelimitRate_Revert() (gas: 443888) +TokenPool_applyChainUpdates:test_NonExistentChain_Revert() (gas: 17559) +TokenPool_applyChainUpdates:test_OnlyCallableByOwner_Revert() (gas: 11385) +TokenPool_applyChainUpdates:test_Success() (gas: 395619) +TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70616) +TokenPool_constructor:test_immutableFields_Success() (gas: 20501) +TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 225682) +TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 230283) +TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 251040) +TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 303097) +TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 229974) +TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 214997) +TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 258095) +TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 14884) +TokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 12543) +TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15598) +TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13173) +TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 233639) +TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17109) +TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 136619) +TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 15919) +TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 245670) +TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16303) +TokenProxy_ccipSend:test_CcipSend_Success() (gas: 262076) +TokenProxy_constructor:test_Constructor() (gas: 13812) +TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16827) +TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12658) +TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15849) +TokenProxy_getFee:test_GetFee_Success() (gas: 87484) +USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 24960) +USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35394) +USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30137) +USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133168) +USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 430575) +USDCTokenPool_lockOrBurn:test_lockOrBurn_InvalidReceiver_Revert() (gas: 52688) +USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 70039) +USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50391) +USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 64670) +USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66150) +USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11333) +USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11942) \ No newline at end of file diff --git a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol b/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol index 7fe8977948..80a34a999f 100644 --- a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol +++ b/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol @@ -1,174 +1,174 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IRouterClient} from "../interfaces/IRouterClient.sol"; - -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {Client} from "../libraries/Client.sol"; -import {CCIPReceiver} from "./CCIPReceiver.sol"; - -import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -// @notice Example of a client which supports EVM/non-EVM chains -// @dev If chain specific logic is required for different chain families (e.g. particular -// decoding the bytes sender for authorization checks), it may be required to point to a helper -// authorization contract unless all chain families are known up front. -// @dev If contract does not implement IAny2EVMMessageReceiver and IERC165, -// and tokens are sent to it, ccipReceive will not be called but tokens will be transferred. -// @dev If the client is upgradeable you have significantly more flexibility and -// can avoid storage based options like the below contract uses. However it's -// worth carefully considering how the trust assumptions of your client dapp will -// change if you introduce upgradeability. An immutable dapp building on top of CCIP -// like the example below will inherit the trust properties of CCIP (i.e. the oracle network). -// @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting -// new chain family receivers (e.g. a solana encoded receiver address) without upgrading. -contract CCIPClientExample is CCIPReceiver, OwnerIsCreator { - error InvalidConfig(); - error InvalidChain(uint64 chainSelector); - - event MessageSent(bytes32 messageId); - event MessageReceived(bytes32 messageId); - - // Current feeToken - IERC20 public s_feeToken; - // Below is a simplistic example (same params for all messages) of using storage to allow for new options without - // upgrading the dapp. Note that extra args are chain family specific (e.g. gasLimit is EVM specific etc.). - // and will always be backwards compatible i.e. upgrades are opt-in. - // Offchain we can compute the V1 extraArgs: - // Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 300_000}); - // bytes memory encodedV1ExtraArgs = Client._argsToBytes(extraArgs); - // Then later compute V2 extraArgs, for example if a refund feature was added: - // Client.EVMExtraArgsV2 memory extraArgs = Client.EVMExtraArgsV2({gasLimit: 300_000, destRefundAddress: 0x1234}); - // bytes memory encodedV2ExtraArgs = Client._argsToBytes(extraArgs); - // and update storage with the new args. - // If different options are required for different messages, for example different gas limits, - // one can simply key based on (chainSelector, messageType) instead of only chainSelector. - mapping(uint64 destChainSelector => bytes extraArgsBytes) public s_chains; - - constructor(IRouterClient router, IERC20 feeToken) CCIPReceiver(address(router)) { - s_feeToken = feeToken; - s_feeToken.approve(address(router), type(uint256).max); - } - - function enableChain(uint64 chainSelector, bytes memory extraArgs) external onlyOwner { - s_chains[chainSelector] = extraArgs; - } - - function disableChain(uint64 chainSelector) external onlyOwner { - delete s_chains[chainSelector]; - } - - function ccipReceive(Client.Any2EVMMessage calldata message) - external - virtual - override - onlyRouter - validChain(message.sourceChainSelector) - { - // Extremely important to ensure only router calls this. - // Tokens in message if any will be transferred to this contract - // TODO: Validate sender/origin chain and process message and/or tokens. - _ccipReceive(message); - } - - function _ccipReceive(Client.Any2EVMMessage memory message) internal override { - emit MessageReceived(message.messageId); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native asset. - function sendDataPayNative( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data - ) external validChain(destChainSelector) { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(0) // We leave the feeToken empty indicating we'll pay raw native. - }); - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ - value: IRouterClient(i_ccipRouter).getFee(destChainSelector, message) - }(destChainSelector, message); - emit MessageSent(messageId); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient feeToken. - function sendDataPayFeeToken( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data - ) external validChain(destChainSelector) { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native token. - function sendDataAndTokens( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data, - Client.EVMTokenAmount[] memory tokenAmounts - ) external validChain(destChainSelector) { - for (uint256 i = 0; i < tokenAmounts.length; ++i) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); - } - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } - - // @notice user sends tokens to a receiver - // Approvals can be optimized with a whitelist of tokens and inf approvals if desired. - function sendTokens( - uint64 destChainSelector, - bytes memory receiver, - Client.EVMTokenAmount[] memory tokenAmounts - ) external validChain(destChainSelector) { - for (uint256 i = 0; i < tokenAmounts.length; ++i) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); - } - bytes memory data; - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } - - modifier validChain(uint64 chainSelector) { - if (s_chains[chainSelector].length == 0) revert InvalidChain(chainSelector); - _; - } -} +// // SPDX-License-Identifier: MIT +// pragma solidity ^0.8.0; + +// import {IRouterClient} from "../interfaces/IRouterClient.sol"; + +// import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; +// import {Client} from "../libraries/Client.sol"; +// import {CCIPReceiver} from "./CCIPReceiver.sol"; + +// import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +// // @notice Example of a client which supports EVM/non-EVM chains +// // @dev If chain specific logic is required for different chain families (e.g. particular +// // decoding the bytes sender for authorization checks), it may be required to point to a helper +// // authorization contract unless all chain families are known up front. +// // @dev If contract does not implement IAny2EVMMessageReceiver and IERC165, +// // and tokens are sent to it, ccipReceive will not be called but tokens will be transferred. +// // @dev If the client is upgradeable you have significantly more flexibility and +// // can avoid storage based options like the below contract uses. However it's +// // worth carefully considering how the trust assumptions of your client dapp will +// // change if you introduce upgradeability. An immutable dapp building on top of CCIP +// // like the example below will inherit the trust properties of CCIP (i.e. the oracle network). +// // @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting +// // new chain family receivers (e.g. a solana encoded receiver address) without upgrading. +// contract CCIPClientExample is CCIPReceiver, OwnerIsCreator { +// error InvalidConfig(); +// error InvalidChain(uint64 chainSelector); + +// event MessageSent(bytes32 messageId); +// event MessageReceived(bytes32 messageId); + +// // Current feeToken +// IERC20 public s_feeToken; +// // Below is a simplistic example (same params for all messages) of using storage to allow for new options without +// // upgrading the dapp. Note that extra args are chain family specific (e.g. gasLimit is EVM specific etc.). +// // and will always be backwards compatible i.e. upgrades are opt-in. +// // Offchain we can compute the V1 extraArgs: +// // Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 300_000}); +// // bytes memory encodedV1ExtraArgs = Client._argsToBytes(extraArgs); +// // Then later compute V2 extraArgs, for example if a refund feature was added: +// // Client.EVMExtraArgsV2 memory extraArgs = Client.EVMExtraArgsV2({gasLimit: 300_000, destRefundAddress: 0x1234}); +// // bytes memory encodedV2ExtraArgs = Client._argsToBytes(extraArgs); +// // and update storage with the new args. +// // If different options are required for different messages, for example different gas limits, +// // one can simply key based on (chainSelector, messageType) instead of only chainSelector. +// mapping(uint64 destChainSelector => bytes extraArgsBytes) public s_chains; + +// constructor(IRouterClient router, IERC20 feeToken) CCIPReceiver(address(router)) { +// s_feeToken = feeToken; +// s_feeToken.approve(address(router), type(uint256).max); +// } + +// function enableChain(uint64 chainSelector, bytes memory extraArgs) external onlyOwner { +// s_chains[chainSelector] = extraArgs; +// } + +// function disableChain(uint64 chainSelector) external onlyOwner { +// delete s_chains[chainSelector]; +// } + +// function ccipReceive(Client.Any2EVMMessage calldata message) +// external +// virtual +// override +// onlyRouter +// validChain(message.sourceChainSelector) +// { +// // Extremely important to ensure only router calls this. +// // Tokens in message if any will be transferred to this contract +// // TODO: Validate sender/origin chain and process message and/or tokens. +// _ccipReceive(message); +// } + +// function _ccipReceive(Client.Any2EVMMessage memory message) internal override { +// emit MessageReceived(message.messageId); +// } + +// /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native asset. +// function sendDataPayNative( +// uint64 destChainSelector, +// bytes memory receiver, +// bytes memory data +// ) external validChain(destChainSelector) { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: receiver, +// data: data, +// tokenAmounts: tokenAmounts, +// extraArgs: s_chains[destChainSelector], +// feeToken: address(0) // We leave the feeToken empty indicating we'll pay raw native. +// }); +// bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ +// value: IRouterClient(i_ccipRouter).getFee(destChainSelector, message) +// }(destChainSelector, message); +// emit MessageSent(messageId); +// } + +// /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient feeToken. +// function sendDataPayFeeToken( +// uint64 destChainSelector, +// bytes memory receiver, +// bytes memory data +// ) external validChain(destChainSelector) { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: receiver, +// data: data, +// tokenAmounts: tokenAmounts, +// extraArgs: s_chains[destChainSelector], +// feeToken: address(s_feeToken) +// }); +// // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); +// // Can decide if fee is acceptable. +// // address(this) must have sufficient feeToken or the send will revert. +// bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); +// emit MessageSent(messageId); +// } + +// /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native token. +// function sendDataAndTokens( +// uint64 destChainSelector, +// bytes memory receiver, +// bytes memory data, +// Client.EVMTokenAmount[] memory tokenAmounts +// ) external validChain(destChainSelector) { +// for (uint256 i = 0; i < tokenAmounts.length; ++i) { +// IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); +// IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); +// } +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: receiver, +// data: data, +// tokenAmounts: tokenAmounts, +// extraArgs: s_chains[destChainSelector], +// feeToken: address(s_feeToken) +// }); +// // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); +// // Can decide if fee is acceptable. +// // address(this) must have sufficient feeToken or the send will revert. +// bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); +// emit MessageSent(messageId); +// } + +// // @notice user sends tokens to a receiver +// // Approvals can be optimized with a whitelist of tokens and inf approvals if desired. +// function sendTokens( +// uint64 destChainSelector, +// bytes memory receiver, +// Client.EVMTokenAmount[] memory tokenAmounts +// ) external validChain(destChainSelector) { +// for (uint256 i = 0; i < tokenAmounts.length; ++i) { +// IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); +// IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); +// } +// bytes memory data; +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: receiver, +// data: data, +// tokenAmounts: tokenAmounts, +// extraArgs: s_chains[destChainSelector], +// feeToken: address(s_feeToken) +// }); +// // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); +// // Can decide if fee is acceptable. +// // address(this) must have sufficient feeToken or the send will revert. +// bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); +// emit MessageSent(messageId); +// } + +// modifier validChain(uint64 chainSelector) { +// if (s_chains[chainSelector].length == 0) revert InvalidChain(chainSelector); +// _; +// } +// } diff --git a/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol index 7011f814de..cde378b6f0 100644 --- a/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol @@ -1,59 +1,59 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol"; - -import {Client} from "../libraries/Client.sol"; - -import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; - -/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. -abstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 { - address internal immutable i_ccipRouter; - - constructor(address router) { - if (router == address(0)) revert InvalidRouter(address(0)); - i_ccipRouter = router; - } - - /// @notice IERC165 supports an interfaceId - /// @param interfaceId The interfaceId to check - /// @return true if the interfaceId is supported - /// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver - /// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId - /// This allows CCIP to check if ccipReceive is available before calling it. - /// If this returns false or reverts, only tokens are transferred to the receiver. - /// If this returns true, tokens are transferred and ccipReceive is called atomically. - /// Additionally, if the receiver address does not have code associated with - /// it at the time of execution (EXTCODESIZE returns 0), only tokens will be transferred. - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; - } - - /// @inheritdoc IAny2EVMMessageReceiver - function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter { - _ccipReceive(message); - } - - /// @notice Override this function in your implementation. - /// @param message Any2EVMMessage - function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual; - - ///////////////////////////////////////////////////////////////////// - // Plumbing - ///////////////////////////////////////////////////////////////////// - - /// @notice Return the current router - /// @return CCIP router address - function getRouter() public view virtual returns (address) { - return address(i_ccipRouter); - } - - error InvalidRouter(address router); - - /// @dev only calls from the set router are accepted. - modifier onlyRouter() { - if (msg.sender != getRouter()) revert InvalidRouter(msg.sender); - _; - } -} +// // SPDX-License-Identifier: MIT +// pragma solidity ^0.8.0; + +// import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol"; + +// import {Client} from "../libraries/Client.sol"; + +// import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; + +// /// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. +// abstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 { +// address internal immutable i_ccipRouter; + +// constructor(address router) { +// if (router == address(0)) revert InvalidRouter(address(0)); +// i_ccipRouter = router; +// } + +// /// @notice IERC165 supports an interfaceId +// /// @param interfaceId The interfaceId to check +// /// @return true if the interfaceId is supported +// /// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver +// /// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId +// /// This allows CCIP to check if ccipReceive is available before calling it. +// /// If this returns false or reverts, only tokens are transferred to the receiver. +// /// If this returns true, tokens are transferred and ccipReceive is called atomically. +// /// Additionally, if the receiver address does not have code associated with +// /// it at the time of execution (EXTCODESIZE returns 0), only tokens will be transferred. +// function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { +// return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; +// } + +// /// @inheritdoc IAny2EVMMessageReceiver +// function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter { +// _ccipReceive(message); +// } + +// /// @notice Override this function in your implementation. +// /// @param message Any2EVMMessage +// function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual; + +// ///////////////////////////////////////////////////////////////////// +// // Plumbing +// ///////////////////////////////////////////////////////////////////// + +// /// @notice Return the current router +// /// @return CCIP router address +// function getRouter() public view virtual returns (address) { +// return address(i_ccipRouter); +// } + +// error InvalidRouter(address router); + +// /// @dev only calls from the set router are accepted. +// modifier onlyRouter() { +// if (msg.sender != getRouter()) revert InvalidRouter(msg.sender); +// _; +// } +// } diff --git a/contracts/src/v0.8/ccip/applications/DefensiveExample.sol b/contracts/src/v0.8/ccip/applications/DefensiveExample.sol index 54e1e80946..b2bac19abc 100644 --- a/contracts/src/v0.8/ccip/applications/DefensiveExample.sol +++ b/contracts/src/v0.8/ccip/applications/DefensiveExample.sol @@ -1,117 +1,117 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IRouterClient} from "../interfaces/IRouterClient.sol"; - -import {Client} from "../libraries/Client.sol"; -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/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; - -contract DefensiveExample is CCIPClientExample { - using EnumerableMap for EnumerableMap.Bytes32ToUintMap; - using SafeERC20 for IERC20; - - error OnlySelf(); - error ErrorCase(); - error MessageNotFailed(bytes32 messageId); - - event MessageFailed(bytes32 indexed messageId, bytes reason); - event MessageSucceeded(bytes32 indexed messageId); - event MessageRecovered(bytes32 indexed messageId); - - // Example error code, could have many different error codes. - enum ErrorCode { - // RESOLVED is first so that the default value is resolved. - RESOLVED, - // Could have any number of error codes here. - BASIC - } - - // The message contents of failed messages are stored here. - mapping(bytes32 messageId => Client.Any2EVMMessage contents) public s_messageContents; - - // Contains failed messages and their state. - EnumerableMap.Bytes32ToUintMap internal s_failedMessages; - - // This is used to simulate a revert in the processMessage function. - bool internal s_simRevert = false; - - constructor(IRouterClient router, IERC20 feeToken) CCIPClientExample(router, feeToken) {} - - /// @notice The entrypoint for the CCIP router to call. This function should - /// never revert, all errors should be handled internally in this contract. - /// @param message The message to process. - /// @dev Extremely important to ensure only router calls this. - function ccipReceive(Client.Any2EVMMessage calldata message) - external - override - onlyRouter - validChain(message.sourceChainSelector) - { - try this.processMessage(message) {} - catch (bytes memory err) { - // Could set different error codes based on the caught error. Each could be - // handled differently. - s_failedMessages.set(message.messageId, uint256(ErrorCode.BASIC)); - s_messageContents[message.messageId] = message; - // Don't revert so CCIP doesn't revert. Emit event instead. - // The message can be retried later without having to do manual execution of CCIP. - emit MessageFailed(message.messageId, err); - return; - } - emit MessageSucceeded(message.messageId); - } - - /// @notice This function the entrypoint for this contract to process messages. - /// @param message The message to process. - /// @dev This example just sends the tokens to the owner of this contracts. More - /// interesting functions could be implemented. - /// @dev It has to be external because of the try/catch. - function processMessage(Client.Any2EVMMessage calldata message) - external - onlySelf - validChain(message.sourceChainSelector) - { - // Simulate a revert - if (s_simRevert) revert ErrorCase(); - - // Send tokens to the owner - for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { - IERC20(message.destTokenAmounts[i].token).safeTransfer(owner(), message.destTokenAmounts[i].amount); - } - // Do other things that might revert - } - - /// @notice This function is callable by the owner when a message has failed - /// to unblock the tokens that are associated with that message. - /// @dev This function is only callable by the owner. - function retryFailedMessage(bytes32 messageId, address tokenReceiver) external onlyOwner { - if (s_failedMessages.get(messageId) != uint256(ErrorCode.BASIC)) revert MessageNotFailed(messageId); - // Set the error code to 0 to disallow reentry and retry the same failed message - // multiple times. - s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); - - // Do stuff to retry message, potentially just releasing the associated tokens - Client.Any2EVMMessage memory message = s_messageContents[messageId]; - - // send the tokens to the receiver as escape hatch - for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { - IERC20(message.destTokenAmounts[i].token).safeTransfer(tokenReceiver, message.destTokenAmounts[i].amount); - } - - emit MessageRecovered(messageId); - } - - // An example function to demonstrate recovery - function setSimRevert(bool simRevert) external onlyOwner { - s_simRevert = simRevert; - } - - modifier onlySelf() { - if (msg.sender != address(this)) revert OnlySelf(); - _; - } -} +// // SPDX-License-Identifier: MIT +// pragma solidity ^0.8.0; + +// import {IRouterClient} from "../interfaces/IRouterClient.sol"; + +// import {Client} from "../libraries/Client.sol"; +// 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/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; + +// contract DefensiveExample is CCIPClientExample { +// using EnumerableMap for EnumerableMap.Bytes32ToUintMap; +// using SafeERC20 for IERC20; + +// error OnlySelf(); +// error ErrorCase(); +// error MessageNotFailed(bytes32 messageId); + +// event MessageFailed(bytes32 indexed messageId, bytes reason); +// event MessageSucceeded(bytes32 indexed messageId); +// event MessageRecovered(bytes32 indexed messageId); + +// // Example error code, could have many different error codes. +// enum ErrorCode { +// // RESOLVED is first so that the default value is resolved. +// RESOLVED, +// // Could have any number of error codes here. +// BASIC +// } + +// // The message contents of failed messages are stored here. +// mapping(bytes32 messageId => Client.Any2EVMMessage contents) public s_messageContents; + +// // Contains failed messages and their state. +// EnumerableMap.Bytes32ToUintMap internal s_failedMessages; + +// // This is used to simulate a revert in the processMessage function. +// bool internal s_simRevert = false; + +// constructor(IRouterClient router, IERC20 feeToken) CCIPClientExample(router, feeToken) {} + +// /// @notice The entrypoint for the CCIP router to call. This function should +// /// never revert, all errors should be handled internally in this contract. +// /// @param message The message to process. +// /// @dev Extremely important to ensure only router calls this. +// function ccipReceive(Client.Any2EVMMessage calldata message) +// external +// override +// onlyRouter +// validChain(message.sourceChainSelector) +// { +// try this.processMessage(message) {} +// catch (bytes memory err) { +// // Could set different error codes based on the caught error. Each could be +// // handled differently. +// s_failedMessages.set(message.messageId, uint256(ErrorCode.BASIC)); +// s_messageContents[message.messageId] = message; +// // Don't revert so CCIP doesn't revert. Emit event instead. +// // The message can be retried later without having to do manual execution of CCIP. +// emit MessageFailed(message.messageId, err); +// return; +// } +// emit MessageSucceeded(message.messageId); +// } + +// /// @notice This function the entrypoint for this contract to process messages. +// /// @param message The message to process. +// /// @dev This example just sends the tokens to the owner of this contracts. More +// /// interesting functions could be implemented. +// /// @dev It has to be external because of the try/catch. +// function processMessage(Client.Any2EVMMessage calldata message) +// external +// onlySelf +// validChain(message.sourceChainSelector) +// { +// // Simulate a revert +// if (s_simRevert) revert ErrorCase(); + +// // Send tokens to the owner +// for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { +// IERC20(message.destTokenAmounts[i].token).safeTransfer(owner(), message.destTokenAmounts[i].amount); +// } +// // Do other things that might revert +// } + +// /// @notice This function is callable by the owner when a message has failed +// /// to unblock the tokens that are associated with that message. +// /// @dev This function is only callable by the owner. +// function retryFailedMessage(bytes32 messageId, address tokenReceiver) external onlyOwner { +// if (s_failedMessages.get(messageId) != uint256(ErrorCode.BASIC)) revert MessageNotFailed(messageId); +// // Set the error code to 0 to disallow reentry and retry the same failed message +// // multiple times. +// s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); + +// // Do stuff to retry message, potentially just releasing the associated tokens +// Client.Any2EVMMessage memory message = s_messageContents[messageId]; + +// // send the tokens to the receiver as escape hatch +// for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { +// IERC20(message.destTokenAmounts[i].token).safeTransfer(tokenReceiver, message.destTokenAmounts[i].amount); +// } + +// emit MessageRecovered(messageId); +// } + +// // An example function to demonstrate recovery +// function setSimRevert(bool simRevert) external onlyOwner { +// s_simRevert = simRevert; +// } + +// modifier onlySelf() { +// if (msg.sender != address(this)) revert OnlySelf(); +// _; +// } +// } diff --git a/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol b/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol index 10a1d202d9..4d2ab78abf 100644 --- a/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol @@ -1,182 +1,182 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.24; - -import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; - -import {IRouterClient} from "../interfaces/IRouterClient.sol"; -import {IWrappedNative} from "../interfaces/IWrappedNative.sol"; - -import {Client} from "./../libraries/Client.sol"; -import {CCIPReceiver} from "./CCIPReceiver.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"; - -interface CCIPRouter { - function getWrappedNative() external view returns (address); -} - -/// @notice A contract that can send raw ether cross-chain using CCIP. -/// Since CCIP only supports ERC-20 token transfers, this contract accepts -/// normal ether, wraps it, and uses CCIP to send it cross-chain. -/// On the receiving side, the wrapped ether is unwrapped and sent to the final receiver. -/// @notice This contract only supports chains where the wrapped native contract -/// is the WETH contract (i.e not WMATIC, or WAVAX, etc.). This is because the -/// receiving contract will always unwrap the ether using it's local wrapped native contract. -/// @dev This contract is both a sender and a receiver. This same contract can be -/// deployed on source and destination chains to facilitate cross-chain ether transfers -/// and act as a sender and a receiver. -/// @dev This contract is intentionally ownerless and permissionless. This contract -/// will never hold any excess funds, native or otherwise, when used correctly. -contract EtherSenderReceiver is CCIPReceiver, ITypeAndVersion { - using SafeERC20 for IERC20; - - error InvalidTokenAmounts(uint256 gotAmounts); - error InvalidToken(address gotToken, address expectedToken); - error TokenAmountNotEqualToMsgValue(uint256 gotAmount, uint256 msgValue); - error InsufficientMsgValue(uint256 gotAmount, uint256 msgValue); - error InsufficientFee(uint256 gotFee, uint256 fee); - error GasLimitTooLow(uint256 minLimit, uint256 gotLimit); - - string public constant override typeAndVersion = "EtherSenderReceiver 1.5.0"; - - /// @notice The wrapped native token address. - /// @dev If the wrapped native token address changes on the router, this contract will need to be redeployed. - IWrappedNative public immutable i_weth; - - /// @param router The CCIP router address. - constructor(address router) CCIPReceiver(router) { - i_weth = IWrappedNative(CCIPRouter(router).getWrappedNative()); - i_weth.approve(router, type(uint256).max); - } - - /// @notice Need this in order to unwrap correctly. - receive() external payable {} - - /// @notice Get the fee for sending a message to a destination chain. - /// This is mirrored from the router for convenience, construct the appropriate - /// message and get it's fee. - /// @param destinationChainSelector The destination chainSelector - /// @param message The cross-chain CCIP message including data and/or tokens - /// @return fee returns execution fee for the message - /// delivery to destination chain, denominated in the feeToken specified in the message. - /// @dev Reverts with appropriate reason upon invalid message. - function getFee( - uint64 destinationChainSelector, - Client.EVM2AnyMessage calldata message - ) external view returns (uint256 fee) { - Client.EVM2AnyMessage memory validatedMessage = _validatedMessage(message); - - return IRouterClient(getRouter()).getFee(destinationChainSelector, validatedMessage); - } - - /// @notice Send raw native tokens cross-chain. - /// @param destinationChainSelector The destination chain selector. - /// @param message The CCIP message with the following fields correctly set: - /// - bytes receiver: The _contract_ address on the destination chain that will receive the wrapped ether. - /// The caller must ensure that this contract address is correct, otherwise funds may be lost forever. - /// - address feeToken: The fee token address. Must be address(0) for native tokens, or a supported CCIP fee token otherwise (i.e, LINK token). - /// In the event a feeToken is set, we will transferFrom the caller the fee amount before sending the message, in order to forward them to the router. - /// - EVMTokenAmount[] tokenAmounts: The tokenAmounts array must contain a single element with the following fields: - /// - uint256 amount: The amount of ether to send. - /// There are a couple of cases here that depend on the fee token specified: - /// 1. If feeToken == address(0), the fee must be included in msg.value. Therefore tokenAmounts[0].amount must be less than msg.value, - /// and the difference will be used as the fee. - /// 2. If feeToken != address(0), the fee is not included in msg.value, and tokenAmounts[0].amount must be equal to msg.value. - /// these fees to the CCIP router. - /// @return messageId The CCIP message ID. - function ccipSend( - uint64 destinationChainSelector, - Client.EVM2AnyMessage calldata message - ) external payable returns (bytes32) { - _validateFeeToken(message); - Client.EVM2AnyMessage memory validatedMessage = _validatedMessage(message); - - i_weth.deposit{value: validatedMessage.tokenAmounts[0].amount}(); - - uint256 fee = IRouterClient(getRouter()).getFee(destinationChainSelector, validatedMessage); - if (validatedMessage.feeToken != address(0)) { - // If the fee token is not native, we need to transfer the fee to this contract and re-approve it to the router. - // Its not possible to have any leftover tokens in this path because we transferFrom the exact fee that CCIP - // requires from the caller. - IERC20(validatedMessage.feeToken).safeTransferFrom(msg.sender, address(this), fee); - - // We gave an infinite approval of weth to the router in the constructor. - if (validatedMessage.feeToken != address(i_weth)) { - IERC20(validatedMessage.feeToken).approve(getRouter(), fee); - } - - return IRouterClient(getRouter()).ccipSend(destinationChainSelector, validatedMessage); - } - - // We don't want to keep any excess ether in this contract, so we send over the entire address(this).balance as the fee. - // CCIP will revert if the fee is insufficient, so we don't need to check here. - return IRouterClient(getRouter()).ccipSend{value: address(this).balance}(destinationChainSelector, validatedMessage); - } - - /// @notice Validate the message content. - /// @dev Only allows a single token to be sent. Always overwritten to be address(i_weth) - /// and receiver is always msg.sender. - function _validatedMessage(Client.EVM2AnyMessage calldata message) - internal - view - returns (Client.EVM2AnyMessage memory) - { - Client.EVM2AnyMessage memory validatedMessage = message; - - if (validatedMessage.tokenAmounts.length != 1) { - revert InvalidTokenAmounts(validatedMessage.tokenAmounts.length); - } - - validatedMessage.data = abi.encode(msg.sender); - validatedMessage.tokenAmounts[0].token = address(i_weth); - - return validatedMessage; - } - - function _validateFeeToken(Client.EVM2AnyMessage calldata message) internal view { - uint256 tokenAmount = message.tokenAmounts[0].amount; - - if (message.feeToken != address(0)) { - // If the fee token is NOT native, then the token amount must be equal to msg.value. - // This is done to ensure that there is no leftover ether in this contract. - if (msg.value != tokenAmount) { - revert TokenAmountNotEqualToMsgValue(tokenAmount, msg.value); - } - } - } - - /// @notice Receive the wrapped ether, unwrap it, and send it to the specified EOA in the data field. - /// @param message The CCIP message containing the wrapped ether amount and the final receiver. - /// @dev The code below should never revert if the message being is valid according - /// to the above _validatedMessage and _validateFeeToken functions. - function _ccipReceive(Client.Any2EVMMessage memory message) internal override { - address receiver = abi.decode(message.data, (address)); - - if (message.destTokenAmounts.length != 1) { - revert InvalidTokenAmounts(message.destTokenAmounts.length); - } - - if (message.destTokenAmounts[0].token != address(i_weth)) { - revert InvalidToken(message.destTokenAmounts[0].token, address(i_weth)); - } - - uint256 tokenAmount = message.destTokenAmounts[0].amount; - i_weth.withdraw(tokenAmount); - - // it is possible that the below call may fail if receiver.code.length > 0 and the contract - // doesn't e.g have a receive() or a fallback() function. - (bool success,) = payable(receiver).call{value: tokenAmount}(""); - if (!success) { - // We have a few options here: - // 1. Revert: this is bad generally because it may mean that these tokens are stuck. - // 2. Store the tokens in a mapping and allow the user to withdraw them with another tx. - // 3. Send WETH to the receiver address. - // We opt for (3) here because at least the receiver will have the funds and can unwrap them if needed. - // However it is worth noting that if receiver is actually a contract AND the contract _cannot_ withdraw - // the WETH, then the WETH will be stuck in this contract. - i_weth.deposit{value: tokenAmount}(); - i_weth.transfer(receiver, tokenAmount); - } - } -} +// // SPDX-License-Identifier: BUSL-1.1 +// pragma solidity 0.8.24; + +// import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; + +// import {IRouterClient} from "../interfaces/IRouterClient.sol"; +// import {IWrappedNative} from "../interfaces/IWrappedNative.sol"; + +// import {Client} from "./../libraries/Client.sol"; +// import {CCIPReceiver} from "./CCIPReceiver.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"; + +// interface CCIPRouter { +// function getWrappedNative() external view returns (address); +// } + +// /// @notice A contract that can send raw ether cross-chain using CCIP. +// /// Since CCIP only supports ERC-20 token transfers, this contract accepts +// /// normal ether, wraps it, and uses CCIP to send it cross-chain. +// /// On the receiving side, the wrapped ether is unwrapped and sent to the final receiver. +// /// @notice This contract only supports chains where the wrapped native contract +// /// is the WETH contract (i.e not WMATIC, or WAVAX, etc.). This is because the +// /// receiving contract will always unwrap the ether using it's local wrapped native contract. +// /// @dev This contract is both a sender and a receiver. This same contract can be +// /// deployed on source and destination chains to facilitate cross-chain ether transfers +// /// and act as a sender and a receiver. +// /// @dev This contract is intentionally ownerless and permissionless. This contract +// /// will never hold any excess funds, native or otherwise, when used correctly. +// contract EtherSenderReceiver is CCIPReceiver, ITypeAndVersion { +// using SafeERC20 for IERC20; + +// error InvalidTokenAmounts(uint256 gotAmounts); +// error InvalidToken(address gotToken, address expectedToken); +// error TokenAmountNotEqualToMsgValue(uint256 gotAmount, uint256 msgValue); +// error InsufficientMsgValue(uint256 gotAmount, uint256 msgValue); +// error InsufficientFee(uint256 gotFee, uint256 fee); +// error GasLimitTooLow(uint256 minLimit, uint256 gotLimit); + +// string public constant override typeAndVersion = "EtherSenderReceiver 1.5.0"; + +// /// @notice The wrapped native token address. +// /// @dev If the wrapped native token address changes on the router, this contract will need to be redeployed. +// IWrappedNative public immutable i_weth; + +// /// @param router The CCIP router address. +// constructor(address router) CCIPReceiver(router) { +// i_weth = IWrappedNative(CCIPRouter(router).getWrappedNative()); +// i_weth.approve(router, type(uint256).max); +// } + +// /// @notice Need this in order to unwrap correctly. +// receive() external payable {} + +// /// @notice Get the fee for sending a message to a destination chain. +// /// This is mirrored from the router for convenience, construct the appropriate +// /// message and get it's fee. +// /// @param destinationChainSelector The destination chainSelector +// /// @param message The cross-chain CCIP message including data and/or tokens +// /// @return fee returns execution fee for the message +// /// delivery to destination chain, denominated in the feeToken specified in the message. +// /// @dev Reverts with appropriate reason upon invalid message. +// function getFee( +// uint64 destinationChainSelector, +// Client.EVM2AnyMessage calldata message +// ) external view returns (uint256 fee) { +// Client.EVM2AnyMessage memory validatedMessage = _validatedMessage(message); + +// return IRouterClient(getRouter()).getFee(destinationChainSelector, validatedMessage); +// } + +// /// @notice Send raw native tokens cross-chain. +// /// @param destinationChainSelector The destination chain selector. +// /// @param message The CCIP message with the following fields correctly set: +// /// - bytes receiver: The _contract_ address on the destination chain that will receive the wrapped ether. +// /// The caller must ensure that this contract address is correct, otherwise funds may be lost forever. +// /// - address feeToken: The fee token address. Must be address(0) for native tokens, or a supported CCIP fee token otherwise (i.e, LINK token). +// /// In the event a feeToken is set, we will transferFrom the caller the fee amount before sending the message, in order to forward them to the router. +// /// - EVMTokenAmount[] tokenAmounts: The tokenAmounts array must contain a single element with the following fields: +// /// - uint256 amount: The amount of ether to send. +// /// There are a couple of cases here that depend on the fee token specified: +// /// 1. If feeToken == address(0), the fee must be included in msg.value. Therefore tokenAmounts[0].amount must be less than msg.value, +// /// and the difference will be used as the fee. +// /// 2. If feeToken != address(0), the fee is not included in msg.value, and tokenAmounts[0].amount must be equal to msg.value. +// /// these fees to the CCIP router. +// /// @return messageId The CCIP message ID. +// function ccipSend( +// uint64 destinationChainSelector, +// Client.EVM2AnyMessage calldata message +// ) external payable returns (bytes32) { +// _validateFeeToken(message); +// Client.EVM2AnyMessage memory validatedMessage = _validatedMessage(message); + +// i_weth.deposit{value: validatedMessage.tokenAmounts[0].amount}(); + +// uint256 fee = IRouterClient(getRouter()).getFee(destinationChainSelector, validatedMessage); +// if (validatedMessage.feeToken != address(0)) { +// // If the fee token is not native, we need to transfer the fee to this contract and re-approve it to the router. +// // Its not possible to have any leftover tokens in this path because we transferFrom the exact fee that CCIP +// // requires from the caller. +// IERC20(validatedMessage.feeToken).safeTransferFrom(msg.sender, address(this), fee); + +// // We gave an infinite approval of weth to the router in the constructor. +// if (validatedMessage.feeToken != address(i_weth)) { +// IERC20(validatedMessage.feeToken).approve(getRouter(), fee); +// } + +// return IRouterClient(getRouter()).ccipSend(destinationChainSelector, validatedMessage); +// } + +// // We don't want to keep any excess ether in this contract, so we send over the entire address(this).balance as the fee. +// // CCIP will revert if the fee is insufficient, so we don't need to check here. +// return IRouterClient(getRouter()).ccipSend{value: address(this).balance}(destinationChainSelector, validatedMessage); +// } + +// /// @notice Validate the message content. +// /// @dev Only allows a single token to be sent. Always overwritten to be address(i_weth) +// /// and receiver is always msg.sender. +// function _validatedMessage(Client.EVM2AnyMessage calldata message) +// internal +// view +// returns (Client.EVM2AnyMessage memory) +// { +// Client.EVM2AnyMessage memory validatedMessage = message; + +// if (validatedMessage.tokenAmounts.length != 1) { +// revert InvalidTokenAmounts(validatedMessage.tokenAmounts.length); +// } + +// validatedMessage.data = abi.encode(msg.sender); +// validatedMessage.tokenAmounts[0].token = address(i_weth); + +// return validatedMessage; +// } + +// function _validateFeeToken(Client.EVM2AnyMessage calldata message) internal view { +// uint256 tokenAmount = message.tokenAmounts[0].amount; + +// if (message.feeToken != address(0)) { +// // If the fee token is NOT native, then the token amount must be equal to msg.value. +// // This is done to ensure that there is no leftover ether in this contract. +// if (msg.value != tokenAmount) { +// revert TokenAmountNotEqualToMsgValue(tokenAmount, msg.value); +// } +// } +// } + +// /// @notice Receive the wrapped ether, unwrap it, and send it to the specified EOA in the data field. +// /// @param message The CCIP message containing the wrapped ether amount and the final receiver. +// /// @dev The code below should never revert if the message being is valid according +// /// to the above _validatedMessage and _validateFeeToken functions. +// function _ccipReceive(Client.Any2EVMMessage memory message) internal override { +// address receiver = abi.decode(message.data, (address)); + +// if (message.destTokenAmounts.length != 1) { +// revert InvalidTokenAmounts(message.destTokenAmounts.length); +// } + +// if (message.destTokenAmounts[0].token != address(i_weth)) { +// revert InvalidToken(message.destTokenAmounts[0].token, address(i_weth)); +// } + +// uint256 tokenAmount = message.destTokenAmounts[0].amount; +// i_weth.withdraw(tokenAmount); + +// // it is possible that the below call may fail if receiver.code.length > 0 and the contract +// // doesn't e.g have a receive() or a fallback() function. +// (bool success,) = payable(receiver).call{value: tokenAmount}(""); +// if (!success) { +// // We have a few options here: +// // 1. Revert: this is bad generally because it may mean that these tokens are stuck. +// // 2. Store the tokens in a mapping and allow the user to withdraw them with another tx. +// // 3. Send WETH to the receiver address. +// // We opt for (3) here because at least the receiver will have the funds and can unwrap them if needed. +// // However it is worth noting that if receiver is actually a contract AND the contract _cannot_ withdraw +// // the WETH, then the WETH will be stuck in this contract. +// i_weth.deposit{value: tokenAmount}(); +// i_weth.transfer(receiver, tokenAmount); +// } +// } +// } diff --git a/contracts/src/v0.8/ccip/applications/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/PingPongDemo.sol index 423fdc4546..4df6c45c64 100644 --- a/contracts/src/v0.8/ccip/applications/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/PingPongDemo.sol @@ -1,102 +1,102 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; -import {IRouterClient} from "../interfaces/IRouterClient.sol"; - -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {Client} from "../libraries/Client.sol"; -import {CCIPReceiver} from "./CCIPReceiver.sol"; - -import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -/// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication -contract PingPongDemo is CCIPReceiver, OwnerIsCreator, ITypeAndVersion { - event Ping(uint256 pingPongCount); - event Pong(uint256 pingPongCount); - - // The chain ID of the counterpart ping pong contract - uint64 internal s_counterpartChainSelector; - // The contract address of the counterpart ping pong contract - address internal s_counterpartAddress; - // Pause ping-ponging - bool private s_isPaused; - // The fee token used to pay for CCIP transactions - IERC20 internal s_feeToken; - - constructor(address router, IERC20 feeToken) CCIPReceiver(router) { - s_isPaused = false; - s_feeToken = feeToken; - s_feeToken.approve(address(router), type(uint256).max); - } - - function typeAndVersion() external pure virtual returns (string memory) { - return "PingPongDemo 1.2.0"; - } - - function setCounterpart(uint64 counterpartChainSelector, address counterpartAddress) external onlyOwner { - s_counterpartChainSelector = counterpartChainSelector; - s_counterpartAddress = counterpartAddress; - } - - function startPingPong() external onlyOwner { - s_isPaused = false; - _respond(1); - } - - function _respond(uint256 pingPongCount) internal virtual { - if (pingPongCount & 1 == 1) { - emit Ping(pingPongCount); - } else { - emit Pong(pingPongCount); - } - bytes memory data = abi.encode(pingPongCount); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(s_counterpartAddress), - data: data, - tokenAmounts: new Client.EVMTokenAmount[](0), - extraArgs: "", - feeToken: address(s_feeToken) - }); - IRouterClient(getRouter()).ccipSend(s_counterpartChainSelector, message); - } - - function _ccipReceive(Client.Any2EVMMessage memory message) internal override { - uint256 pingPongCount = abi.decode(message.data, (uint256)); - if (!s_isPaused) { - _respond(pingPongCount + 1); - } - } - - ///////////////////////////////////////////////////////////////////// - // Plumbing - ///////////////////////////////////////////////////////////////////// - - function getCounterpartChainSelector() external view returns (uint64) { - return s_counterpartChainSelector; - } - - function setCounterpartChainSelector(uint64 chainSelector) external onlyOwner { - s_counterpartChainSelector = chainSelector; - } - - function getCounterpartAddress() external view returns (address) { - return s_counterpartAddress; - } - - function getFeeToken() external view returns (IERC20) { - return s_feeToken; - } - - function setCounterpartAddress(address addr) external onlyOwner { - s_counterpartAddress = addr; - } - - function isPaused() external view returns (bool) { - return s_isPaused; - } - - function setPaused(bool pause) external onlyOwner { - s_isPaused = pause; - } -} +// // SPDX-License-Identifier: MIT +// pragma solidity ^0.8.0; + +// import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; +// import {IRouterClient} from "../interfaces/IRouterClient.sol"; + +// import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; +// import {Client} from "../libraries/Client.sol"; +// import {CCIPReceiver} from "./CCIPReceiver.sol"; + +// import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +// /// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication +// contract PingPongDemo is CCIPReceiver, OwnerIsCreator, ITypeAndVersion { +// event Ping(uint256 pingPongCount); +// event Pong(uint256 pingPongCount); + +// // The chain ID of the counterpart ping pong contract +// uint64 internal s_counterpartChainSelector; +// // The contract address of the counterpart ping pong contract +// address internal s_counterpartAddress; +// // Pause ping-ponging +// bool private s_isPaused; +// // The fee token used to pay for CCIP transactions +// IERC20 internal s_feeToken; + +// constructor(address router, IERC20 feeToken) CCIPReceiver(router) { +// s_isPaused = false; +// s_feeToken = feeToken; +// s_feeToken.approve(address(router), type(uint256).max); +// } + +// function typeAndVersion() external pure virtual returns (string memory) { +// return "PingPongDemo 1.2.0"; +// } + +// function setCounterpart(uint64 counterpartChainSelector, address counterpartAddress) external onlyOwner { +// s_counterpartChainSelector = counterpartChainSelector; +// s_counterpartAddress = counterpartAddress; +// } + +// function startPingPong() external onlyOwner { +// s_isPaused = false; +// _respond(1); +// } + +// function _respond(uint256 pingPongCount) internal virtual { +// if (pingPongCount & 1 == 1) { +// emit Ping(pingPongCount); +// } else { +// emit Pong(pingPongCount); +// } +// bytes memory data = abi.encode(pingPongCount); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(s_counterpartAddress), +// data: data, +// tokenAmounts: new Client.EVMTokenAmount[](0), +// extraArgs: "", +// feeToken: address(s_feeToken) +// }); +// IRouterClient(getRouter()).ccipSend(s_counterpartChainSelector, message); +// } + +// function _ccipReceive(Client.Any2EVMMessage memory message) internal override { +// uint256 pingPongCount = abi.decode(message.data, (uint256)); +// if (!s_isPaused) { +// _respond(pingPongCount + 1); +// } +// } + +// ///////////////////////////////////////////////////////////////////// +// // Plumbing +// ///////////////////////////////////////////////////////////////////// + +// function getCounterpartChainSelector() external view returns (uint64) { +// return s_counterpartChainSelector; +// } + +// function setCounterpartChainSelector(uint64 chainSelector) external onlyOwner { +// s_counterpartChainSelector = chainSelector; +// } + +// function getCounterpartAddress() external view returns (address) { +// return s_counterpartAddress; +// } + +// function getFeeToken() external view returns (IERC20) { +// return s_feeToken; +// } + +// function setCounterpartAddress(address addr) external onlyOwner { +// s_counterpartAddress = addr; +// } + +// function isPaused() external view returns (bool) { +// return s_isPaused; +// } + +// function setPaused(bool pause) external onlyOwner { +// s_isPaused = pause; +// } +// } diff --git a/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol b/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol index fa01d99474..284204c283 100644 --- a/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol +++ b/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol @@ -1,67 +1,67 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +// // SPDX-License-Identifier: MIT +// pragma solidity ^0.8.0; -import {Router} from "../Router.sol"; -import {Client} from "../libraries/Client.sol"; -import {EVM2EVMOnRamp} from "../onRamp/EVM2EVMOnRamp.sol"; -import {PingPongDemo} from "./PingPongDemo.sol"; +// import {Router} from "../Router.sol"; +// import {Client} from "../libraries/Client.sol"; +// import {EVM2EVMOnRamp} from "../onRamp/EVM2EVMOnRamp.sol"; +// import {PingPongDemo} from "./PingPongDemo.sol"; -import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +// import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; -contract SelfFundedPingPong is PingPongDemo { - string public constant override typeAndVersion = "SelfFundedPingPong 1.2.0"; +// contract SelfFundedPingPong is PingPongDemo { +// string public constant override typeAndVersion = "SelfFundedPingPong 1.2.0"; - event Funded(); - event CountIncrBeforeFundingSet(uint8 countIncrBeforeFunding); +// event Funded(); +// event CountIncrBeforeFundingSet(uint8 countIncrBeforeFunding); - // Defines the increase in ping pong count before self-funding is attempted. - // Set to 0 to disable auto-funding, auto-funding only works for ping-pongs that are set as NOPs in the onRamp. - uint8 private s_countIncrBeforeFunding; +// // Defines the increase in ping pong count before self-funding is attempted. +// // Set to 0 to disable auto-funding, auto-funding only works for ping-pongs that are set as NOPs in the onRamp. +// uint8 private s_countIncrBeforeFunding; - constructor(address router, IERC20 feeToken, uint8 roundTripsBeforeFunding) PingPongDemo(router, feeToken) { - // PingPong count increases by 2 for each round trip. - s_countIncrBeforeFunding = roundTripsBeforeFunding * 2; - } +// constructor(address router, IERC20 feeToken, uint8 roundTripsBeforeFunding) PingPongDemo(router, feeToken) { +// // PingPong count increases by 2 for each round trip. +// s_countIncrBeforeFunding = roundTripsBeforeFunding * 2; +// } - function _respond(uint256 pingPongCount) internal override { - if (pingPongCount & 1 == 1) { - emit Ping(pingPongCount); - } else { - emit Pong(pingPongCount); - } +// function _respond(uint256 pingPongCount) internal override { +// if (pingPongCount & 1 == 1) { +// emit Ping(pingPongCount); +// } else { +// emit Pong(pingPongCount); +// } - fundPingPong(pingPongCount); +// fundPingPong(pingPongCount); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(s_counterpartAddress), - data: abi.encode(pingPongCount), - tokenAmounts: new Client.EVMTokenAmount[](0), - extraArgs: "", - feeToken: address(s_feeToken) - }); - Router(getRouter()).ccipSend(s_counterpartChainSelector, message); - } +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(s_counterpartAddress), +// data: abi.encode(pingPongCount), +// tokenAmounts: new Client.EVMTokenAmount[](0), +// extraArgs: "", +// feeToken: address(s_feeToken) +// }); +// Router(getRouter()).ccipSend(s_counterpartChainSelector, message); +// } - /// @notice A function that is responsible for funding this contract. - /// The contract can only be funded if it is set as a nop in the target onRamp. - /// In case your contract is not a nop you can prevent this function from being called by setting s_countIncrBeforeFunding=0. - function fundPingPong(uint256 pingPongCount) public { - // If selfFunding is disabled, or ping pong count has not reached s_countIncrPerFunding, do not attempt funding. - if (s_countIncrBeforeFunding == 0 || pingPongCount < s_countIncrBeforeFunding) return; +// /// @notice A function that is responsible for funding this contract. +// /// The contract can only be funded if it is set as a nop in the target onRamp. +// /// In case your contract is not a nop you can prevent this function from being called by setting s_countIncrBeforeFunding=0. +// function fundPingPong(uint256 pingPongCount) public { +// // If selfFunding is disabled, or ping pong count has not reached s_countIncrPerFunding, do not attempt funding. +// if (s_countIncrBeforeFunding == 0 || pingPongCount < s_countIncrBeforeFunding) return; - // Ping pong on one side will always be even, one side will always to odd. - if (pingPongCount % s_countIncrBeforeFunding <= 1) { - EVM2EVMOnRamp(Router(getRouter()).getOnRamp(s_counterpartChainSelector)).payNops(); - emit Funded(); - } - } +// // Ping pong on one side will always be even, one side will always to odd. +// if (pingPongCount % s_countIncrBeforeFunding <= 1) { +// EVM2EVMOnRamp(Router(getRouter()).getOnRamp(s_counterpartChainSelector)).payNops(); +// emit Funded(); +// } +// } - function getCountIncrBeforeFunding() external view returns (uint8) { - return s_countIncrBeforeFunding; - } +// function getCountIncrBeforeFunding() external view returns (uint8) { +// return s_countIncrBeforeFunding; +// } - function setCountIncrBeforeFunding(uint8 countIncrBeforeFunding) public onlyOwner { - s_countIncrBeforeFunding = countIncrBeforeFunding; - emit CountIncrBeforeFundingSet(countIncrBeforeFunding); - } -} +// function setCountIncrBeforeFunding(uint8 countIncrBeforeFunding) public onlyOwner { +// s_countIncrBeforeFunding = countIncrBeforeFunding; +// emit CountIncrBeforeFundingSet(countIncrBeforeFunding); +// } +// } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol new file mode 100644 index 0000000000..8e80ccc2b1 --- /dev/null +++ b/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol"; + +import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; +import {Client} from "../libraries/Client.sol"; +import {CCIPClientBase} from "./CCIPClientBase.sol"; + +/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. +contract CCIPReceiverBasic is CCIPClientBase, IAny2EVMMessageReceiver, IERC165 { + constructor(address router) CCIPClientBase(router) {} + + function typeAndVersion() external pure virtual returns (string memory) { + return "CCIPReceiverBasic 1.0.0-dev"; + } + + /// @notice IERC165 supports an interfaceId + /// @param interfaceId The interfaceId to check + /// @return true if the interfaceId is supported + /// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver + /// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId + /// This allows CCIP to check if ccipReceive is available before calling it. + /// If this returns false or reverts, only tokens are transferred to the receiver. + /// If this returns true, tokens are transferred and ccipReceive is called atomically. + /// Additionally, if the receiver address does not have code associated with + /// it at the time of execution (EXTCODESIZE returns 0), only tokens will be transferred. + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; + } + + /// @inheritdoc IAny2EVMMessageReceiver + function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter { + _ccipReceive(message); + } + + /// @notice Override this function in your implementation. + /// @param message Any2EVMMessage + function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual {} +} diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol index 12a41f5b1a..1e6b0a4953 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol @@ -33,7 +33,7 @@ contract CCIPSender is CCIPClientBase { constructor(address router) CCIPClientBase(router) {} - function typeAndVersion() external pure override returns (string memory) { + function typeAndVersion() external pure virtual override returns (string memory) { return "CCIPSender 1.0.0-dev"; } diff --git a/contracts/src/v0.8/ccip/test/applications/DefensiveExample.t.sol b/contracts/src/v0.8/ccip/test/applications/DefensiveExample.t.sol index 18453f9f52..64e7f0eee9 100644 --- a/contracts/src/v0.8/ccip/test/applications/DefensiveExample.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/DefensiveExample.t.sol @@ -1,97 +1,97 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DefensiveExample} from "../../applications/DefensiveExample.sol"; -import {Client} from "../../libraries/Client.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -contract DefensiveExampleTest is EVM2EVMOnRampSetup { - event MessageFailed(bytes32 indexed messageId, bytes reason); - event MessageSucceeded(bytes32 indexed messageId); - event MessageRecovered(bytes32 indexed messageId); - - DefensiveExample internal s_receiver; - uint64 internal sourceChainSelector = 7331; - - function setUp() public virtual override { - EVM2EVMOnRampSetup.setUp(); - - s_receiver = new DefensiveExample(s_destRouter, IERC20(s_destFeeToken)); - s_receiver.enableChain(sourceChainSelector, abi.encode("")); - } - - function test_Recovery() public { - bytes32 messageId = keccak256("messageId"); - address token = address(s_destFeeToken); - uint256 amount = 111333333777; - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); - - // Make sure we give the receiver contract enough tokens like CCIP would. - deal(token, address(s_receiver), amount); - - // Make sure the contract call reverts so we can test recovery. - s_receiver.setSimRevert(true); - - // The receiver contract will revert if the router is not the sender. - vm.startPrank(address(s_destRouter)); - - vm.expectEmit(); - emit MessageFailed(messageId, abi.encodeWithSelector(DefensiveExample.ErrorCase.selector)); - - s_receiver.ccipReceive( - Client.Any2EVMMessage({ - messageId: messageId, - sourceChainSelector: sourceChainSelector, - sender: abi.encode(address(0)), // wrong sender, will revert internally - data: "", - destTokenAmounts: destTokenAmounts - }) - ); - - address tokenReceiver = address(0x000001337); - uint256 tokenReceiverBalancePre = IERC20(token).balanceOf(tokenReceiver); - uint256 receiverBalancePre = IERC20(token).balanceOf(address(s_receiver)); - - // Recovery can only be done by the owner. - vm.startPrank(OWNER); - - vm.expectEmit(); - emit MessageRecovered(messageId); - - s_receiver.retryFailedMessage(messageId, tokenReceiver); - - // Assert the tokens have successfully been rescued from the contract. - assertEq(IERC20(token).balanceOf(tokenReceiver), tokenReceiverBalancePre + amount); - assertEq(IERC20(token).balanceOf(address(s_receiver)), receiverBalancePre - amount); - } - - function test_HappyPath_Success() public { - bytes32 messageId = keccak256("messageId"); - address token = address(s_destFeeToken); - uint256 amount = 111333333777; - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); - - // Make sure we give the receiver contract enough tokens like CCIP would. - deal(token, address(s_receiver), amount); - - // The receiver contract will revert if the router is not the sender. - vm.startPrank(address(s_destRouter)); - - vm.expectEmit(); - emit MessageSucceeded(messageId); - - s_receiver.ccipReceive( - Client.Any2EVMMessage({ - messageId: messageId, - sourceChainSelector: sourceChainSelector, - sender: abi.encode(address(s_receiver)), // correct sender - data: "", - destTokenAmounts: destTokenAmounts - }) - ); - } -} +// // SPDX-License-Identifier: MIT +// pragma solidity ^0.8.0; + +// import {DefensiveExample} from "../../applications/DefensiveExample.sol"; +// import {Client} from "../../libraries/Client.sol"; +// import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +// import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +// contract DefensiveExampleTest is EVM2EVMOnRampSetup { +// event MessageFailed(bytes32 indexed messageId, bytes reason); +// event MessageSucceeded(bytes32 indexed messageId); +// event MessageRecovered(bytes32 indexed messageId); + +// DefensiveExample internal s_receiver; +// uint64 internal sourceChainSelector = 7331; + +// function setUp() public virtual override { +// EVM2EVMOnRampSetup.setUp(); + +// s_receiver = new DefensiveExample(s_destRouter, IERC20(s_destFeeToken)); +// s_receiver.enableChain(sourceChainSelector, abi.encode("")); +// } + +// function test_Recovery() public { +// bytes32 messageId = keccak256("messageId"); +// address token = address(s_destFeeToken); +// uint256 amount = 111333333777; +// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); +// destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + +// // Make sure we give the receiver contract enough tokens like CCIP would. +// deal(token, address(s_receiver), amount); + +// // Make sure the contract call reverts so we can test recovery. +// s_receiver.setSimRevert(true); + +// // The receiver contract will revert if the router is not the sender. +// vm.startPrank(address(s_destRouter)); + +// vm.expectEmit(); +// emit MessageFailed(messageId, abi.encodeWithSelector(DefensiveExample.ErrorCase.selector)); + +// s_receiver.ccipReceive( +// Client.Any2EVMMessage({ +// messageId: messageId, +// sourceChainSelector: sourceChainSelector, +// sender: abi.encode(address(0)), // wrong sender, will revert internally +// data: "", +// destTokenAmounts: destTokenAmounts +// }) +// ); + +// address tokenReceiver = address(0x000001337); +// uint256 tokenReceiverBalancePre = IERC20(token).balanceOf(tokenReceiver); +// uint256 receiverBalancePre = IERC20(token).balanceOf(address(s_receiver)); + +// // Recovery can only be done by the owner. +// vm.startPrank(OWNER); + +// vm.expectEmit(); +// emit MessageRecovered(messageId); + +// s_receiver.retryFailedMessage(messageId, tokenReceiver); + +// // Assert the tokens have successfully been rescued from the contract. +// assertEq(IERC20(token).balanceOf(tokenReceiver), tokenReceiverBalancePre + amount); +// assertEq(IERC20(token).balanceOf(address(s_receiver)), receiverBalancePre - amount); +// } + +// function test_HappyPath_Success() public { +// bytes32 messageId = keccak256("messageId"); +// address token = address(s_destFeeToken); +// uint256 amount = 111333333777; +// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); +// destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + +// // Make sure we give the receiver contract enough tokens like CCIP would. +// deal(token, address(s_receiver), amount); + +// // The receiver contract will revert if the router is not the sender. +// vm.startPrank(address(s_destRouter)); + +// vm.expectEmit(); +// emit MessageSucceeded(messageId); + +// s_receiver.ccipReceive( +// Client.Any2EVMMessage({ +// messageId: messageId, +// sourceChainSelector: sourceChainSelector, +// sender: abi.encode(address(s_receiver)), // correct sender +// data: "", +// destTokenAmounts: destTokenAmounts +// }) +// ); +// } +// } diff --git a/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver.t.sol b/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver.t.sol index cfd402d910..aa2312ac22 100644 --- a/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver.t.sol @@ -1,718 +1,718 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Test} from "forge-std/Test.sol"; - -import {CCIPRouter} from "../../applications/EtherSenderReceiver.sol"; - -import {IRouterClient} from "../../interfaces/IRouterClient.sol"; -import {Client} from "../../libraries/Client.sol"; -import {WETH9} from "../WETH9.sol"; -import {EtherSenderReceiverHelper} from "./../helpers/EtherSenderReceiverHelper.sol"; - -import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; - -contract EtherSenderReceiverTest is Test { - EtherSenderReceiverHelper internal s_etherSenderReceiver; - WETH9 internal s_weth; - WETH9 internal s_someOtherWeth; - ERC20 internal s_linkToken; - - address internal constant OWNER = 0x00007e64E1fB0C487F25dd6D3601ff6aF8d32e4e; - address internal constant ROUTER = 0x0F3779ee3a832D10158073ae2F5e61ac7FBBF880; - address internal constant XCHAIN_RECEIVER = 0xBd91b2073218AF872BF73b65e2e5950ea356d147; - - function setUp() public { - vm.startPrank(OWNER); - - s_linkToken = new ERC20("Chainlink Token", "LINK"); - s_someOtherWeth = new WETH9(); - s_weth = new WETH9(); - vm.mockCall(ROUTER, abi.encodeWithSelector(CCIPRouter.getWrappedNative.selector), abi.encode(address(s_weth))); - s_etherSenderReceiver = new EtherSenderReceiverHelper(ROUTER); - - deal(OWNER, 1_000_000 ether); - deal(address(s_linkToken), OWNER, 1_000_000 ether); - - // deposit some eth into the weth contract. - s_weth.deposit{value: 10 ether}(); - uint256 wethSupply = s_weth.totalSupply(); - assertEq(wethSupply, 10 ether, "total weth supply must be 10 ether"); - } -} - -contract EtherSenderReceiverTest_constructor is EtherSenderReceiverTest { - function test_constructor() public view { - assertEq(s_etherSenderReceiver.getRouter(), ROUTER, "router must be set correctly"); - uint256 allowance = s_weth.allowance(address(s_etherSenderReceiver), ROUTER); - assertEq(allowance, type(uint256).max, "allowance must be set infinite"); - } -} - -contract EtherSenderReceiverTest_validateFeeToken is EtherSenderReceiverTest { - uint256 internal constant amount = 100; - - error InsufficientMsgValue(uint256 gotAmount, uint256 msgValue); - error TokenAmountNotEqualToMsgValue(uint256 gotAmount, uint256 msgValue); - - function test_validateFeeToken_valid_native() public { - Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); - tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmount, - feeToken: address(0), - extraArgs: "" - }); - - s_etherSenderReceiver.validateFeeToken{value: amount + 1}(message); - } - - function test_validateFeeToken_valid_feeToken() public { - Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); - tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmount, - feeToken: address(s_weth), - extraArgs: "" - }); - - s_etherSenderReceiver.validateFeeToken{value: amount}(message); - } - - function test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() public { - Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); - tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmount, - feeToken: address(s_weth), - extraArgs: "" - }); - - vm.expectRevert(abi.encodeWithSelector(TokenAmountNotEqualToMsgValue.selector, amount, amount + 1)); - s_etherSenderReceiver.validateFeeToken{value: amount + 1}(message); - } -} - -contract EtherSenderReceiverTest_validatedMessage is EtherSenderReceiverTest { - error InvalidDestinationReceiver(bytes destReceiver); - error InvalidTokenAmounts(uint256 gotAmounts); - error InvalidWethAddress(address want, address got); - error GasLimitTooLow(uint256 minLimit, uint256 gotLimit); - - uint256 internal constant amount = 100; - - function test_Fuzz_validatedMessage_msgSenderOverwrite(bytes memory data) public view { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: data, - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); - assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); - assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); - assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); - assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); - assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); - } - - function test_Fuzz_validatedMessage_tokenAddressOverwrite(address token) public view { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); - assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); - assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); - assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); - assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); - assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); - } - - function test_validatedMessage_emptyDataOverwrittenToMsgSender() public view { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); - assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); - assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); - assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); - assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); - assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); - } - - function test_validatedMessage_dataOverwrittenToMsgSender() public view { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: abi.encode(address(42)), - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); - assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); - assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); - assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); - assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); - assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); - } - - function test_validatedMessage_tokenOverwrittenToWeth() public view { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(42), // incorrect token. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); - assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); - assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); - assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); - assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); - assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); - } - - function test_validatedMessage_validMessage_extraArgs() public view { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 200_000})) - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); - assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); - assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); - assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); - assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); - assertEq( - validatedMessage.extraArgs, - Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 200_000})), - "extraArgs must be correct" - ); - } - - function test_validatedMessage_invalidTokenAmounts() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2); - tokenAmounts[0] = Client.EVMTokenAmount({token: address(0), amount: amount}); - tokenAmounts[1] = Client.EVMTokenAmount({token: address(0), amount: amount}); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - vm.expectRevert(abi.encodeWithSelector(InvalidTokenAmounts.selector, uint256(2))); - s_etherSenderReceiver.validatedMessage(message); - } -} - -contract EtherSenderReceiverTest_getFee is EtherSenderReceiverTest { - uint64 internal constant destinationChainSelector = 424242; - uint256 internal constant feeWei = 121212; - uint256 internal constant amount = 100; - - function test_getFee() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({token: address(0), amount: amount}); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeWei) - ); - - uint256 fee = s_etherSenderReceiver.getFee(destinationChainSelector, message); - assertEq(fee, feeWei, "fee must be feeWei"); - } -} - -contract EtherSenderReceiverTest_ccipReceive is EtherSenderReceiverTest { - uint256 internal constant amount = 100; - uint64 internal constant sourceChainSelector = 424242; - address internal constant XCHAIN_SENDER = 0x9951529C13B01E542f7eE3b6D6665D292e9BA2E0; - - error InvalidTokenAmounts(uint256 gotAmounts); - error InvalidToken(address gotToken, address expectedToken); - - function test_Fuzz_ccipReceive(uint256 tokenAmount) public { - // cap to 10 ether because OWNER only has 10 ether. - if (tokenAmount > 10 ether) { - return; - } - - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: tokenAmount}); - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: keccak256(abi.encode("ccip send")), - sourceChainSelector: sourceChainSelector, - sender: abi.encode(XCHAIN_SENDER), - data: abi.encode(OWNER), - destTokenAmounts: destTokenAmounts - }); - - // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. - s_weth.transfer(address(s_etherSenderReceiver), tokenAmount); - - uint256 balanceBefore = OWNER.balance; - s_etherSenderReceiver.publicCcipReceive(message); - uint256 balanceAfter = OWNER.balance; - assertEq(balanceAfter, balanceBefore + tokenAmount, "balance must be correct"); - } - - function test_ccipReceive_happyPath() public { - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: keccak256(abi.encode("ccip send")), - sourceChainSelector: 424242, - sender: abi.encode(XCHAIN_SENDER), - data: abi.encode(OWNER), - destTokenAmounts: destTokenAmounts - }); - - // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. - s_weth.transfer(address(s_etherSenderReceiver), amount); - - uint256 balanceBefore = OWNER.balance; - s_etherSenderReceiver.publicCcipReceive(message); - uint256 balanceAfter = OWNER.balance; - assertEq(balanceAfter, balanceBefore + amount, "balance must be correct"); - } - - function test_ccipReceive_fallbackToWethTransfer() public { - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: keccak256(abi.encode("ccip send")), - sourceChainSelector: 424242, - sender: abi.encode(XCHAIN_SENDER), - data: abi.encode(address(s_linkToken)), // ERC20 cannot receive() ether. - destTokenAmounts: destTokenAmounts - }); - - // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. - s_weth.transfer(address(s_etherSenderReceiver), amount); - - uint256 balanceBefore = address(s_linkToken).balance; - s_etherSenderReceiver.publicCcipReceive(message); - uint256 balanceAfter = address(s_linkToken).balance; - assertEq(balanceAfter, balanceBefore, "balance must be unchanged"); - uint256 wethBalance = s_weth.balanceOf(address(s_linkToken)); - assertEq(wethBalance, amount, "weth balance must be correct"); - } - - function test_ccipReceive_wrongTokenAmount() public { - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](2); - destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); - destTokenAmounts[1] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: keccak256(abi.encode("ccip send")), - sourceChainSelector: 424242, - sender: abi.encode(XCHAIN_SENDER), - data: abi.encode(OWNER), - destTokenAmounts: destTokenAmounts - }); - - vm.expectRevert(abi.encodeWithSelector(InvalidTokenAmounts.selector, uint256(2))); - s_etherSenderReceiver.publicCcipReceive(message); - } - - function test_ccipReceive_wrongToken() public { - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); - destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_someOtherWeth), amount: amount}); - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: keccak256(abi.encode("ccip send")), - sourceChainSelector: 424242, - sender: abi.encode(XCHAIN_SENDER), - data: abi.encode(OWNER), - destTokenAmounts: destTokenAmounts - }); - - vm.expectRevert(abi.encodeWithSelector(InvalidToken.selector, address(s_someOtherWeth), address(s_weth))); - s_etherSenderReceiver.publicCcipReceive(message); - } -} - -contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTest { - error InsufficientFee(uint256 gotFee, uint256 fee); - - uint256 internal constant amount = 100; - uint64 internal constant destinationChainSelector = 424242; - uint256 internal constant feeWei = 121212; - uint256 internal constant feeJuels = 232323; - - function test_Fuzz_ccipSend(uint256 feeFromRouter, uint256 feeSupplied) public { - // cap the fuzzer because OWNER only has a million ether. - vm.assume(feeSupplied < 1_000_000 ether - amount); - - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeFromRouter) - ); - - if (feeSupplied < feeFromRouter) { - vm.expectRevert(); - s_etherSenderReceiver.ccipSend{value: amount + feeSupplied}(destinationChainSelector, message); - } else { - bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); - vm.mockCall( - ROUTER, - feeSupplied, - abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), - abi.encode(expectedMsgId) - ); - - bytes32 actualMsgId = - s_etherSenderReceiver.ccipSend{value: amount + feeSupplied}(destinationChainSelector, message); - assertEq(actualMsgId, expectedMsgId, "message id must be correct"); - } - } - - function test_Fuzz_ccipSend_feeToken(uint256 feeFromRouter, uint256 feeSupplied) public { - // cap the fuzzer because OWNER only has a million LINK. - vm.assume(feeSupplied < 1_000_000 ether - amount); - - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(s_linkToken), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeFromRouter) - ); - - s_linkToken.approve(address(s_etherSenderReceiver), feeSupplied); - - if (feeSupplied < feeFromRouter) { - vm.expectRevert(); - s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); - } else { - bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), - abi.encode(expectedMsgId) - ); - - bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); - assertEq(actualMsgId, expectedMsgId, "message id must be correct"); - } - } - - function test_ccipSend_reverts_insufficientFee_weth() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(s_weth), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeWei) - ); - - s_weth.approve(address(s_etherSenderReceiver), feeWei - 1); - - vm.expectRevert("SafeERC20: low-level call failed"); - s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); - } - - function test_ccipSend_reverts_insufficientFee_feeToken() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(s_linkToken), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeJuels) - ); - - s_linkToken.approve(address(s_etherSenderReceiver), feeJuels - 1); - - vm.expectRevert("ERC20: insufficient allowance"); - s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); - } - - function test_ccipSend_reverts_insufficientFee_native() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeWei) - ); - - vm.expectRevert(); - s_etherSenderReceiver.ccipSend{value: amount + feeWei - 1}(destinationChainSelector, message); - } - - function test_ccipSend_success_nativeExcess() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeWei) - ); - - // we assert that the correct value is sent to the router call, which should be - // the msg.value - feeWei. - vm.mockCall( - ROUTER, - feeWei + 1, - abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), - abi.encode(expectedMsgId) - ); - - bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount + feeWei + 1}(destinationChainSelector, message); - assertEq(actualMsgId, expectedMsgId, "message id must be correct"); - } - - function test_ccipSend_success_native() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeWei) - ); - vm.mockCall( - ROUTER, - feeWei, - abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), - abi.encode(expectedMsgId) - ); - - bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount + feeWei}(destinationChainSelector, message); - assertEq(actualMsgId, expectedMsgId, "message id must be correct"); - } - - function test_ccipSend_success_feeToken() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(s_linkToken), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeJuels) - ); - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), - abi.encode(expectedMsgId) - ); - - s_linkToken.approve(address(s_etherSenderReceiver), feeJuels); - - bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); - assertEq(actualMsgId, expectedMsgId, "message id must be correct"); - uint256 routerAllowance = s_linkToken.allowance(address(s_etherSenderReceiver), ROUTER); - assertEq(routerAllowance, feeJuels, "router allowance must be feeJuels"); - } - - function test_ccipSend_success_weth() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({ - token: address(0), // callers may not specify this. - amount: amount - }); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(XCHAIN_RECEIVER), - data: "", - tokenAmounts: tokenAmounts, - feeToken: address(s_weth), - extraArgs: "" - }); - - Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - - bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), - abi.encode(feeWei) - ); - vm.mockCall( - ROUTER, - abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), - abi.encode(expectedMsgId) - ); - - s_weth.approve(address(s_etherSenderReceiver), feeWei); - - bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); - assertEq(actualMsgId, expectedMsgId, "message id must be correct"); - uint256 routerAllowance = s_weth.allowance(address(s_etherSenderReceiver), ROUTER); - assertEq(routerAllowance, type(uint256).max, "router allowance must be max for weth"); - } -} +// // SPDX-License-Identifier: MIT +// pragma solidity ^0.8.0; + +// import {Test} from "forge-std/Test.sol"; + +// import {CCIPRouter} from "../../applications/EtherSenderReceiver.sol"; + +// import {IRouterClient} from "../../interfaces/IRouterClient.sol"; +// import {Client} from "../../libraries/Client.sol"; +// import {WETH9} from "../WETH9.sol"; +// import {EtherSenderReceiverHelper} from "./../helpers/EtherSenderReceiverHelper.sol"; + +// import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; + +// contract EtherSenderReceiverTest is Test { +// EtherSenderReceiverHelper internal s_etherSenderReceiver; +// WETH9 internal s_weth; +// WETH9 internal s_someOtherWeth; +// ERC20 internal s_linkToken; + +// address internal constant OWNER = 0x00007e64E1fB0C487F25dd6D3601ff6aF8d32e4e; +// address internal constant ROUTER = 0x0F3779ee3a832D10158073ae2F5e61ac7FBBF880; +// address internal constant XCHAIN_RECEIVER = 0xBd91b2073218AF872BF73b65e2e5950ea356d147; + +// function setUp() public { +// vm.startPrank(OWNER); + +// s_linkToken = new ERC20("Chainlink Token", "LINK"); +// s_someOtherWeth = new WETH9(); +// s_weth = new WETH9(); +// vm.mockCall(ROUTER, abi.encodeWithSelector(CCIPRouter.getWrappedNative.selector), abi.encode(address(s_weth))); +// s_etherSenderReceiver = new EtherSenderReceiverHelper(ROUTER); + +// deal(OWNER, 1_000_000 ether); +// deal(address(s_linkToken), OWNER, 1_000_000 ether); + +// // deposit some eth into the weth contract. +// s_weth.deposit{value: 10 ether}(); +// uint256 wethSupply = s_weth.totalSupply(); +// assertEq(wethSupply, 10 ether, "total weth supply must be 10 ether"); +// } +// } + +// contract EtherSenderReceiverTest_constructor is EtherSenderReceiverTest { +// function test_constructor() public view { +// assertEq(s_etherSenderReceiver.getRouter(), ROUTER, "router must be set correctly"); +// uint256 allowance = s_weth.allowance(address(s_etherSenderReceiver), ROUTER); +// assertEq(allowance, type(uint256).max, "allowance must be set infinite"); +// } +// } + +// contract EtherSenderReceiverTest_validateFeeToken is EtherSenderReceiverTest { +// uint256 internal constant amount = 100; + +// error InsufficientMsgValue(uint256 gotAmount, uint256 msgValue); +// error TokenAmountNotEqualToMsgValue(uint256 gotAmount, uint256 msgValue); + +// function test_validateFeeToken_valid_native() public { +// Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); +// tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmount, +// feeToken: address(0), +// extraArgs: "" +// }); + +// s_etherSenderReceiver.validateFeeToken{value: amount + 1}(message); +// } + +// function test_validateFeeToken_valid_feeToken() public { +// Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); +// tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmount, +// feeToken: address(s_weth), +// extraArgs: "" +// }); + +// s_etherSenderReceiver.validateFeeToken{value: amount}(message); +// } + +// function test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() public { +// Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); +// tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmount, +// feeToken: address(s_weth), +// extraArgs: "" +// }); + +// vm.expectRevert(abi.encodeWithSelector(TokenAmountNotEqualToMsgValue.selector, amount, amount + 1)); +// s_etherSenderReceiver.validateFeeToken{value: amount + 1}(message); +// } +// } + +// contract EtherSenderReceiverTest_validatedMessage is EtherSenderReceiverTest { +// error InvalidDestinationReceiver(bytes destReceiver); +// error InvalidTokenAmounts(uint256 gotAmounts); +// error InvalidWethAddress(address want, address got); +// error GasLimitTooLow(uint256 minLimit, uint256 gotLimit); + +// uint256 internal constant amount = 100; + +// function test_Fuzz_validatedMessage_msgSenderOverwrite(bytes memory data) public view { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: data, +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); +// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); +// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); +// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); +// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); +// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); +// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); +// } + +// function test_Fuzz_validatedMessage_tokenAddressOverwrite(address token) public view { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); +// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); +// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); +// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); +// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); +// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); +// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); +// } + +// function test_validatedMessage_emptyDataOverwrittenToMsgSender() public view { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); +// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); +// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); +// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); +// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); +// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); +// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); +// } + +// function test_validatedMessage_dataOverwrittenToMsgSender() public view { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: abi.encode(address(42)), +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); +// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); +// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); +// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); +// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); +// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); +// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); +// } + +// function test_validatedMessage_tokenOverwrittenToWeth() public view { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(42), // incorrect token. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); +// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); +// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); +// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); +// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); +// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); +// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); +// } + +// function test_validatedMessage_validMessage_extraArgs() public view { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 200_000})) +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); +// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); +// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); +// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); +// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); +// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); +// assertEq( +// validatedMessage.extraArgs, +// Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 200_000})), +// "extraArgs must be correct" +// ); +// } + +// function test_validatedMessage_invalidTokenAmounts() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2); +// tokenAmounts[0] = Client.EVMTokenAmount({token: address(0), amount: amount}); +// tokenAmounts[1] = Client.EVMTokenAmount({token: address(0), amount: amount}); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// vm.expectRevert(abi.encodeWithSelector(InvalidTokenAmounts.selector, uint256(2))); +// s_etherSenderReceiver.validatedMessage(message); +// } +// } + +// contract EtherSenderReceiverTest_getFee is EtherSenderReceiverTest { +// uint64 internal constant destinationChainSelector = 424242; +// uint256 internal constant feeWei = 121212; +// uint256 internal constant amount = 100; + +// function test_getFee() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({token: address(0), amount: amount}); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeWei) +// ); + +// uint256 fee = s_etherSenderReceiver.getFee(destinationChainSelector, message); +// assertEq(fee, feeWei, "fee must be feeWei"); +// } +// } + +// contract EtherSenderReceiverTest_ccipReceive is EtherSenderReceiverTest { +// uint256 internal constant amount = 100; +// uint64 internal constant sourceChainSelector = 424242; +// address internal constant XCHAIN_SENDER = 0x9951529C13B01E542f7eE3b6D6665D292e9BA2E0; + +// error InvalidTokenAmounts(uint256 gotAmounts); +// error InvalidToken(address gotToken, address expectedToken); + +// function test_Fuzz_ccipReceive(uint256 tokenAmount) public { +// // cap to 10 ether because OWNER only has 10 ether. +// if (tokenAmount > 10 ether) { +// return; +// } + +// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); +// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: tokenAmount}); +// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ +// messageId: keccak256(abi.encode("ccip send")), +// sourceChainSelector: sourceChainSelector, +// sender: abi.encode(XCHAIN_SENDER), +// data: abi.encode(OWNER), +// destTokenAmounts: destTokenAmounts +// }); + +// // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. +// s_weth.transfer(address(s_etherSenderReceiver), tokenAmount); + +// uint256 balanceBefore = OWNER.balance; +// s_etherSenderReceiver.publicCcipReceive(message); +// uint256 balanceAfter = OWNER.balance; +// assertEq(balanceAfter, balanceBefore + tokenAmount, "balance must be correct"); +// } + +// function test_ccipReceive_happyPath() public { +// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); +// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); +// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ +// messageId: keccak256(abi.encode("ccip send")), +// sourceChainSelector: 424242, +// sender: abi.encode(XCHAIN_SENDER), +// data: abi.encode(OWNER), +// destTokenAmounts: destTokenAmounts +// }); + +// // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. +// s_weth.transfer(address(s_etherSenderReceiver), amount); + +// uint256 balanceBefore = OWNER.balance; +// s_etherSenderReceiver.publicCcipReceive(message); +// uint256 balanceAfter = OWNER.balance; +// assertEq(balanceAfter, balanceBefore + amount, "balance must be correct"); +// } + +// function test_ccipReceive_fallbackToWethTransfer() public { +// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); +// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); +// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ +// messageId: keccak256(abi.encode("ccip send")), +// sourceChainSelector: 424242, +// sender: abi.encode(XCHAIN_SENDER), +// data: abi.encode(address(s_linkToken)), // ERC20 cannot receive() ether. +// destTokenAmounts: destTokenAmounts +// }); + +// // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. +// s_weth.transfer(address(s_etherSenderReceiver), amount); + +// uint256 balanceBefore = address(s_linkToken).balance; +// s_etherSenderReceiver.publicCcipReceive(message); +// uint256 balanceAfter = address(s_linkToken).balance; +// assertEq(balanceAfter, balanceBefore, "balance must be unchanged"); +// uint256 wethBalance = s_weth.balanceOf(address(s_linkToken)); +// assertEq(wethBalance, amount, "weth balance must be correct"); +// } + +// function test_ccipReceive_wrongTokenAmount() public { +// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](2); +// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); +// destTokenAmounts[1] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); +// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ +// messageId: keccak256(abi.encode("ccip send")), +// sourceChainSelector: 424242, +// sender: abi.encode(XCHAIN_SENDER), +// data: abi.encode(OWNER), +// destTokenAmounts: destTokenAmounts +// }); + +// vm.expectRevert(abi.encodeWithSelector(InvalidTokenAmounts.selector, uint256(2))); +// s_etherSenderReceiver.publicCcipReceive(message); +// } + +// function test_ccipReceive_wrongToken() public { +// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); +// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_someOtherWeth), amount: amount}); +// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ +// messageId: keccak256(abi.encode("ccip send")), +// sourceChainSelector: 424242, +// sender: abi.encode(XCHAIN_SENDER), +// data: abi.encode(OWNER), +// destTokenAmounts: destTokenAmounts +// }); + +// vm.expectRevert(abi.encodeWithSelector(InvalidToken.selector, address(s_someOtherWeth), address(s_weth))); +// s_etherSenderReceiver.publicCcipReceive(message); +// } +// } + +// contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTest { +// error InsufficientFee(uint256 gotFee, uint256 fee); + +// uint256 internal constant amount = 100; +// uint64 internal constant destinationChainSelector = 424242; +// uint256 internal constant feeWei = 121212; +// uint256 internal constant feeJuels = 232323; + +// function test_Fuzz_ccipSend(uint256 feeFromRouter, uint256 feeSupplied) public { +// // cap the fuzzer because OWNER only has a million ether. +// vm.assume(feeSupplied < 1_000_000 ether - amount); + +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeFromRouter) +// ); + +// if (feeSupplied < feeFromRouter) { +// vm.expectRevert(); +// s_etherSenderReceiver.ccipSend{value: amount + feeSupplied}(destinationChainSelector, message); +// } else { +// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); +// vm.mockCall( +// ROUTER, +// feeSupplied, +// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), +// abi.encode(expectedMsgId) +// ); + +// bytes32 actualMsgId = +// s_etherSenderReceiver.ccipSend{value: amount + feeSupplied}(destinationChainSelector, message); +// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); +// } +// } + +// function test_Fuzz_ccipSend_feeToken(uint256 feeFromRouter, uint256 feeSupplied) public { +// // cap the fuzzer because OWNER only has a million LINK. +// vm.assume(feeSupplied < 1_000_000 ether - amount); + +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(s_linkToken), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeFromRouter) +// ); + +// s_linkToken.approve(address(s_etherSenderReceiver), feeSupplied); + +// if (feeSupplied < feeFromRouter) { +// vm.expectRevert(); +// s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); +// } else { +// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), +// abi.encode(expectedMsgId) +// ); + +// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); +// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); +// } +// } + +// function test_ccipSend_reverts_insufficientFee_weth() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(s_weth), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeWei) +// ); + +// s_weth.approve(address(s_etherSenderReceiver), feeWei - 1); + +// vm.expectRevert("SafeERC20: low-level call failed"); +// s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); +// } + +// function test_ccipSend_reverts_insufficientFee_feeToken() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(s_linkToken), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeJuels) +// ); + +// s_linkToken.approve(address(s_etherSenderReceiver), feeJuels - 1); + +// vm.expectRevert("ERC20: insufficient allowance"); +// s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); +// } + +// function test_ccipSend_reverts_insufficientFee_native() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeWei) +// ); + +// vm.expectRevert(); +// s_etherSenderReceiver.ccipSend{value: amount + feeWei - 1}(destinationChainSelector, message); +// } + +// function test_ccipSend_success_nativeExcess() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeWei) +// ); + +// // we assert that the correct value is sent to the router call, which should be +// // the msg.value - feeWei. +// vm.mockCall( +// ROUTER, +// feeWei + 1, +// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), +// abi.encode(expectedMsgId) +// ); + +// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount + feeWei + 1}(destinationChainSelector, message); +// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); +// } + +// function test_ccipSend_success_native() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(0), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeWei) +// ); +// vm.mockCall( +// ROUTER, +// feeWei, +// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), +// abi.encode(expectedMsgId) +// ); + +// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount + feeWei}(destinationChainSelector, message); +// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); +// } + +// function test_ccipSend_success_feeToken() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(s_linkToken), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeJuels) +// ); +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), +// abi.encode(expectedMsgId) +// ); + +// s_linkToken.approve(address(s_etherSenderReceiver), feeJuels); + +// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); +// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); +// uint256 routerAllowance = s_linkToken.allowance(address(s_etherSenderReceiver), ROUTER); +// assertEq(routerAllowance, feeJuels, "router allowance must be feeJuels"); +// } + +// function test_ccipSend_success_weth() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({ +// token: address(0), // callers may not specify this. +// amount: amount +// }); +// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ +// receiver: abi.encode(XCHAIN_RECEIVER), +// data: "", +// tokenAmounts: tokenAmounts, +// feeToken: address(s_weth), +// extraArgs: "" +// }); + +// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); + +// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), +// abi.encode(feeWei) +// ); +// vm.mockCall( +// ROUTER, +// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), +// abi.encode(expectedMsgId) +// ); + +// s_weth.approve(address(s_etherSenderReceiver), feeWei); + +// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); +// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); +// uint256 routerAllowance = s_weth.allowance(address(s_etherSenderReceiver), ROUTER); +// assertEq(routerAllowance, type(uint256).max, "router allowance must be max for weth"); +// } +// } diff --git a/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol b/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol index c1ea303d68..327e93ef24 100644 --- a/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol @@ -1,61 +1,61 @@ -pragma solidity ^0.8.0; - -import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol"; - -import {CCIPClientExample} from "../../applications/CCIPClientExample.sol"; -import {Client} from "../../libraries/Client.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; -import {ERC165Checker} from - "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/ERC165Checker.sol"; - -contract CCIPClientExample_sanity is EVM2EVMOnRampSetup { - function test_Examples() public { - CCIPClientExample exampleContract = new CCIPClientExample(s_sourceRouter, IERC20(s_sourceFeeToken)); - deal(address(exampleContract), 100 ether); - deal(s_sourceFeeToken, address(exampleContract), 100 ether); - - // feeToken approval works - assertEq(IERC20(s_sourceFeeToken).allowance(address(exampleContract), address(s_sourceRouter)), 2 ** 256 - 1); - - // Can set chain - Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 300_000}); - bytes memory encodedExtraArgs = Client._argsToBytes(extraArgs); - exampleContract.enableChain(DEST_CHAIN_SELECTOR, encodedExtraArgs); - assertEq(exampleContract.s_chains(DEST_CHAIN_SELECTOR), encodedExtraArgs); - - address toAddress = address(100); - - // Can send data pay native - exampleContract.sendDataPayNative(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello")); - - // Can send data pay feeToken - exampleContract.sendDataPayFeeToken(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello")); - - // Can send data tokens - address sourceToken = s_sourceTokens[1]; - assertEq( - address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_SELECTOR, IERC20(sourceToken))), - address(s_sourcePoolByToken[sourceToken]) - ); - deal(sourceToken, OWNER, 100 ether); - IERC20(sourceToken).approve(address(exampleContract), 1 ether); - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({token: sourceToken, amount: 1 ether}); - exampleContract.sendDataAndTokens(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello"), tokenAmounts); - // Tokens transferred from owner to router then burned in pool. - assertEq(IERC20(sourceToken).balanceOf(OWNER), 99 ether); - assertEq(IERC20(sourceToken).balanceOf(address(s_sourceRouter)), 0); - - // Can send just tokens - IERC20(sourceToken).approve(address(exampleContract), 1 ether); - exampleContract.sendTokens(DEST_CHAIN_SELECTOR, abi.encode(toAddress), tokenAmounts); - - // Can receive - assertTrue(ERC165Checker.supportsInterface(address(exampleContract), type(IAny2EVMMessageReceiver).interfaceId)); - - // Can disable chain - exampleContract.disableChain(DEST_CHAIN_SELECTOR); - } -} +// pragma solidity ^0.8.0; + +// import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol"; + +// import {CCIPClientExample} from "../../applications/CCIPClientExample.sol"; +// import {Client} from "../../libraries/Client.sol"; +// import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +// import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +// import {ERC165Checker} from +// "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/ERC165Checker.sol"; + +// contract CCIPClientExample_sanity is EVM2EVMOnRampSetup { +// function test_Examples() public { +// CCIPClientExample exampleContract = new CCIPClientExample(s_sourceRouter, IERC20(s_sourceFeeToken)); +// deal(address(exampleContract), 100 ether); +// deal(s_sourceFeeToken, address(exampleContract), 100 ether); + +// // feeToken approval works +// assertEq(IERC20(s_sourceFeeToken).allowance(address(exampleContract), address(s_sourceRouter)), 2 ** 256 - 1); + +// // Can set chain +// Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 300_000}); +// bytes memory encodedExtraArgs = Client._argsToBytes(extraArgs); +// exampleContract.enableChain(DEST_CHAIN_SELECTOR, encodedExtraArgs); +// assertEq(exampleContract.s_chains(DEST_CHAIN_SELECTOR), encodedExtraArgs); + +// address toAddress = address(100); + +// // Can send data pay native +// exampleContract.sendDataPayNative(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello")); + +// // Can send data pay feeToken +// exampleContract.sendDataPayFeeToken(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello")); + +// // Can send data tokens +// address sourceToken = s_sourceTokens[1]; +// assertEq( +// address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_SELECTOR, IERC20(sourceToken))), +// address(s_sourcePoolByToken[sourceToken]) +// ); +// deal(sourceToken, OWNER, 100 ether); +// IERC20(sourceToken).approve(address(exampleContract), 1 ether); +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); +// tokenAmounts[0] = Client.EVMTokenAmount({token: sourceToken, amount: 1 ether}); +// exampleContract.sendDataAndTokens(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello"), tokenAmounts); +// // Tokens transferred from owner to router then burned in pool. +// assertEq(IERC20(sourceToken).balanceOf(OWNER), 99 ether); +// assertEq(IERC20(sourceToken).balanceOf(address(s_sourceRouter)), 0); + +// // Can send just tokens +// IERC20(sourceToken).approve(address(exampleContract), 1 ether); +// exampleContract.sendTokens(DEST_CHAIN_SELECTOR, abi.encode(toAddress), tokenAmounts); + +// // Can receive +// assertTrue(ERC165Checker.supportsInterface(address(exampleContract), type(IAny2EVMMessageReceiver).interfaceId)); + +// // Can disable chain +// exampleContract.disableChain(DEST_CHAIN_SELECTOR); +// } +// } diff --git a/contracts/src/v0.8/ccip/test/applications/PingPongDemo.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPongDemo.t.sol index 4585accdcb..4fed9b2b09 100644 --- a/contracts/src/v0.8/ccip/test/applications/PingPongDemo.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/PingPongDemo.t.sol @@ -1,121 +1,121 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.24; - -import {PingPongDemo} from "../../applications/PingPongDemo.sol"; -import {Client} from "../../libraries/Client.sol"; -import "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -// setup -contract PingPongDappSetup is EVM2EVMOnRampSetup { - PingPongDemo internal s_pingPong; - IERC20 internal s_feeToken; - - address internal immutable i_pongContract = address(10); - - function setUp() public virtual override { - EVM2EVMOnRampSetup.setUp(); - - s_feeToken = IERC20(s_sourceTokens[0]); - s_pingPong = new PingPongDemo(address(s_sourceRouter), s_feeToken); - s_pingPong.setCounterpart(DEST_CHAIN_SELECTOR, i_pongContract); - - uint256 fundingAmount = 1e18; - - // Fund the contract with LINK tokens - s_feeToken.transfer(address(s_pingPong), fundingAmount); - } -} - -contract PingPong_startPingPong is PingPongDappSetup { - function test_StartPingPong_Success() public { - uint256 pingPongNumber = 1; - bytes memory data = abi.encode(pingPongNumber); - - Client.EVM2AnyMessage memory sentMessage = Client.EVM2AnyMessage({ - receiver: abi.encode(i_pongContract), - data: data, - tokenAmounts: new Client.EVMTokenAmount[](0), - feeToken: s_sourceFeeToken, - extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 2e5})) - }); - - uint256 expectedFee = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, sentMessage); - - Internal.EVM2EVMMessage memory message = Internal.EVM2EVMMessage({ - sequenceNumber: 1, - feeTokenAmount: expectedFee, - sourceChainSelector: SOURCE_CHAIN_SELECTOR, - sender: address(s_pingPong), - receiver: i_pongContract, - nonce: 1, - data: data, - tokenAmounts: sentMessage.tokenAmounts, - sourceTokenData: new bytes[](sentMessage.tokenAmounts.length), - gasLimit: 2e5, - feeToken: sentMessage.feeToken, - strict: false, - messageId: "" - }); - message.messageId = Internal._hash(message, s_metadataHash); - - vm.expectEmit(); - emit PingPongDemo.Ping(pingPongNumber); - - vm.expectEmit(); - emit EVM2EVMOnRamp.CCIPSendRequested(message); - - s_pingPong.startPingPong(); - } -} - -contract PingPong_ccipReceive is PingPongDappSetup { - function test_CcipReceive_Success() public { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - - uint256 pingPongNumber = 5; - - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: bytes32("a"), - sourceChainSelector: DEST_CHAIN_SELECTOR, - sender: abi.encode(i_pongContract), - data: abi.encode(pingPongNumber), - destTokenAmounts: tokenAmounts - }); - - vm.startPrank(address(s_sourceRouter)); - - vm.expectEmit(); - emit PingPongDemo.Pong(pingPongNumber + 1); - - s_pingPong.ccipReceive(message); - } -} - -contract PingPong_plumbing is PingPongDappSetup { - function test_Fuzz_CounterPartChainSelector_Success(uint64 chainSelector) public { - s_pingPong.setCounterpartChainSelector(chainSelector); - - assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); - } - - function test_Fuzz_CounterPartAddress_Success(address counterpartAddress) public { - s_pingPong.setCounterpartAddress(counterpartAddress); +// // SPDX-License-Identifier: BUSL-1.1 +// pragma solidity 0.8.24; + +// import {PingPongDemo} from "../../applications/PingPongDemo.sol"; +// import {Client} from "../../libraries/Client.sol"; +// import "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +// // setup +// contract PingPongDappSetup is EVM2EVMOnRampSetup { +// PingPongDemo internal s_pingPong; +// IERC20 internal s_feeToken; + +// address internal immutable i_pongContract = address(10); + +// function setUp() public virtual override { +// EVM2EVMOnRampSetup.setUp(); + +// s_feeToken = IERC20(s_sourceTokens[0]); +// s_pingPong = new PingPongDemo(address(s_sourceRouter), s_feeToken); +// s_pingPong.setCounterpart(DEST_CHAIN_SELECTOR, i_pongContract); + +// uint256 fundingAmount = 1e18; + +// // Fund the contract with LINK tokens +// s_feeToken.transfer(address(s_pingPong), fundingAmount); +// } +// } + +// contract PingPong_startPingPong is PingPongDappSetup { +// function test_StartPingPong_Success() public { +// uint256 pingPongNumber = 1; +// bytes memory data = abi.encode(pingPongNumber); + +// Client.EVM2AnyMessage memory sentMessage = Client.EVM2AnyMessage({ +// receiver: abi.encode(i_pongContract), +// data: data, +// tokenAmounts: new Client.EVMTokenAmount[](0), +// feeToken: s_sourceFeeToken, +// extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 2e5})) +// }); + +// uint256 expectedFee = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, sentMessage); + +// Internal.EVM2EVMMessage memory message = Internal.EVM2EVMMessage({ +// sequenceNumber: 1, +// feeTokenAmount: expectedFee, +// sourceChainSelector: SOURCE_CHAIN_SELECTOR, +// sender: address(s_pingPong), +// receiver: i_pongContract, +// nonce: 1, +// data: data, +// tokenAmounts: sentMessage.tokenAmounts, +// sourceTokenData: new bytes[](sentMessage.tokenAmounts.length), +// gasLimit: 2e5, +// feeToken: sentMessage.feeToken, +// strict: false, +// messageId: "" +// }); +// message.messageId = Internal._hash(message, s_metadataHash); + +// vm.expectEmit(); +// emit PingPongDemo.Ping(pingPongNumber); + +// vm.expectEmit(); +// emit EVM2EVMOnRamp.CCIPSendRequested(message); + +// s_pingPong.startPingPong(); +// } +// } + +// contract PingPong_ccipReceive is PingPongDappSetup { +// function test_CcipReceive_Success() public { +// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + +// uint256 pingPongNumber = 5; + +// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ +// messageId: bytes32("a"), +// sourceChainSelector: DEST_CHAIN_SELECTOR, +// sender: abi.encode(i_pongContract), +// data: abi.encode(pingPongNumber), +// destTokenAmounts: tokenAmounts +// }); + +// vm.startPrank(address(s_sourceRouter)); + +// vm.expectEmit(); +// emit PingPongDemo.Pong(pingPongNumber + 1); + +// s_pingPong.ccipReceive(message); +// } +// } + +// contract PingPong_plumbing is PingPongDappSetup { +// function test_Fuzz_CounterPartChainSelector_Success(uint64 chainSelector) public { +// s_pingPong.setCounterpartChainSelector(chainSelector); + +// assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); +// } + +// function test_Fuzz_CounterPartAddress_Success(address counterpartAddress) public { +// s_pingPong.setCounterpartAddress(counterpartAddress); - assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); - } - - function test_Fuzz_CounterPartAddress_Success(uint64 chainSelector, address counterpartAddress) public { - s_pingPong.setCounterpart(chainSelector, counterpartAddress); - - assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); - assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); - } - - function test_Pausing_Success() public { - assertFalse(s_pingPong.isPaused()); - - s_pingPong.setPaused(true); - - assertTrue(s_pingPong.isPaused()); - } -} +// assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); +// } + +// function test_Fuzz_CounterPartAddress_Success(uint64 chainSelector, address counterpartAddress) public { +// s_pingPong.setCounterpart(chainSelector, counterpartAddress); + +// assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); +// assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); +// } + +// function test_Pausing_Success() public { +// assertFalse(s_pingPong.isPaused()); + +// s_pingPong.setPaused(true); + +// assertTrue(s_pingPong.isPaused()); +// } +// } diff --git a/contracts/src/v0.8/ccip/test/applications/SelfFundedPingPong.t.sol b/contracts/src/v0.8/ccip/test/applications/SelfFundedPingPong.t.sol index 8751154b56..a857cf3b00 100644 --- a/contracts/src/v0.8/ccip/test/applications/SelfFundedPingPong.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/SelfFundedPingPong.t.sol @@ -1,99 +1,99 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.24; - -import {SelfFundedPingPong} from "../../applications/SelfFundedPingPong.sol"; -import {Client} from "../../libraries/Client.sol"; -import {EVM2EVMOnRamp} from "../../onRamp/EVM2EVMOnRamp.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -contract SelfFundedPingPongDappSetup is EVM2EVMOnRampSetup { - SelfFundedPingPong internal s_pingPong; - IERC20 internal s_feeToken; - uint8 internal constant s_roundTripsBeforeFunding = 0; - - address internal immutable i_pongContract = address(10); - - function setUp() public virtual override { - EVM2EVMOnRampSetup.setUp(); - - s_feeToken = IERC20(s_sourceTokens[0]); - s_pingPong = new SelfFundedPingPong(address(s_sourceRouter), s_feeToken, s_roundTripsBeforeFunding); - s_pingPong.setCounterpart(DEST_CHAIN_SELECTOR, i_pongContract); - - uint256 fundingAmount = 5e18; - - // set ping pong as an onRamp nop to make sure that funding runs - EVM2EVMOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMOnRamp.NopAndWeight[](1); - nopsAndWeights[0] = EVM2EVMOnRamp.NopAndWeight({nop: address(s_pingPong), weight: 1}); - s_onRamp.setNops(nopsAndWeights); - - // Fund the contract with LINK tokens - s_feeToken.transfer(address(s_pingPong), fundingAmount); - } -} - -contract SelfFundedPingPong_ccipReceive is SelfFundedPingPongDappSetup { - function test_Funding_Success() public { - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: bytes32("a"), - sourceChainSelector: DEST_CHAIN_SELECTOR, - sender: abi.encode(i_pongContract), - data: "", - destTokenAmounts: new Client.EVMTokenAmount[](0) - }); - - uint8 countIncrBeforeFunding = 5; - - vm.expectEmit(); - emit SelfFundedPingPong.CountIncrBeforeFundingSet(countIncrBeforeFunding); - - s_pingPong.setCountIncrBeforeFunding(countIncrBeforeFunding); - - vm.startPrank(address(s_sourceRouter)); - for (uint256 pingPongNumber = 0; pingPongNumber <= countIncrBeforeFunding; ++pingPongNumber) { - message.data = abi.encode(pingPongNumber); - if (pingPongNumber == countIncrBeforeFunding - 1) { - vm.expectEmit(); - emit SelfFundedPingPong.Funded(); - vm.expectCall(address(s_onRamp), ""); - } - s_pingPong.ccipReceive(message); - } - } - - function test_FundingIfNotANop_Revert() public { - EVM2EVMOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMOnRamp.NopAndWeight[](0); - s_onRamp.setNops(nopsAndWeights); - - uint8 countIncrBeforeFunding = 3; - s_pingPong.setCountIncrBeforeFunding(countIncrBeforeFunding); - - vm.startPrank(address(s_sourceRouter)); - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: bytes32("a"), - sourceChainSelector: DEST_CHAIN_SELECTOR, - sender: abi.encode(i_pongContract), - data: abi.encode(countIncrBeforeFunding), - destTokenAmounts: new Client.EVMTokenAmount[](0) - }); - - // because pingPong is not set as a nop - vm.expectRevert(EVM2EVMOnRamp.OnlyCallableByOwnerOrAdminOrNop.selector); - s_pingPong.ccipReceive(message); - } -} - -contract SelfFundedPingPong_setCountIncrBeforeFunding is SelfFundedPingPongDappSetup { - function test_setCountIncrBeforeFunding() public { - uint8 c = s_pingPong.getCountIncrBeforeFunding(); - - vm.expectEmit(); - emit SelfFundedPingPong.CountIncrBeforeFundingSet(c + 1); - - s_pingPong.setCountIncrBeforeFunding(c + 1); - uint8 c2 = s_pingPong.getCountIncrBeforeFunding(); - assertEq(c2, c + 1); - } -} +// // SPDX-License-Identifier: BUSL-1.1 +// pragma solidity 0.8.24; + +// import {SelfFundedPingPong} from "../../applications/SelfFundedPingPong.sol"; +// import {Client} from "../../libraries/Client.sol"; +// import {EVM2EVMOnRamp} from "../../onRamp/EVM2EVMOnRamp.sol"; +// import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; + +// import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +// contract SelfFundedPingPongDappSetup is EVM2EVMOnRampSetup { +// SelfFundedPingPong internal s_pingPong; +// IERC20 internal s_feeToken; +// uint8 internal constant s_roundTripsBeforeFunding = 0; + +// address internal immutable i_pongContract = address(10); + +// function setUp() public virtual override { +// EVM2EVMOnRampSetup.setUp(); + +// s_feeToken = IERC20(s_sourceTokens[0]); +// s_pingPong = new SelfFundedPingPong(address(s_sourceRouter), s_feeToken, s_roundTripsBeforeFunding); +// s_pingPong.setCounterpart(DEST_CHAIN_SELECTOR, i_pongContract); + +// uint256 fundingAmount = 5e18; + +// // set ping pong as an onRamp nop to make sure that funding runs +// EVM2EVMOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMOnRamp.NopAndWeight[](1); +// nopsAndWeights[0] = EVM2EVMOnRamp.NopAndWeight({nop: address(s_pingPong), weight: 1}); +// s_onRamp.setNops(nopsAndWeights); + +// // Fund the contract with LINK tokens +// s_feeToken.transfer(address(s_pingPong), fundingAmount); +// } +// } + +// contract SelfFundedPingPong_ccipReceive is SelfFundedPingPongDappSetup { +// function test_Funding_Success() public { +// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ +// messageId: bytes32("a"), +// sourceChainSelector: DEST_CHAIN_SELECTOR, +// sender: abi.encode(i_pongContract), +// data: "", +// destTokenAmounts: new Client.EVMTokenAmount[](0) +// }); + +// uint8 countIncrBeforeFunding = 5; + +// vm.expectEmit(); +// emit SelfFundedPingPong.CountIncrBeforeFundingSet(countIncrBeforeFunding); + +// s_pingPong.setCountIncrBeforeFunding(countIncrBeforeFunding); + +// vm.startPrank(address(s_sourceRouter)); +// for (uint256 pingPongNumber = 0; pingPongNumber <= countIncrBeforeFunding; ++pingPongNumber) { +// message.data = abi.encode(pingPongNumber); +// if (pingPongNumber == countIncrBeforeFunding - 1) { +// vm.expectEmit(); +// emit SelfFundedPingPong.Funded(); +// vm.expectCall(address(s_onRamp), ""); +// } +// s_pingPong.ccipReceive(message); +// } +// } + +// function test_FundingIfNotANop_Revert() public { +// EVM2EVMOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMOnRamp.NopAndWeight[](0); +// s_onRamp.setNops(nopsAndWeights); + +// uint8 countIncrBeforeFunding = 3; +// s_pingPong.setCountIncrBeforeFunding(countIncrBeforeFunding); + +// vm.startPrank(address(s_sourceRouter)); +// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ +// messageId: bytes32("a"), +// sourceChainSelector: DEST_CHAIN_SELECTOR, +// sender: abi.encode(i_pongContract), +// data: abi.encode(countIncrBeforeFunding), +// destTokenAmounts: new Client.EVMTokenAmount[](0) +// }); + +// // because pingPong is not set as a nop +// vm.expectRevert(EVM2EVMOnRamp.OnlyCallableByOwnerOrAdminOrNop.selector); +// s_pingPong.ccipReceive(message); +// } +// } + +// contract SelfFundedPingPong_setCountIncrBeforeFunding is SelfFundedPingPongDappSetup { +// function test_setCountIncrBeforeFunding() public { +// uint8 c = s_pingPong.getCountIncrBeforeFunding(); + +// vm.expectEmit(); +// emit SelfFundedPingPong.CountIncrBeforeFundingSet(c + 1); + +// s_pingPong.setCountIncrBeforeFunding(c + 1); +// uint8 c2 = s_pingPong.getCountIncrBeforeFunding(); +// assertEq(c2, c + 1); +// } +// } diff --git a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol index 71a5cdc7ab..8495f646e4 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol @@ -1,11 +1,36 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; -import {EtherSenderReceiver} from "../../applications/EtherSenderReceiver.sol"; import {Client} from "../../libraries/Client.sol"; +import {CCIPReceiverBasic} from "../../production-examples/CCIPReceiverBasic.sol"; +import {CCIPSender} from "../../production-examples/CCIPSender.sol"; -contract EtherSenderReceiverHelper is EtherSenderReceiver { - constructor(address router) EtherSenderReceiver(router) {} +import {IWrappedNative} from "../../interfaces/IWrappedNative.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"; + +interface CCIPRouter { + function getWrappedNative() external view returns (address); +} + +contract EtherSenderReceiverHelper is CCIPSender { + using SafeERC20 for IERC20; + + error InvalidTokenAmounts(uint256 gotAmounts); + error InvalidToken(address gotToken, address expectedToken); + error TokenAmountNotEqualToMsgValue(uint256 gotAmount, uint256 msgValue); + error InsufficientMsgValue(uint256 gotAmount, uint256 msgValue); + error InsufficientFee(uint256 gotFee, uint256 fee); + error GasLimitTooLow(uint256 minLimit, uint256 gotLimit); + + IWrappedNative public immutable i_weth; + + // TODO: Untangle the constructor mess from trying to be both of those at the same time + constructor(address router) CCIPSender(router) { + i_weth = IWrappedNative(CCIPRouter(router).getWrappedNative()); + IERC20(i_weth).safeApprove(router, type(uint256).max); + } function validatedMessage(Client.EVM2AnyMessage calldata message) public view returns (Client.EVM2AnyMessage memory) { return _validatedMessage(message); @@ -15,7 +40,47 @@ contract EtherSenderReceiverHelper is EtherSenderReceiver { _validateFeeToken(message); } + function _validateFeeToken(Client.EVM2AnyMessage calldata message) internal view { + uint256 tokenAmount = message.tokenAmounts[0].amount; + + if (message.feeToken != address(0)) { + // If the fee token is NOT native, then the token amount must be equal to msg.value. + // This is done to ensure that there is no leftover ether in this contract. + if (msg.value != tokenAmount) { + revert TokenAmountNotEqualToMsgValue(tokenAmount, msg.value); + } + } + } + + /// @notice Validate the message content. + /// @dev Only allows a single token to be sent. Always overwritten to be address(i_weth) + /// and receiver is always msg.sender. + function _validatedMessage(Client.EVM2AnyMessage calldata message) + internal + view + returns (Client.EVM2AnyMessage memory) + { + Client.EVM2AnyMessage memory validatedMessage = message; + + if (validatedMessage.tokenAmounts.length != 1) { + revert InvalidTokenAmounts(validatedMessage.tokenAmounts.length); + } + + validatedMessage.data = abi.encode(msg.sender); + validatedMessage.tokenAmounts[0].token = address(i_weth); + + return validatedMessage; + } + function publicCcipReceive(Client.Any2EVMMessage memory message) public { _ccipReceive(message); } + + function ccipReceive(Client.Any2EVMMessage calldata message) external virtual onlyRouter { + _ccipReceive(message); + } + + /// @notice Override this function in your implementation. + /// @param message Any2EVMMessage + function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual {} } diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol index 159cd7a851..a6c8d7bb58 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; -import {CCIPReceiver} from "../../../applications/CCIPReceiver.sol"; import {Client} from "../../../libraries/Client.sol"; +import {CCIPReceiverBasic} from "../../../production-examples/CCIPReceiverBasic.sol"; -contract ConformingReceiver is CCIPReceiver { +contract ConformingReceiver is CCIPReceiverBasic { event MessageReceived(); - constructor(address router, address feeToken) CCIPReceiver(router) {} + constructor(address router, address feeToken) CCIPReceiverBasic(router) {} function _ccipReceive(Client.Any2EVMMessage memory) internal virtual override { emit MessageReceived(); diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol index ae8759099c..0af15a6714 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol @@ -1,19 +1,19 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; -import {CCIPReceiver} from "../../../applications/CCIPReceiver.sol"; import {Client} from "../../../libraries/Client.sol"; import {Internal} from "../../../libraries/Internal.sol"; import {EVM2EVMOffRamp} from "../../../offRamp/EVM2EVMOffRamp.sol"; +import {CCIPReceiverBasic} from "../../../production-examples/CCIPReceiverBasic.sol"; -contract ReentrancyAbuser is CCIPReceiver { +contract ReentrancyAbuser is CCIPReceiverBasic { event ReentrancySucceeded(); bool internal s_ReentrancyDone = false; Internal.ExecutionReport internal s_payload; EVM2EVMOffRamp internal s_offRamp; - constructor(address router, EVM2EVMOffRamp offRamp) CCIPReceiver(router) { + constructor(address router, EVM2EVMOffRamp offRamp) CCIPReceiverBasic(router) { s_offRamp = offRamp; } diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol index c9e7d7e8ad..268b1fa728 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol @@ -1,19 +1,19 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import {CCIPReceiver} from "../../../applications/CCIPReceiver.sol"; import {Client} from "../../../libraries/Client.sol"; import {Internal} from "../../../libraries/Internal.sol"; import {EVM2EVMMultiOffRamp} from "../../../offRamp/EVM2EVMMultiOffRamp.sol"; +import {CCIPReceiverBasic} from "../../../production-examples/CCIPReceiverBasic.sol"; -contract ReentrancyAbuserMultiRamp is CCIPReceiver { +contract ReentrancyAbuserMultiRamp is CCIPReceiverBasic { event ReentrancySucceeded(); bool internal s_ReentrancyDone = false; Internal.ExecutionReportSingleChain internal s_payload; EVM2EVMMultiOffRamp internal s_offRamp; - constructor(address router, EVM2EVMMultiOffRamp offRamp) CCIPReceiver(router) { + constructor(address router, EVM2EVMMultiOffRamp offRamp) CCIPReceiverBasic(router) { s_offRamp = offRamp; } From b9ca301cbc23e21b1c80579bc1f55bdd542073d2 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 25 Jun 2024 12:19:37 -0400 Subject: [PATCH 09/31] re-organize folders for new ARCs, and fix Self-Funded ping-pong tests --- contracts/gas-snapshots/ccip.gas-snapshot | 15 +- .../ccip/applications/CCIPClientExample.sol | 174 ----- .../v0.8/ccip/applications/CCIPReceiver.sol | 59 -- .../ccip/applications/DefensiveExample.sol | 117 --- .../ccip/applications/EtherSenderReceiver.sol | 182 ----- .../v0.8/ccip/applications/PingPongDemo.sol | 102 --- .../ccip/applications/SelfFundedPingPong.sol | 67 -- .../external}/CCIPClient.sol | 14 +- .../external}/CCIPClientBase.sol | 12 +- .../external}/CCIPReceiver.sol | 8 +- .../external}/CCIPReceiverWithACK.sol | 10 +- .../external}/CCIPSender.sol | 8 +- .../internal}/PingPongDemo.sol | 8 +- .../internal/SelfFundedPingPong.sol | 67 ++ .../{ => internal}/TokenProxy.sol | 10 +- .../test/applications/DefensiveExample.t.sol | 97 --- .../applications/EtherSenderReceiver.t.sol | 718 ------------------ .../test/applications/ImmutableExample.t.sol | 61 -- .../ccip/test/applications/PingPongDemo.t.sol | 121 --- .../applications/SelfFundedPingPong.t.sol | 99 --- .../external}/CCIPClientTest.t.sol | 14 +- .../external}/CCIPReceiverTest.t.sol | 10 +- .../external}/CCIPReceiverWithAckTest.t.sol | 10 +- .../external}/CCIPSenderTest.t.sol | 12 +- .../internal}/PingPongDemoTest.t.sol | 6 +- .../internal/SelfFundedPingPong.t.sol | 109 +++ .../{ => internal}/TokenProxy.t.sol | 12 +- .../helpers/EtherSenderReceiverHelper.sol | 16 +- .../helpers/receivers}/CCIPReceiverBasic.sol | 9 +- .../helpers/receivers/ConformingReceiver.sol | 2 +- .../helpers/receivers/ReentrancyAbuser.sol | 2 +- .../receivers/ReentrancyAbuserMultiRamp.sol | 2 +- 32 files changed, 270 insertions(+), 1883 deletions(-) delete mode 100644 contracts/src/v0.8/ccip/applications/CCIPClientExample.sol delete mode 100644 contracts/src/v0.8/ccip/applications/CCIPReceiver.sol delete mode 100644 contracts/src/v0.8/ccip/applications/DefensiveExample.sol delete mode 100644 contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol delete mode 100644 contracts/src/v0.8/ccip/applications/PingPongDemo.sol delete mode 100644 contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol rename contracts/src/v0.8/ccip/{production-examples => applications/external}/CCIPClient.sol (84%) rename contracts/src/v0.8/ccip/{production-examples => applications/external}/CCIPClientBase.sol (85%) rename contracts/src/v0.8/ccip/{production-examples => applications/external}/CCIPReceiver.sol (93%) rename contracts/src/v0.8/ccip/{production-examples => applications/external}/CCIPReceiverWithACK.sol (92%) rename contracts/src/v0.8/ccip/{production-examples => applications/external}/CCIPSender.sol (92%) rename contracts/src/v0.8/ccip/{production-examples => applications/internal}/PingPongDemo.sol (92%) create mode 100644 contracts/src/v0.8/ccip/applications/internal/SelfFundedPingPong.sol rename contracts/src/v0.8/ccip/applications/{ => internal}/TokenProxy.sol (88%) delete mode 100644 contracts/src/v0.8/ccip/test/applications/DefensiveExample.t.sol delete mode 100644 contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver.t.sol delete mode 100644 contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol delete mode 100644 contracts/src/v0.8/ccip/test/applications/PingPongDemo.t.sol delete mode 100644 contracts/src/v0.8/ccip/test/applications/SelfFundedPingPong.t.sol rename contracts/src/v0.8/ccip/test/{production-examples => applications/external}/CCIPClientTest.t.sol (93%) rename contracts/src/v0.8/ccip/test/{production-examples => applications/external}/CCIPReceiverTest.t.sol (95%) rename contracts/src/v0.8/ccip/test/{production-examples => applications/external}/CCIPReceiverWithAckTest.t.sol (94%) rename contracts/src/v0.8/ccip/test/{production-examples => applications/external}/CCIPSenderTest.t.sol (91%) rename contracts/src/v0.8/ccip/test/{production-examples => applications/internal}/PingPongDemoTest.t.sol (95%) create mode 100644 contracts/src/v0.8/ccip/test/applications/internal/SelfFundedPingPong.t.sol rename contracts/src/v0.8/ccip/test/applications/{ => internal}/TokenProxy.t.sol (94%) rename contracts/src/v0.8/ccip/{production-examples => test/helpers/receivers}/CCIPReceiverBasic.sol (83%) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index d556e3ae29..7dce25b1f9 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -37,8 +37,8 @@ BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 329845) CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 346013) CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 84106) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 239971) -CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 551328) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 241012) +CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 552160) CCIPReceiverTest:test_HappyPath_Success() (gas: 191871) CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426569) CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430405) @@ -245,7 +245,7 @@ EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthRe EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44275) EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 190545) EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 143942) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 129795) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 129758) EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 219770) EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 228427) EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 314267) @@ -539,9 +539,9 @@ OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) OnRampTokenPoolReentrancy:test_Success() (gas: 382249) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 305899) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 200807) PingPong_example_plumbing:test_Pausing_Success() (gas: 17899) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 232502) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 224351) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_applyPriceUpdatersUpdates:test_ApplyPriceUpdaterUpdates_Success() (gas: 82654) @@ -630,7 +630,7 @@ RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18250) RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24706) RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38647) RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46384) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38077) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38017) RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19671) RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 132584) RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19463) @@ -670,6 +670,9 @@ Router_routeMessage:test_ManualExec_Success() (gas: 35410) Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25167) Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44669) Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 287940) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 449250) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20292) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 52047) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 45092) TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12629) diff --git a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol b/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol deleted file mode 100644 index 80a34a999f..0000000000 --- a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol +++ /dev/null @@ -1,174 +0,0 @@ -// // SPDX-License-Identifier: MIT -// pragma solidity ^0.8.0; - -// import {IRouterClient} from "../interfaces/IRouterClient.sol"; - -// import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -// import {Client} from "../libraries/Client.sol"; -// import {CCIPReceiver} from "./CCIPReceiver.sol"; - -// import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -// // @notice Example of a client which supports EVM/non-EVM chains -// // @dev If chain specific logic is required for different chain families (e.g. particular -// // decoding the bytes sender for authorization checks), it may be required to point to a helper -// // authorization contract unless all chain families are known up front. -// // @dev If contract does not implement IAny2EVMMessageReceiver and IERC165, -// // and tokens are sent to it, ccipReceive will not be called but tokens will be transferred. -// // @dev If the client is upgradeable you have significantly more flexibility and -// // can avoid storage based options like the below contract uses. However it's -// // worth carefully considering how the trust assumptions of your client dapp will -// // change if you introduce upgradeability. An immutable dapp building on top of CCIP -// // like the example below will inherit the trust properties of CCIP (i.e. the oracle network). -// // @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting -// // new chain family receivers (e.g. a solana encoded receiver address) without upgrading. -// contract CCIPClientExample is CCIPReceiver, OwnerIsCreator { -// error InvalidConfig(); -// error InvalidChain(uint64 chainSelector); - -// event MessageSent(bytes32 messageId); -// event MessageReceived(bytes32 messageId); - -// // Current feeToken -// IERC20 public s_feeToken; -// // Below is a simplistic example (same params for all messages) of using storage to allow for new options without -// // upgrading the dapp. Note that extra args are chain family specific (e.g. gasLimit is EVM specific etc.). -// // and will always be backwards compatible i.e. upgrades are opt-in. -// // Offchain we can compute the V1 extraArgs: -// // Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 300_000}); -// // bytes memory encodedV1ExtraArgs = Client._argsToBytes(extraArgs); -// // Then later compute V2 extraArgs, for example if a refund feature was added: -// // Client.EVMExtraArgsV2 memory extraArgs = Client.EVMExtraArgsV2({gasLimit: 300_000, destRefundAddress: 0x1234}); -// // bytes memory encodedV2ExtraArgs = Client._argsToBytes(extraArgs); -// // and update storage with the new args. -// // If different options are required for different messages, for example different gas limits, -// // one can simply key based on (chainSelector, messageType) instead of only chainSelector. -// mapping(uint64 destChainSelector => bytes extraArgsBytes) public s_chains; - -// constructor(IRouterClient router, IERC20 feeToken) CCIPReceiver(address(router)) { -// s_feeToken = feeToken; -// s_feeToken.approve(address(router), type(uint256).max); -// } - -// function enableChain(uint64 chainSelector, bytes memory extraArgs) external onlyOwner { -// s_chains[chainSelector] = extraArgs; -// } - -// function disableChain(uint64 chainSelector) external onlyOwner { -// delete s_chains[chainSelector]; -// } - -// function ccipReceive(Client.Any2EVMMessage calldata message) -// external -// virtual -// override -// onlyRouter -// validChain(message.sourceChainSelector) -// { -// // Extremely important to ensure only router calls this. -// // Tokens in message if any will be transferred to this contract -// // TODO: Validate sender/origin chain and process message and/or tokens. -// _ccipReceive(message); -// } - -// function _ccipReceive(Client.Any2EVMMessage memory message) internal override { -// emit MessageReceived(message.messageId); -// } - -// /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native asset. -// function sendDataPayNative( -// uint64 destChainSelector, -// bytes memory receiver, -// bytes memory data -// ) external validChain(destChainSelector) { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: receiver, -// data: data, -// tokenAmounts: tokenAmounts, -// extraArgs: s_chains[destChainSelector], -// feeToken: address(0) // We leave the feeToken empty indicating we'll pay raw native. -// }); -// bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ -// value: IRouterClient(i_ccipRouter).getFee(destChainSelector, message) -// }(destChainSelector, message); -// emit MessageSent(messageId); -// } - -// /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient feeToken. -// function sendDataPayFeeToken( -// uint64 destChainSelector, -// bytes memory receiver, -// bytes memory data -// ) external validChain(destChainSelector) { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: receiver, -// data: data, -// tokenAmounts: tokenAmounts, -// extraArgs: s_chains[destChainSelector], -// feeToken: address(s_feeToken) -// }); -// // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); -// // Can decide if fee is acceptable. -// // address(this) must have sufficient feeToken or the send will revert. -// bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); -// emit MessageSent(messageId); -// } - -// /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native token. -// function sendDataAndTokens( -// uint64 destChainSelector, -// bytes memory receiver, -// bytes memory data, -// Client.EVMTokenAmount[] memory tokenAmounts -// ) external validChain(destChainSelector) { -// for (uint256 i = 0; i < tokenAmounts.length; ++i) { -// IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); -// IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); -// } -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: receiver, -// data: data, -// tokenAmounts: tokenAmounts, -// extraArgs: s_chains[destChainSelector], -// feeToken: address(s_feeToken) -// }); -// // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); -// // Can decide if fee is acceptable. -// // address(this) must have sufficient feeToken or the send will revert. -// bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); -// emit MessageSent(messageId); -// } - -// // @notice user sends tokens to a receiver -// // Approvals can be optimized with a whitelist of tokens and inf approvals if desired. -// function sendTokens( -// uint64 destChainSelector, -// bytes memory receiver, -// Client.EVMTokenAmount[] memory tokenAmounts -// ) external validChain(destChainSelector) { -// for (uint256 i = 0; i < tokenAmounts.length; ++i) { -// IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); -// IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); -// } -// bytes memory data; -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: receiver, -// data: data, -// tokenAmounts: tokenAmounts, -// extraArgs: s_chains[destChainSelector], -// feeToken: address(s_feeToken) -// }); -// // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); -// // Can decide if fee is acceptable. -// // address(this) must have sufficient feeToken or the send will revert. -// bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); -// emit MessageSent(messageId); -// } - -// modifier validChain(uint64 chainSelector) { -// if (s_chains[chainSelector].length == 0) revert InvalidChain(chainSelector); -// _; -// } -// } diff --git a/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol deleted file mode 100644 index cde378b6f0..0000000000 --- a/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol +++ /dev/null @@ -1,59 +0,0 @@ -// // SPDX-License-Identifier: MIT -// pragma solidity ^0.8.0; - -// import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol"; - -// import {Client} from "../libraries/Client.sol"; - -// import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; - -// /// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. -// abstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 { -// address internal immutable i_ccipRouter; - -// constructor(address router) { -// if (router == address(0)) revert InvalidRouter(address(0)); -// i_ccipRouter = router; -// } - -// /// @notice IERC165 supports an interfaceId -// /// @param interfaceId The interfaceId to check -// /// @return true if the interfaceId is supported -// /// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver -// /// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId -// /// This allows CCIP to check if ccipReceive is available before calling it. -// /// If this returns false or reverts, only tokens are transferred to the receiver. -// /// If this returns true, tokens are transferred and ccipReceive is called atomically. -// /// Additionally, if the receiver address does not have code associated with -// /// it at the time of execution (EXTCODESIZE returns 0), only tokens will be transferred. -// function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { -// return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; -// } - -// /// @inheritdoc IAny2EVMMessageReceiver -// function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter { -// _ccipReceive(message); -// } - -// /// @notice Override this function in your implementation. -// /// @param message Any2EVMMessage -// function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual; - -// ///////////////////////////////////////////////////////////////////// -// // Plumbing -// ///////////////////////////////////////////////////////////////////// - -// /// @notice Return the current router -// /// @return CCIP router address -// function getRouter() public view virtual returns (address) { -// return address(i_ccipRouter); -// } - -// error InvalidRouter(address router); - -// /// @dev only calls from the set router are accepted. -// modifier onlyRouter() { -// if (msg.sender != getRouter()) revert InvalidRouter(msg.sender); -// _; -// } -// } diff --git a/contracts/src/v0.8/ccip/applications/DefensiveExample.sol b/contracts/src/v0.8/ccip/applications/DefensiveExample.sol deleted file mode 100644 index b2bac19abc..0000000000 --- a/contracts/src/v0.8/ccip/applications/DefensiveExample.sol +++ /dev/null @@ -1,117 +0,0 @@ -// // SPDX-License-Identifier: MIT -// pragma solidity ^0.8.0; - -// import {IRouterClient} from "../interfaces/IRouterClient.sol"; - -// import {Client} from "../libraries/Client.sol"; -// 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/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; - -// contract DefensiveExample is CCIPClientExample { -// using EnumerableMap for EnumerableMap.Bytes32ToUintMap; -// using SafeERC20 for IERC20; - -// error OnlySelf(); -// error ErrorCase(); -// error MessageNotFailed(bytes32 messageId); - -// event MessageFailed(bytes32 indexed messageId, bytes reason); -// event MessageSucceeded(bytes32 indexed messageId); -// event MessageRecovered(bytes32 indexed messageId); - -// // Example error code, could have many different error codes. -// enum ErrorCode { -// // RESOLVED is first so that the default value is resolved. -// RESOLVED, -// // Could have any number of error codes here. -// BASIC -// } - -// // The message contents of failed messages are stored here. -// mapping(bytes32 messageId => Client.Any2EVMMessage contents) public s_messageContents; - -// // Contains failed messages and their state. -// EnumerableMap.Bytes32ToUintMap internal s_failedMessages; - -// // This is used to simulate a revert in the processMessage function. -// bool internal s_simRevert = false; - -// constructor(IRouterClient router, IERC20 feeToken) CCIPClientExample(router, feeToken) {} - -// /// @notice The entrypoint for the CCIP router to call. This function should -// /// never revert, all errors should be handled internally in this contract. -// /// @param message The message to process. -// /// @dev Extremely important to ensure only router calls this. -// function ccipReceive(Client.Any2EVMMessage calldata message) -// external -// override -// onlyRouter -// validChain(message.sourceChainSelector) -// { -// try this.processMessage(message) {} -// catch (bytes memory err) { -// // Could set different error codes based on the caught error. Each could be -// // handled differently. -// s_failedMessages.set(message.messageId, uint256(ErrorCode.BASIC)); -// s_messageContents[message.messageId] = message; -// // Don't revert so CCIP doesn't revert. Emit event instead. -// // The message can be retried later without having to do manual execution of CCIP. -// emit MessageFailed(message.messageId, err); -// return; -// } -// emit MessageSucceeded(message.messageId); -// } - -// /// @notice This function the entrypoint for this contract to process messages. -// /// @param message The message to process. -// /// @dev This example just sends the tokens to the owner of this contracts. More -// /// interesting functions could be implemented. -// /// @dev It has to be external because of the try/catch. -// function processMessage(Client.Any2EVMMessage calldata message) -// external -// onlySelf -// validChain(message.sourceChainSelector) -// { -// // Simulate a revert -// if (s_simRevert) revert ErrorCase(); - -// // Send tokens to the owner -// for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { -// IERC20(message.destTokenAmounts[i].token).safeTransfer(owner(), message.destTokenAmounts[i].amount); -// } -// // Do other things that might revert -// } - -// /// @notice This function is callable by the owner when a message has failed -// /// to unblock the tokens that are associated with that message. -// /// @dev This function is only callable by the owner. -// function retryFailedMessage(bytes32 messageId, address tokenReceiver) external onlyOwner { -// if (s_failedMessages.get(messageId) != uint256(ErrorCode.BASIC)) revert MessageNotFailed(messageId); -// // Set the error code to 0 to disallow reentry and retry the same failed message -// // multiple times. -// s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); - -// // Do stuff to retry message, potentially just releasing the associated tokens -// Client.Any2EVMMessage memory message = s_messageContents[messageId]; - -// // send the tokens to the receiver as escape hatch -// for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { -// IERC20(message.destTokenAmounts[i].token).safeTransfer(tokenReceiver, message.destTokenAmounts[i].amount); -// } - -// emit MessageRecovered(messageId); -// } - -// // An example function to demonstrate recovery -// function setSimRevert(bool simRevert) external onlyOwner { -// s_simRevert = simRevert; -// } - -// modifier onlySelf() { -// if (msg.sender != address(this)) revert OnlySelf(); -// _; -// } -// } diff --git a/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol b/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol deleted file mode 100644 index 4d2ab78abf..0000000000 --- a/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol +++ /dev/null @@ -1,182 +0,0 @@ -// // SPDX-License-Identifier: BUSL-1.1 -// pragma solidity 0.8.24; - -// import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; - -// import {IRouterClient} from "../interfaces/IRouterClient.sol"; -// import {IWrappedNative} from "../interfaces/IWrappedNative.sol"; - -// import {Client} from "./../libraries/Client.sol"; -// import {CCIPReceiver} from "./CCIPReceiver.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"; - -// interface CCIPRouter { -// function getWrappedNative() external view returns (address); -// } - -// /// @notice A contract that can send raw ether cross-chain using CCIP. -// /// Since CCIP only supports ERC-20 token transfers, this contract accepts -// /// normal ether, wraps it, and uses CCIP to send it cross-chain. -// /// On the receiving side, the wrapped ether is unwrapped and sent to the final receiver. -// /// @notice This contract only supports chains where the wrapped native contract -// /// is the WETH contract (i.e not WMATIC, or WAVAX, etc.). This is because the -// /// receiving contract will always unwrap the ether using it's local wrapped native contract. -// /// @dev This contract is both a sender and a receiver. This same contract can be -// /// deployed on source and destination chains to facilitate cross-chain ether transfers -// /// and act as a sender and a receiver. -// /// @dev This contract is intentionally ownerless and permissionless. This contract -// /// will never hold any excess funds, native or otherwise, when used correctly. -// contract EtherSenderReceiver is CCIPReceiver, ITypeAndVersion { -// using SafeERC20 for IERC20; - -// error InvalidTokenAmounts(uint256 gotAmounts); -// error InvalidToken(address gotToken, address expectedToken); -// error TokenAmountNotEqualToMsgValue(uint256 gotAmount, uint256 msgValue); -// error InsufficientMsgValue(uint256 gotAmount, uint256 msgValue); -// error InsufficientFee(uint256 gotFee, uint256 fee); -// error GasLimitTooLow(uint256 minLimit, uint256 gotLimit); - -// string public constant override typeAndVersion = "EtherSenderReceiver 1.5.0"; - -// /// @notice The wrapped native token address. -// /// @dev If the wrapped native token address changes on the router, this contract will need to be redeployed. -// IWrappedNative public immutable i_weth; - -// /// @param router The CCIP router address. -// constructor(address router) CCIPReceiver(router) { -// i_weth = IWrappedNative(CCIPRouter(router).getWrappedNative()); -// i_weth.approve(router, type(uint256).max); -// } - -// /// @notice Need this in order to unwrap correctly. -// receive() external payable {} - -// /// @notice Get the fee for sending a message to a destination chain. -// /// This is mirrored from the router for convenience, construct the appropriate -// /// message and get it's fee. -// /// @param destinationChainSelector The destination chainSelector -// /// @param message The cross-chain CCIP message including data and/or tokens -// /// @return fee returns execution fee for the message -// /// delivery to destination chain, denominated in the feeToken specified in the message. -// /// @dev Reverts with appropriate reason upon invalid message. -// function getFee( -// uint64 destinationChainSelector, -// Client.EVM2AnyMessage calldata message -// ) external view returns (uint256 fee) { -// Client.EVM2AnyMessage memory validatedMessage = _validatedMessage(message); - -// return IRouterClient(getRouter()).getFee(destinationChainSelector, validatedMessage); -// } - -// /// @notice Send raw native tokens cross-chain. -// /// @param destinationChainSelector The destination chain selector. -// /// @param message The CCIP message with the following fields correctly set: -// /// - bytes receiver: The _contract_ address on the destination chain that will receive the wrapped ether. -// /// The caller must ensure that this contract address is correct, otherwise funds may be lost forever. -// /// - address feeToken: The fee token address. Must be address(0) for native tokens, or a supported CCIP fee token otherwise (i.e, LINK token). -// /// In the event a feeToken is set, we will transferFrom the caller the fee amount before sending the message, in order to forward them to the router. -// /// - EVMTokenAmount[] tokenAmounts: The tokenAmounts array must contain a single element with the following fields: -// /// - uint256 amount: The amount of ether to send. -// /// There are a couple of cases here that depend on the fee token specified: -// /// 1. If feeToken == address(0), the fee must be included in msg.value. Therefore tokenAmounts[0].amount must be less than msg.value, -// /// and the difference will be used as the fee. -// /// 2. If feeToken != address(0), the fee is not included in msg.value, and tokenAmounts[0].amount must be equal to msg.value. -// /// these fees to the CCIP router. -// /// @return messageId The CCIP message ID. -// function ccipSend( -// uint64 destinationChainSelector, -// Client.EVM2AnyMessage calldata message -// ) external payable returns (bytes32) { -// _validateFeeToken(message); -// Client.EVM2AnyMessage memory validatedMessage = _validatedMessage(message); - -// i_weth.deposit{value: validatedMessage.tokenAmounts[0].amount}(); - -// uint256 fee = IRouterClient(getRouter()).getFee(destinationChainSelector, validatedMessage); -// if (validatedMessage.feeToken != address(0)) { -// // If the fee token is not native, we need to transfer the fee to this contract and re-approve it to the router. -// // Its not possible to have any leftover tokens in this path because we transferFrom the exact fee that CCIP -// // requires from the caller. -// IERC20(validatedMessage.feeToken).safeTransferFrom(msg.sender, address(this), fee); - -// // We gave an infinite approval of weth to the router in the constructor. -// if (validatedMessage.feeToken != address(i_weth)) { -// IERC20(validatedMessage.feeToken).approve(getRouter(), fee); -// } - -// return IRouterClient(getRouter()).ccipSend(destinationChainSelector, validatedMessage); -// } - -// // We don't want to keep any excess ether in this contract, so we send over the entire address(this).balance as the fee. -// // CCIP will revert if the fee is insufficient, so we don't need to check here. -// return IRouterClient(getRouter()).ccipSend{value: address(this).balance}(destinationChainSelector, validatedMessage); -// } - -// /// @notice Validate the message content. -// /// @dev Only allows a single token to be sent. Always overwritten to be address(i_weth) -// /// and receiver is always msg.sender. -// function _validatedMessage(Client.EVM2AnyMessage calldata message) -// internal -// view -// returns (Client.EVM2AnyMessage memory) -// { -// Client.EVM2AnyMessage memory validatedMessage = message; - -// if (validatedMessage.tokenAmounts.length != 1) { -// revert InvalidTokenAmounts(validatedMessage.tokenAmounts.length); -// } - -// validatedMessage.data = abi.encode(msg.sender); -// validatedMessage.tokenAmounts[0].token = address(i_weth); - -// return validatedMessage; -// } - -// function _validateFeeToken(Client.EVM2AnyMessage calldata message) internal view { -// uint256 tokenAmount = message.tokenAmounts[0].amount; - -// if (message.feeToken != address(0)) { -// // If the fee token is NOT native, then the token amount must be equal to msg.value. -// // This is done to ensure that there is no leftover ether in this contract. -// if (msg.value != tokenAmount) { -// revert TokenAmountNotEqualToMsgValue(tokenAmount, msg.value); -// } -// } -// } - -// /// @notice Receive the wrapped ether, unwrap it, and send it to the specified EOA in the data field. -// /// @param message The CCIP message containing the wrapped ether amount and the final receiver. -// /// @dev The code below should never revert if the message being is valid according -// /// to the above _validatedMessage and _validateFeeToken functions. -// function _ccipReceive(Client.Any2EVMMessage memory message) internal override { -// address receiver = abi.decode(message.data, (address)); - -// if (message.destTokenAmounts.length != 1) { -// revert InvalidTokenAmounts(message.destTokenAmounts.length); -// } - -// if (message.destTokenAmounts[0].token != address(i_weth)) { -// revert InvalidToken(message.destTokenAmounts[0].token, address(i_weth)); -// } - -// uint256 tokenAmount = message.destTokenAmounts[0].amount; -// i_weth.withdraw(tokenAmount); - -// // it is possible that the below call may fail if receiver.code.length > 0 and the contract -// // doesn't e.g have a receive() or a fallback() function. -// (bool success,) = payable(receiver).call{value: tokenAmount}(""); -// if (!success) { -// // We have a few options here: -// // 1. Revert: this is bad generally because it may mean that these tokens are stuck. -// // 2. Store the tokens in a mapping and allow the user to withdraw them with another tx. -// // 3. Send WETH to the receiver address. -// // We opt for (3) here because at least the receiver will have the funds and can unwrap them if needed. -// // However it is worth noting that if receiver is actually a contract AND the contract _cannot_ withdraw -// // the WETH, then the WETH will be stuck in this contract. -// i_weth.deposit{value: tokenAmount}(); -// i_weth.transfer(receiver, tokenAmount); -// } -// } -// } diff --git a/contracts/src/v0.8/ccip/applications/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/PingPongDemo.sol deleted file mode 100644 index 4df6c45c64..0000000000 --- a/contracts/src/v0.8/ccip/applications/PingPongDemo.sol +++ /dev/null @@ -1,102 +0,0 @@ -// // SPDX-License-Identifier: MIT -// pragma solidity ^0.8.0; - -// import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; -// import {IRouterClient} from "../interfaces/IRouterClient.sol"; - -// import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -// import {Client} from "../libraries/Client.sol"; -// import {CCIPReceiver} from "./CCIPReceiver.sol"; - -// import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -// /// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication -// contract PingPongDemo is CCIPReceiver, OwnerIsCreator, ITypeAndVersion { -// event Ping(uint256 pingPongCount); -// event Pong(uint256 pingPongCount); - -// // The chain ID of the counterpart ping pong contract -// uint64 internal s_counterpartChainSelector; -// // The contract address of the counterpart ping pong contract -// address internal s_counterpartAddress; -// // Pause ping-ponging -// bool private s_isPaused; -// // The fee token used to pay for CCIP transactions -// IERC20 internal s_feeToken; - -// constructor(address router, IERC20 feeToken) CCIPReceiver(router) { -// s_isPaused = false; -// s_feeToken = feeToken; -// s_feeToken.approve(address(router), type(uint256).max); -// } - -// function typeAndVersion() external pure virtual returns (string memory) { -// return "PingPongDemo 1.2.0"; -// } - -// function setCounterpart(uint64 counterpartChainSelector, address counterpartAddress) external onlyOwner { -// s_counterpartChainSelector = counterpartChainSelector; -// s_counterpartAddress = counterpartAddress; -// } - -// function startPingPong() external onlyOwner { -// s_isPaused = false; -// _respond(1); -// } - -// function _respond(uint256 pingPongCount) internal virtual { -// if (pingPongCount & 1 == 1) { -// emit Ping(pingPongCount); -// } else { -// emit Pong(pingPongCount); -// } -// bytes memory data = abi.encode(pingPongCount); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(s_counterpartAddress), -// data: data, -// tokenAmounts: new Client.EVMTokenAmount[](0), -// extraArgs: "", -// feeToken: address(s_feeToken) -// }); -// IRouterClient(getRouter()).ccipSend(s_counterpartChainSelector, message); -// } - -// function _ccipReceive(Client.Any2EVMMessage memory message) internal override { -// uint256 pingPongCount = abi.decode(message.data, (uint256)); -// if (!s_isPaused) { -// _respond(pingPongCount + 1); -// } -// } - -// ///////////////////////////////////////////////////////////////////// -// // Plumbing -// ///////////////////////////////////////////////////////////////////// - -// function getCounterpartChainSelector() external view returns (uint64) { -// return s_counterpartChainSelector; -// } - -// function setCounterpartChainSelector(uint64 chainSelector) external onlyOwner { -// s_counterpartChainSelector = chainSelector; -// } - -// function getCounterpartAddress() external view returns (address) { -// return s_counterpartAddress; -// } - -// function getFeeToken() external view returns (IERC20) { -// return s_feeToken; -// } - -// function setCounterpartAddress(address addr) external onlyOwner { -// s_counterpartAddress = addr; -// } - -// function isPaused() external view returns (bool) { -// return s_isPaused; -// } - -// function setPaused(bool pause) external onlyOwner { -// s_isPaused = pause; -// } -// } diff --git a/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol b/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol deleted file mode 100644 index 284204c283..0000000000 --- a/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol +++ /dev/null @@ -1,67 +0,0 @@ -// // SPDX-License-Identifier: MIT -// pragma solidity ^0.8.0; - -// import {Router} from "../Router.sol"; -// import {Client} from "../libraries/Client.sol"; -// import {EVM2EVMOnRamp} from "../onRamp/EVM2EVMOnRamp.sol"; -// import {PingPongDemo} from "./PingPongDemo.sol"; - -// import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -// contract SelfFundedPingPong is PingPongDemo { -// string public constant override typeAndVersion = "SelfFundedPingPong 1.2.0"; - -// event Funded(); -// event CountIncrBeforeFundingSet(uint8 countIncrBeforeFunding); - -// // Defines the increase in ping pong count before self-funding is attempted. -// // Set to 0 to disable auto-funding, auto-funding only works for ping-pongs that are set as NOPs in the onRamp. -// uint8 private s_countIncrBeforeFunding; - -// constructor(address router, IERC20 feeToken, uint8 roundTripsBeforeFunding) PingPongDemo(router, feeToken) { -// // PingPong count increases by 2 for each round trip. -// s_countIncrBeforeFunding = roundTripsBeforeFunding * 2; -// } - -// function _respond(uint256 pingPongCount) internal override { -// if (pingPongCount & 1 == 1) { -// emit Ping(pingPongCount); -// } else { -// emit Pong(pingPongCount); -// } - -// fundPingPong(pingPongCount); - -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(s_counterpartAddress), -// data: abi.encode(pingPongCount), -// tokenAmounts: new Client.EVMTokenAmount[](0), -// extraArgs: "", -// feeToken: address(s_feeToken) -// }); -// Router(getRouter()).ccipSend(s_counterpartChainSelector, message); -// } - -// /// @notice A function that is responsible for funding this contract. -// /// The contract can only be funded if it is set as a nop in the target onRamp. -// /// In case your contract is not a nop you can prevent this function from being called by setting s_countIncrBeforeFunding=0. -// function fundPingPong(uint256 pingPongCount) public { -// // If selfFunding is disabled, or ping pong count has not reached s_countIncrPerFunding, do not attempt funding. -// if (s_countIncrBeforeFunding == 0 || pingPongCount < s_countIncrBeforeFunding) return; - -// // Ping pong on one side will always be even, one side will always to odd. -// if (pingPongCount % s_countIncrBeforeFunding <= 1) { -// EVM2EVMOnRamp(Router(getRouter()).getOnRamp(s_counterpartChainSelector)).payNops(); -// emit Funded(); -// } -// } - -// function getCountIncrBeforeFunding() external view returns (uint8) { -// return s_countIncrBeforeFunding; -// } - -// function setCountIncrBeforeFunding(uint8 countIncrBeforeFunding) public onlyOwner { -// s_countIncrBeforeFunding = countIncrBeforeFunding; -// emit CountIncrBeforeFundingSet(countIncrBeforeFunding); -// } -// } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol similarity index 84% rename from contracts/src/v0.8/ccip/production-examples/CCIPClient.sol rename to contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 66735b5c89..7a90084387 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -1,12 +1,12 @@ pragma solidity ^0.8.0; -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 {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 {CCIPReceiverWithACK} from "./CCIPReceiverWithACK.sol"; -import {IRouterClient} from "../interfaces/IRouterClient.sol"; -import {Client} from "../libraries/Client.sol"; +import {IRouterClient} from "../../interfaces/IRouterClient.sol"; +import {Client} from "../../libraries/Client.sol"; contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; @@ -58,7 +58,11 @@ contract CCIPClient is CCIPReceiverWithACK { // Since the fee token was already set in the ReceiverWithACK parent, we don't need to approve it to spend, only to ensure we have enough // funds for the transfer if (!sendingFeeTokenNormally && feeToken == address(s_feeToken) && feeToken != address(0)) { - IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); + // Support pre-funding the contract with fee token by checking that not enough exists to pay the fee already + // msg.sender checks that the function was not called in a _sendACK() call or as a result of processMessage(), which would require pre-funding the contract + if (IERC20(feeToken).balanceOf(address(this)) < fee && msg.sender != address(this)) { + IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); + } } else if (feeToken == address(0) && msg.value < fee) { revert IRouterClient.InsufficientFeeTokenAmount(); } diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol similarity index 85% rename from contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol rename to contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 1b7135bcb5..6ace66b358 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -1,13 +1,13 @@ pragma solidity ^0.8.0; -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; +import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; +import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.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 {Address} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.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 {Address} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; -import {ICCIPClientBase} from "../interfaces/ICCIPClientBase.sol"; +import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVersion { using SafeERC20 for IERC20; diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol similarity index 93% rename from contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol rename to contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 70f24b718f..e5ab31862b 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {Client} from "../libraries/Client.sol"; +import {Client} from "../../libraries/Client.sol"; import {CCIPClientBase} from "./CCIPClientBase.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/v4.8.3/contracts/utils/structs/EnumerableMap.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/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; contract CCIPReceiver is CCIPClientBase { using SafeERC20 for IERC20; diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol similarity index 92% rename from contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol rename to contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 3ebfe629b6..9c35f8ab0a 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -1,13 +1,13 @@ pragma solidity ^0.8.0; -import {IRouterClient} from "../interfaces/IRouterClient.sol"; -import {Client} from "../libraries/Client.sol"; +import {IRouterClient} from "../../interfaces/IRouterClient.sol"; +import {Client} from "../../libraries/Client.sol"; import {CCIPReceiver} from "./CCIPReceiver.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 {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/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; +import {EnumerableMap} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; contract CCIPReceiverWithACK is CCIPReceiver { using SafeERC20 for IERC20; diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol similarity index 92% rename from contracts/src/v0.8/ccip/production-examples/CCIPSender.sol rename to contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index 1e6b0a4953..2ac119c46c 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IRouterClient} from "../interfaces/IRouterClient.sol"; +import {IRouterClient} from "../../interfaces/IRouterClient.sol"; -import {Client} from "../libraries/Client.sol"; +import {Client} from "../../libraries/Client.sol"; import {CCIPClientBase} from "./CCIPClientBase.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 {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"; // @notice Example of a client which supports EVM/non-EVM chains // @dev If chain specific logic is required for different chain families (e.g. particular diff --git a/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol similarity index 92% rename from contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol rename to contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 461759f195..c9cf40bb68 100644 --- a/contracts/src/v0.8/ccip/production-examples/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {Client} from "../libraries/Client.sol"; -import {CCIPClient} from "./CCIPClient.sol"; +import {Client} from "../../libraries/Client.sol"; +import {CCIPClient} from "../external/CCIPClient.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 {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"; /// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication contract PingPongDemo is CCIPClient { diff --git a/contracts/src/v0.8/ccip/applications/internal/SelfFundedPingPong.sol b/contracts/src/v0.8/ccip/applications/internal/SelfFundedPingPong.sol new file mode 100644 index 0000000000..c02e96e61b --- /dev/null +++ b/contracts/src/v0.8/ccip/applications/internal/SelfFundedPingPong.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Router} from "../../Router.sol"; +import {Client} from "../../libraries/Client.sol"; +import {EVM2EVMOnRamp} from "../../onRamp/EVM2EVMOnRamp.sol"; +import {PingPongDemo} from "./PingPongDemo.sol"; + +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +contract SelfFundedPingPong is PingPongDemo { + string public constant override typeAndVersion = "SelfFundedPingPong 1.2.0"; + + event Funded(); + event CountIncrBeforeFundingSet(uint8 countIncrBeforeFunding); + + // Defines the increase in ping pong count before self-funding is attempted. + // Set to 0 to disable auto-funding, auto-funding only works for ping-pongs that are set as NOPs in the onRamp. + uint8 private s_countIncrBeforeFunding; + + constructor(address router, IERC20 feeToken, uint8 roundTripsBeforeFunding) PingPongDemo(router, feeToken) { + // PingPong count increases by 2 for each round trip. + s_countIncrBeforeFunding = roundTripsBeforeFunding * 2; + } + + function _respond(uint256 pingPongCount) internal override { + if (pingPongCount & 1 == 1) { + emit Ping(pingPongCount); + } else { + emit Pong(pingPongCount); + } + + fundPingPong(pingPongCount); + + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: abi.encode(s_counterpartAddress), + data: abi.encode(pingPongCount), + tokenAmounts: new Client.EVMTokenAmount[](0), + extraArgs: "", + feeToken: address(s_feeToken) + }); + Router(getRouter()).ccipSend(s_counterpartChainSelector, message); + } + + /// @notice A function that is responsible for funding this contract. + /// The contract can only be funded if it is set as a nop in the target onRamp. + /// In case your contract is not a nop you can prevent this function from being called by setting s_countIncrBeforeFunding=0. + function fundPingPong(uint256 pingPongCount) public { + // If selfFunding is disabled, or ping pong count has not reached s_countIncrPerFunding, do not attempt funding. + if (s_countIncrBeforeFunding == 0 || pingPongCount < s_countIncrBeforeFunding) return; + + // Ping pong on one side will always be even, one side will always to odd. + if (pingPongCount % s_countIncrBeforeFunding <= 1) { + EVM2EVMOnRamp(Router(getRouter()).getOnRamp(s_counterpartChainSelector)).payNops(); + emit Funded(); + } + } + + function getCountIncrBeforeFunding() external view returns (uint8) { + return s_countIncrBeforeFunding; + } + + function setCountIncrBeforeFunding(uint8 countIncrBeforeFunding) public onlyOwner { + s_countIncrBeforeFunding = countIncrBeforeFunding; + emit CountIncrBeforeFundingSet(countIncrBeforeFunding); + } +} diff --git a/contracts/src/v0.8/ccip/applications/TokenProxy.sol b/contracts/src/v0.8/ccip/applications/internal/TokenProxy.sol similarity index 88% rename from contracts/src/v0.8/ccip/applications/TokenProxy.sol rename to contracts/src/v0.8/ccip/applications/internal/TokenProxy.sol index 6fd26c076b..df0c3ffdc3 100644 --- a/contracts/src/v0.8/ccip/applications/TokenProxy.sol +++ b/contracts/src/v0.8/ccip/applications/internal/TokenProxy.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.24; -import {IRouterClient} from "../interfaces/IRouterClient.sol"; +import {IRouterClient} from "../../interfaces/IRouterClient.sol"; -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {Client} from "../libraries/Client.sol"; +import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; +import {Client} from "../../libraries/Client.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 {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"; contract TokenProxy is OwnerIsCreator { using SafeERC20 for IERC20; diff --git a/contracts/src/v0.8/ccip/test/applications/DefensiveExample.t.sol b/contracts/src/v0.8/ccip/test/applications/DefensiveExample.t.sol deleted file mode 100644 index 64e7f0eee9..0000000000 --- a/contracts/src/v0.8/ccip/test/applications/DefensiveExample.t.sol +++ /dev/null @@ -1,97 +0,0 @@ -// // SPDX-License-Identifier: MIT -// pragma solidity ^0.8.0; - -// import {DefensiveExample} from "../../applications/DefensiveExample.sol"; -// import {Client} from "../../libraries/Client.sol"; -// import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -// import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -// contract DefensiveExampleTest is EVM2EVMOnRampSetup { -// event MessageFailed(bytes32 indexed messageId, bytes reason); -// event MessageSucceeded(bytes32 indexed messageId); -// event MessageRecovered(bytes32 indexed messageId); - -// DefensiveExample internal s_receiver; -// uint64 internal sourceChainSelector = 7331; - -// function setUp() public virtual override { -// EVM2EVMOnRampSetup.setUp(); - -// s_receiver = new DefensiveExample(s_destRouter, IERC20(s_destFeeToken)); -// s_receiver.enableChain(sourceChainSelector, abi.encode("")); -// } - -// function test_Recovery() public { -// bytes32 messageId = keccak256("messageId"); -// address token = address(s_destFeeToken); -// uint256 amount = 111333333777; -// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); -// destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); - -// // Make sure we give the receiver contract enough tokens like CCIP would. -// deal(token, address(s_receiver), amount); - -// // Make sure the contract call reverts so we can test recovery. -// s_receiver.setSimRevert(true); - -// // The receiver contract will revert if the router is not the sender. -// vm.startPrank(address(s_destRouter)); - -// vm.expectEmit(); -// emit MessageFailed(messageId, abi.encodeWithSelector(DefensiveExample.ErrorCase.selector)); - -// s_receiver.ccipReceive( -// Client.Any2EVMMessage({ -// messageId: messageId, -// sourceChainSelector: sourceChainSelector, -// sender: abi.encode(address(0)), // wrong sender, will revert internally -// data: "", -// destTokenAmounts: destTokenAmounts -// }) -// ); - -// address tokenReceiver = address(0x000001337); -// uint256 tokenReceiverBalancePre = IERC20(token).balanceOf(tokenReceiver); -// uint256 receiverBalancePre = IERC20(token).balanceOf(address(s_receiver)); - -// // Recovery can only be done by the owner. -// vm.startPrank(OWNER); - -// vm.expectEmit(); -// emit MessageRecovered(messageId); - -// s_receiver.retryFailedMessage(messageId, tokenReceiver); - -// // Assert the tokens have successfully been rescued from the contract. -// assertEq(IERC20(token).balanceOf(tokenReceiver), tokenReceiverBalancePre + amount); -// assertEq(IERC20(token).balanceOf(address(s_receiver)), receiverBalancePre - amount); -// } - -// function test_HappyPath_Success() public { -// bytes32 messageId = keccak256("messageId"); -// address token = address(s_destFeeToken); -// uint256 amount = 111333333777; -// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); -// destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); - -// // Make sure we give the receiver contract enough tokens like CCIP would. -// deal(token, address(s_receiver), amount); - -// // The receiver contract will revert if the router is not the sender. -// vm.startPrank(address(s_destRouter)); - -// vm.expectEmit(); -// emit MessageSucceeded(messageId); - -// s_receiver.ccipReceive( -// Client.Any2EVMMessage({ -// messageId: messageId, -// sourceChainSelector: sourceChainSelector, -// sender: abi.encode(address(s_receiver)), // correct sender -// data: "", -// destTokenAmounts: destTokenAmounts -// }) -// ); -// } -// } diff --git a/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver.t.sol b/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver.t.sol deleted file mode 100644 index aa2312ac22..0000000000 --- a/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver.t.sol +++ /dev/null @@ -1,718 +0,0 @@ -// // SPDX-License-Identifier: MIT -// pragma solidity ^0.8.0; - -// import {Test} from "forge-std/Test.sol"; - -// import {CCIPRouter} from "../../applications/EtherSenderReceiver.sol"; - -// import {IRouterClient} from "../../interfaces/IRouterClient.sol"; -// import {Client} from "../../libraries/Client.sol"; -// import {WETH9} from "../WETH9.sol"; -// import {EtherSenderReceiverHelper} from "./../helpers/EtherSenderReceiverHelper.sol"; - -// import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; - -// contract EtherSenderReceiverTest is Test { -// EtherSenderReceiverHelper internal s_etherSenderReceiver; -// WETH9 internal s_weth; -// WETH9 internal s_someOtherWeth; -// ERC20 internal s_linkToken; - -// address internal constant OWNER = 0x00007e64E1fB0C487F25dd6D3601ff6aF8d32e4e; -// address internal constant ROUTER = 0x0F3779ee3a832D10158073ae2F5e61ac7FBBF880; -// address internal constant XCHAIN_RECEIVER = 0xBd91b2073218AF872BF73b65e2e5950ea356d147; - -// function setUp() public { -// vm.startPrank(OWNER); - -// s_linkToken = new ERC20("Chainlink Token", "LINK"); -// s_someOtherWeth = new WETH9(); -// s_weth = new WETH9(); -// vm.mockCall(ROUTER, abi.encodeWithSelector(CCIPRouter.getWrappedNative.selector), abi.encode(address(s_weth))); -// s_etherSenderReceiver = new EtherSenderReceiverHelper(ROUTER); - -// deal(OWNER, 1_000_000 ether); -// deal(address(s_linkToken), OWNER, 1_000_000 ether); - -// // deposit some eth into the weth contract. -// s_weth.deposit{value: 10 ether}(); -// uint256 wethSupply = s_weth.totalSupply(); -// assertEq(wethSupply, 10 ether, "total weth supply must be 10 ether"); -// } -// } - -// contract EtherSenderReceiverTest_constructor is EtherSenderReceiverTest { -// function test_constructor() public view { -// assertEq(s_etherSenderReceiver.getRouter(), ROUTER, "router must be set correctly"); -// uint256 allowance = s_weth.allowance(address(s_etherSenderReceiver), ROUTER); -// assertEq(allowance, type(uint256).max, "allowance must be set infinite"); -// } -// } - -// contract EtherSenderReceiverTest_validateFeeToken is EtherSenderReceiverTest { -// uint256 internal constant amount = 100; - -// error InsufficientMsgValue(uint256 gotAmount, uint256 msgValue); -// error TokenAmountNotEqualToMsgValue(uint256 gotAmount, uint256 msgValue); - -// function test_validateFeeToken_valid_native() public { -// Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); -// tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmount, -// feeToken: address(0), -// extraArgs: "" -// }); - -// s_etherSenderReceiver.validateFeeToken{value: amount + 1}(message); -// } - -// function test_validateFeeToken_valid_feeToken() public { -// Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); -// tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmount, -// feeToken: address(s_weth), -// extraArgs: "" -// }); - -// s_etherSenderReceiver.validateFeeToken{value: amount}(message); -// } - -// function test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() public { -// Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1); -// tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmount, -// feeToken: address(s_weth), -// extraArgs: "" -// }); - -// vm.expectRevert(abi.encodeWithSelector(TokenAmountNotEqualToMsgValue.selector, amount, amount + 1)); -// s_etherSenderReceiver.validateFeeToken{value: amount + 1}(message); -// } -// } - -// contract EtherSenderReceiverTest_validatedMessage is EtherSenderReceiverTest { -// error InvalidDestinationReceiver(bytes destReceiver); -// error InvalidTokenAmounts(uint256 gotAmounts); -// error InvalidWethAddress(address want, address got); -// error GasLimitTooLow(uint256 minLimit, uint256 gotLimit); - -// uint256 internal constant amount = 100; - -// function test_Fuzz_validatedMessage_msgSenderOverwrite(bytes memory data) public view { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: data, -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); -// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); -// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); -// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); -// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); -// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); -// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); -// } - -// function test_Fuzz_validatedMessage_tokenAddressOverwrite(address token) public view { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); -// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); -// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); -// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); -// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); -// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); -// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); -// } - -// function test_validatedMessage_emptyDataOverwrittenToMsgSender() public view { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); -// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); -// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); -// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); -// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); -// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); -// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); -// } - -// function test_validatedMessage_dataOverwrittenToMsgSender() public view { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: abi.encode(address(42)), -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); -// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); -// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); -// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); -// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); -// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); -// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); -// } - -// function test_validatedMessage_tokenOverwrittenToWeth() public view { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(42), // incorrect token. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); -// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); -// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); -// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); -// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); -// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); -// assertEq(validatedMessage.extraArgs, bytes(""), "extraArgs must be empty"); -// } - -// function test_validatedMessage_validMessage_extraArgs() public view { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 200_000})) -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); -// assertEq(validatedMessage.receiver, abi.encode(XCHAIN_RECEIVER), "receiver must be XCHAIN_RECEIVER"); -// assertEq(validatedMessage.data, abi.encode(OWNER), "data must be msg.sender"); -// assertEq(validatedMessage.tokenAmounts[0].token, address(s_weth), "token must be weth"); -// assertEq(validatedMessage.tokenAmounts[0].amount, amount, "amount must be correct"); -// assertEq(validatedMessage.feeToken, address(0), "feeToken must be 0"); -// assertEq( -// validatedMessage.extraArgs, -// Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 200_000})), -// "extraArgs must be correct" -// ); -// } - -// function test_validatedMessage_invalidTokenAmounts() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2); -// tokenAmounts[0] = Client.EVMTokenAmount({token: address(0), amount: amount}); -// tokenAmounts[1] = Client.EVMTokenAmount({token: address(0), amount: amount}); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// vm.expectRevert(abi.encodeWithSelector(InvalidTokenAmounts.selector, uint256(2))); -// s_etherSenderReceiver.validatedMessage(message); -// } -// } - -// contract EtherSenderReceiverTest_getFee is EtherSenderReceiverTest { -// uint64 internal constant destinationChainSelector = 424242; -// uint256 internal constant feeWei = 121212; -// uint256 internal constant amount = 100; - -// function test_getFee() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({token: address(0), amount: amount}); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeWei) -// ); - -// uint256 fee = s_etherSenderReceiver.getFee(destinationChainSelector, message); -// assertEq(fee, feeWei, "fee must be feeWei"); -// } -// } - -// contract EtherSenderReceiverTest_ccipReceive is EtherSenderReceiverTest { -// uint256 internal constant amount = 100; -// uint64 internal constant sourceChainSelector = 424242; -// address internal constant XCHAIN_SENDER = 0x9951529C13B01E542f7eE3b6D6665D292e9BA2E0; - -// error InvalidTokenAmounts(uint256 gotAmounts); -// error InvalidToken(address gotToken, address expectedToken); - -// function test_Fuzz_ccipReceive(uint256 tokenAmount) public { -// // cap to 10 ether because OWNER only has 10 ether. -// if (tokenAmount > 10 ether) { -// return; -// } - -// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); -// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: tokenAmount}); -// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ -// messageId: keccak256(abi.encode("ccip send")), -// sourceChainSelector: sourceChainSelector, -// sender: abi.encode(XCHAIN_SENDER), -// data: abi.encode(OWNER), -// destTokenAmounts: destTokenAmounts -// }); - -// // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. -// s_weth.transfer(address(s_etherSenderReceiver), tokenAmount); - -// uint256 balanceBefore = OWNER.balance; -// s_etherSenderReceiver.publicCcipReceive(message); -// uint256 balanceAfter = OWNER.balance; -// assertEq(balanceAfter, balanceBefore + tokenAmount, "balance must be correct"); -// } - -// function test_ccipReceive_happyPath() public { -// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); -// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); -// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ -// messageId: keccak256(abi.encode("ccip send")), -// sourceChainSelector: 424242, -// sender: abi.encode(XCHAIN_SENDER), -// data: abi.encode(OWNER), -// destTokenAmounts: destTokenAmounts -// }); - -// // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. -// s_weth.transfer(address(s_etherSenderReceiver), amount); - -// uint256 balanceBefore = OWNER.balance; -// s_etherSenderReceiver.publicCcipReceive(message); -// uint256 balanceAfter = OWNER.balance; -// assertEq(balanceAfter, balanceBefore + amount, "balance must be correct"); -// } - -// function test_ccipReceive_fallbackToWethTransfer() public { -// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); -// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); -// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ -// messageId: keccak256(abi.encode("ccip send")), -// sourceChainSelector: 424242, -// sender: abi.encode(XCHAIN_SENDER), -// data: abi.encode(address(s_linkToken)), // ERC20 cannot receive() ether. -// destTokenAmounts: destTokenAmounts -// }); - -// // simulate a cross-chain token transfer, just transfer the weth to s_etherSenderReceiver. -// s_weth.transfer(address(s_etherSenderReceiver), amount); - -// uint256 balanceBefore = address(s_linkToken).balance; -// s_etherSenderReceiver.publicCcipReceive(message); -// uint256 balanceAfter = address(s_linkToken).balance; -// assertEq(balanceAfter, balanceBefore, "balance must be unchanged"); -// uint256 wethBalance = s_weth.balanceOf(address(s_linkToken)); -// assertEq(wethBalance, amount, "weth balance must be correct"); -// } - -// function test_ccipReceive_wrongTokenAmount() public { -// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](2); -// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); -// destTokenAmounts[1] = Client.EVMTokenAmount({token: address(s_weth), amount: amount}); -// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ -// messageId: keccak256(abi.encode("ccip send")), -// sourceChainSelector: 424242, -// sender: abi.encode(XCHAIN_SENDER), -// data: abi.encode(OWNER), -// destTokenAmounts: destTokenAmounts -// }); - -// vm.expectRevert(abi.encodeWithSelector(InvalidTokenAmounts.selector, uint256(2))); -// s_etherSenderReceiver.publicCcipReceive(message); -// } - -// function test_ccipReceive_wrongToken() public { -// Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); -// destTokenAmounts[0] = Client.EVMTokenAmount({token: address(s_someOtherWeth), amount: amount}); -// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ -// messageId: keccak256(abi.encode("ccip send")), -// sourceChainSelector: 424242, -// sender: abi.encode(XCHAIN_SENDER), -// data: abi.encode(OWNER), -// destTokenAmounts: destTokenAmounts -// }); - -// vm.expectRevert(abi.encodeWithSelector(InvalidToken.selector, address(s_someOtherWeth), address(s_weth))); -// s_etherSenderReceiver.publicCcipReceive(message); -// } -// } - -// contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTest { -// error InsufficientFee(uint256 gotFee, uint256 fee); - -// uint256 internal constant amount = 100; -// uint64 internal constant destinationChainSelector = 424242; -// uint256 internal constant feeWei = 121212; -// uint256 internal constant feeJuels = 232323; - -// function test_Fuzz_ccipSend(uint256 feeFromRouter, uint256 feeSupplied) public { -// // cap the fuzzer because OWNER only has a million ether. -// vm.assume(feeSupplied < 1_000_000 ether - amount); - -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeFromRouter) -// ); - -// if (feeSupplied < feeFromRouter) { -// vm.expectRevert(); -// s_etherSenderReceiver.ccipSend{value: amount + feeSupplied}(destinationChainSelector, message); -// } else { -// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); -// vm.mockCall( -// ROUTER, -// feeSupplied, -// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), -// abi.encode(expectedMsgId) -// ); - -// bytes32 actualMsgId = -// s_etherSenderReceiver.ccipSend{value: amount + feeSupplied}(destinationChainSelector, message); -// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); -// } -// } - -// function test_Fuzz_ccipSend_feeToken(uint256 feeFromRouter, uint256 feeSupplied) public { -// // cap the fuzzer because OWNER only has a million LINK. -// vm.assume(feeSupplied < 1_000_000 ether - amount); - -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(s_linkToken), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeFromRouter) -// ); - -// s_linkToken.approve(address(s_etherSenderReceiver), feeSupplied); - -// if (feeSupplied < feeFromRouter) { -// vm.expectRevert(); -// s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); -// } else { -// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), -// abi.encode(expectedMsgId) -// ); - -// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); -// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); -// } -// } - -// function test_ccipSend_reverts_insufficientFee_weth() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(s_weth), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeWei) -// ); - -// s_weth.approve(address(s_etherSenderReceiver), feeWei - 1); - -// vm.expectRevert("SafeERC20: low-level call failed"); -// s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); -// } - -// function test_ccipSend_reverts_insufficientFee_feeToken() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(s_linkToken), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeJuels) -// ); - -// s_linkToken.approve(address(s_etherSenderReceiver), feeJuels - 1); - -// vm.expectRevert("ERC20: insufficient allowance"); -// s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); -// } - -// function test_ccipSend_reverts_insufficientFee_native() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeWei) -// ); - -// vm.expectRevert(); -// s_etherSenderReceiver.ccipSend{value: amount + feeWei - 1}(destinationChainSelector, message); -// } - -// function test_ccipSend_success_nativeExcess() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeWei) -// ); - -// // we assert that the correct value is sent to the router call, which should be -// // the msg.value - feeWei. -// vm.mockCall( -// ROUTER, -// feeWei + 1, -// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), -// abi.encode(expectedMsgId) -// ); - -// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount + feeWei + 1}(destinationChainSelector, message); -// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); -// } - -// function test_ccipSend_success_native() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(0), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeWei) -// ); -// vm.mockCall( -// ROUTER, -// feeWei, -// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), -// abi.encode(expectedMsgId) -// ); - -// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount + feeWei}(destinationChainSelector, message); -// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); -// } - -// function test_ccipSend_success_feeToken() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(s_linkToken), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeJuels) -// ); -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), -// abi.encode(expectedMsgId) -// ); - -// s_linkToken.approve(address(s_etherSenderReceiver), feeJuels); - -// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); -// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); -// uint256 routerAllowance = s_linkToken.allowance(address(s_etherSenderReceiver), ROUTER); -// assertEq(routerAllowance, feeJuels, "router allowance must be feeJuels"); -// } - -// function test_ccipSend_success_weth() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({ -// token: address(0), // callers may not specify this. -// amount: amount -// }); -// Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ -// receiver: abi.encode(XCHAIN_RECEIVER), -// data: "", -// tokenAmounts: tokenAmounts, -// feeToken: address(s_weth), -// extraArgs: "" -// }); - -// Client.EVM2AnyMessage memory validatedMessage = s_etherSenderReceiver.validatedMessage(message); - -// bytes32 expectedMsgId = keccak256(abi.encode("ccip send")); -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.getFee.selector, destinationChainSelector, validatedMessage), -// abi.encode(feeWei) -// ); -// vm.mockCall( -// ROUTER, -// abi.encodeWithSelector(IRouterClient.ccipSend.selector, destinationChainSelector, validatedMessage), -// abi.encode(expectedMsgId) -// ); - -// s_weth.approve(address(s_etherSenderReceiver), feeWei); - -// bytes32 actualMsgId = s_etherSenderReceiver.ccipSend{value: amount}(destinationChainSelector, message); -// assertEq(actualMsgId, expectedMsgId, "message id must be correct"); -// uint256 routerAllowance = s_weth.allowance(address(s_etherSenderReceiver), ROUTER); -// assertEq(routerAllowance, type(uint256).max, "router allowance must be max for weth"); -// } -// } diff --git a/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol b/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol deleted file mode 100644 index 327e93ef24..0000000000 --- a/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol +++ /dev/null @@ -1,61 +0,0 @@ -// pragma solidity ^0.8.0; - -// import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol"; - -// import {CCIPClientExample} from "../../applications/CCIPClientExample.sol"; -// import {Client} from "../../libraries/Client.sol"; -// import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -// import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; -// import {ERC165Checker} from -// "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/ERC165Checker.sol"; - -// contract CCIPClientExample_sanity is EVM2EVMOnRampSetup { -// function test_Examples() public { -// CCIPClientExample exampleContract = new CCIPClientExample(s_sourceRouter, IERC20(s_sourceFeeToken)); -// deal(address(exampleContract), 100 ether); -// deal(s_sourceFeeToken, address(exampleContract), 100 ether); - -// // feeToken approval works -// assertEq(IERC20(s_sourceFeeToken).allowance(address(exampleContract), address(s_sourceRouter)), 2 ** 256 - 1); - -// // Can set chain -// Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 300_000}); -// bytes memory encodedExtraArgs = Client._argsToBytes(extraArgs); -// exampleContract.enableChain(DEST_CHAIN_SELECTOR, encodedExtraArgs); -// assertEq(exampleContract.s_chains(DEST_CHAIN_SELECTOR), encodedExtraArgs); - -// address toAddress = address(100); - -// // Can send data pay native -// exampleContract.sendDataPayNative(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello")); - -// // Can send data pay feeToken -// exampleContract.sendDataPayFeeToken(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello")); - -// // Can send data tokens -// address sourceToken = s_sourceTokens[1]; -// assertEq( -// address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_SELECTOR, IERC20(sourceToken))), -// address(s_sourcePoolByToken[sourceToken]) -// ); -// deal(sourceToken, OWNER, 100 ether); -// IERC20(sourceToken).approve(address(exampleContract), 1 ether); -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); -// tokenAmounts[0] = Client.EVMTokenAmount({token: sourceToken, amount: 1 ether}); -// exampleContract.sendDataAndTokens(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello"), tokenAmounts); -// // Tokens transferred from owner to router then burned in pool. -// assertEq(IERC20(sourceToken).balanceOf(OWNER), 99 ether); -// assertEq(IERC20(sourceToken).balanceOf(address(s_sourceRouter)), 0); - -// // Can send just tokens -// IERC20(sourceToken).approve(address(exampleContract), 1 ether); -// exampleContract.sendTokens(DEST_CHAIN_SELECTOR, abi.encode(toAddress), tokenAmounts); - -// // Can receive -// assertTrue(ERC165Checker.supportsInterface(address(exampleContract), type(IAny2EVMMessageReceiver).interfaceId)); - -// // Can disable chain -// exampleContract.disableChain(DEST_CHAIN_SELECTOR); -// } -// } diff --git a/contracts/src/v0.8/ccip/test/applications/PingPongDemo.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPongDemo.t.sol deleted file mode 100644 index 4fed9b2b09..0000000000 --- a/contracts/src/v0.8/ccip/test/applications/PingPongDemo.t.sol +++ /dev/null @@ -1,121 +0,0 @@ -// // SPDX-License-Identifier: BUSL-1.1 -// pragma solidity 0.8.24; - -// import {PingPongDemo} from "../../applications/PingPongDemo.sol"; -// import {Client} from "../../libraries/Client.sol"; -// import "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -// // setup -// contract PingPongDappSetup is EVM2EVMOnRampSetup { -// PingPongDemo internal s_pingPong; -// IERC20 internal s_feeToken; - -// address internal immutable i_pongContract = address(10); - -// function setUp() public virtual override { -// EVM2EVMOnRampSetup.setUp(); - -// s_feeToken = IERC20(s_sourceTokens[0]); -// s_pingPong = new PingPongDemo(address(s_sourceRouter), s_feeToken); -// s_pingPong.setCounterpart(DEST_CHAIN_SELECTOR, i_pongContract); - -// uint256 fundingAmount = 1e18; - -// // Fund the contract with LINK tokens -// s_feeToken.transfer(address(s_pingPong), fundingAmount); -// } -// } - -// contract PingPong_startPingPong is PingPongDappSetup { -// function test_StartPingPong_Success() public { -// uint256 pingPongNumber = 1; -// bytes memory data = abi.encode(pingPongNumber); - -// Client.EVM2AnyMessage memory sentMessage = Client.EVM2AnyMessage({ -// receiver: abi.encode(i_pongContract), -// data: data, -// tokenAmounts: new Client.EVMTokenAmount[](0), -// feeToken: s_sourceFeeToken, -// extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 2e5})) -// }); - -// uint256 expectedFee = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, sentMessage); - -// Internal.EVM2EVMMessage memory message = Internal.EVM2EVMMessage({ -// sequenceNumber: 1, -// feeTokenAmount: expectedFee, -// sourceChainSelector: SOURCE_CHAIN_SELECTOR, -// sender: address(s_pingPong), -// receiver: i_pongContract, -// nonce: 1, -// data: data, -// tokenAmounts: sentMessage.tokenAmounts, -// sourceTokenData: new bytes[](sentMessage.tokenAmounts.length), -// gasLimit: 2e5, -// feeToken: sentMessage.feeToken, -// strict: false, -// messageId: "" -// }); -// message.messageId = Internal._hash(message, s_metadataHash); - -// vm.expectEmit(); -// emit PingPongDemo.Ping(pingPongNumber); - -// vm.expectEmit(); -// emit EVM2EVMOnRamp.CCIPSendRequested(message); - -// s_pingPong.startPingPong(); -// } -// } - -// contract PingPong_ccipReceive is PingPongDappSetup { -// function test_CcipReceive_Success() public { -// Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - -// uint256 pingPongNumber = 5; - -// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ -// messageId: bytes32("a"), -// sourceChainSelector: DEST_CHAIN_SELECTOR, -// sender: abi.encode(i_pongContract), -// data: abi.encode(pingPongNumber), -// destTokenAmounts: tokenAmounts -// }); - -// vm.startPrank(address(s_sourceRouter)); - -// vm.expectEmit(); -// emit PingPongDemo.Pong(pingPongNumber + 1); - -// s_pingPong.ccipReceive(message); -// } -// } - -// contract PingPong_plumbing is PingPongDappSetup { -// function test_Fuzz_CounterPartChainSelector_Success(uint64 chainSelector) public { -// s_pingPong.setCounterpartChainSelector(chainSelector); - -// assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); -// } - -// function test_Fuzz_CounterPartAddress_Success(address counterpartAddress) public { -// s_pingPong.setCounterpartAddress(counterpartAddress); - -// assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); -// } - -// function test_Fuzz_CounterPartAddress_Success(uint64 chainSelector, address counterpartAddress) public { -// s_pingPong.setCounterpart(chainSelector, counterpartAddress); - -// assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); -// assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); -// } - -// function test_Pausing_Success() public { -// assertFalse(s_pingPong.isPaused()); - -// s_pingPong.setPaused(true); - -// assertTrue(s_pingPong.isPaused()); -// } -// } diff --git a/contracts/src/v0.8/ccip/test/applications/SelfFundedPingPong.t.sol b/contracts/src/v0.8/ccip/test/applications/SelfFundedPingPong.t.sol deleted file mode 100644 index a857cf3b00..0000000000 --- a/contracts/src/v0.8/ccip/test/applications/SelfFundedPingPong.t.sol +++ /dev/null @@ -1,99 +0,0 @@ -// // SPDX-License-Identifier: BUSL-1.1 -// pragma solidity 0.8.24; - -// import {SelfFundedPingPong} from "../../applications/SelfFundedPingPong.sol"; -// import {Client} from "../../libraries/Client.sol"; -// import {EVM2EVMOnRamp} from "../../onRamp/EVM2EVMOnRamp.sol"; -// import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -// import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -// contract SelfFundedPingPongDappSetup is EVM2EVMOnRampSetup { -// SelfFundedPingPong internal s_pingPong; -// IERC20 internal s_feeToken; -// uint8 internal constant s_roundTripsBeforeFunding = 0; - -// address internal immutable i_pongContract = address(10); - -// function setUp() public virtual override { -// EVM2EVMOnRampSetup.setUp(); - -// s_feeToken = IERC20(s_sourceTokens[0]); -// s_pingPong = new SelfFundedPingPong(address(s_sourceRouter), s_feeToken, s_roundTripsBeforeFunding); -// s_pingPong.setCounterpart(DEST_CHAIN_SELECTOR, i_pongContract); - -// uint256 fundingAmount = 5e18; - -// // set ping pong as an onRamp nop to make sure that funding runs -// EVM2EVMOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMOnRamp.NopAndWeight[](1); -// nopsAndWeights[0] = EVM2EVMOnRamp.NopAndWeight({nop: address(s_pingPong), weight: 1}); -// s_onRamp.setNops(nopsAndWeights); - -// // Fund the contract with LINK tokens -// s_feeToken.transfer(address(s_pingPong), fundingAmount); -// } -// } - -// contract SelfFundedPingPong_ccipReceive is SelfFundedPingPongDappSetup { -// function test_Funding_Success() public { -// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ -// messageId: bytes32("a"), -// sourceChainSelector: DEST_CHAIN_SELECTOR, -// sender: abi.encode(i_pongContract), -// data: "", -// destTokenAmounts: new Client.EVMTokenAmount[](0) -// }); - -// uint8 countIncrBeforeFunding = 5; - -// vm.expectEmit(); -// emit SelfFundedPingPong.CountIncrBeforeFundingSet(countIncrBeforeFunding); - -// s_pingPong.setCountIncrBeforeFunding(countIncrBeforeFunding); - -// vm.startPrank(address(s_sourceRouter)); -// for (uint256 pingPongNumber = 0; pingPongNumber <= countIncrBeforeFunding; ++pingPongNumber) { -// message.data = abi.encode(pingPongNumber); -// if (pingPongNumber == countIncrBeforeFunding - 1) { -// vm.expectEmit(); -// emit SelfFundedPingPong.Funded(); -// vm.expectCall(address(s_onRamp), ""); -// } -// s_pingPong.ccipReceive(message); -// } -// } - -// function test_FundingIfNotANop_Revert() public { -// EVM2EVMOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMOnRamp.NopAndWeight[](0); -// s_onRamp.setNops(nopsAndWeights); - -// uint8 countIncrBeforeFunding = 3; -// s_pingPong.setCountIncrBeforeFunding(countIncrBeforeFunding); - -// vm.startPrank(address(s_sourceRouter)); -// Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ -// messageId: bytes32("a"), -// sourceChainSelector: DEST_CHAIN_SELECTOR, -// sender: abi.encode(i_pongContract), -// data: abi.encode(countIncrBeforeFunding), -// destTokenAmounts: new Client.EVMTokenAmount[](0) -// }); - -// // because pingPong is not set as a nop -// vm.expectRevert(EVM2EVMOnRamp.OnlyCallableByOwnerOrAdminOrNop.selector); -// s_pingPong.ccipReceive(message); -// } -// } - -// contract SelfFundedPingPong_setCountIncrBeforeFunding is SelfFundedPingPongDappSetup { -// function test_setCountIncrBeforeFunding() public { -// uint8 c = s_pingPong.getCountIncrBeforeFunding(); - -// vm.expectEmit(); -// emit SelfFundedPingPong.CountIncrBeforeFundingSet(c + 1); - -// s_pingPong.setCountIncrBeforeFunding(c + 1); -// uint8 c2 = s_pingPong.getCountIncrBeforeFunding(); -// assertEq(c2, c + 1); -// } -// } diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol similarity index 93% rename from contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol rename to contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol index 53f4fe67c1..f15a8e001a 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPClientTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; -import {IRouterClient} from "../../interfaces/IRouterClient.sol"; -import {CCIPClient} from "../../production-examples/CCIPClient.sol"; -import {CCIPReceiverWithACK} from "../../production-examples/CCIPClient.sol"; +import {CCIPClient} from "../../../applications/external/CCIPClient.sol"; +import {CCIPReceiverWithACK} from "../../../applications/external/CCIPClient.sol"; +import {ICCIPClientBase} from "../../../interfaces/ICCIPClientBase.sol"; +import {IRouterClient} from "../../../interfaces/IRouterClient.sol"; -import {Client} from "../../libraries/Client.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; +import {Client} from "../../../libraries/Client.sol"; +import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; contract CCIPClientTest is EVM2EVMOnRampSetup { event MessageFailed(bytes32 indexed messageId, bytes reason); diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol similarity index 95% rename from contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol rename to contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index 7e943915f3..952fbcc1e4 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; -import {CCIPReceiver} from "../../production-examples/CCIPReceiver.sol"; +import {CCIPReceiver} from "../../../applications/external/CCIPReceiver.sol"; +import {ICCIPClientBase} from "../../../interfaces/ICCIPClientBase.sol"; -import {Client} from "../../libraries/Client.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; +import {Client} from "../../../libraries/Client.sol"; +import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; contract CCIPReceiverTest is EVM2EVMOnRampSetup { event MessageFailed(bytes32 indexed messageId, bytes reason); diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol similarity index 94% rename from contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol rename to contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol index 52e8dd374a..a18ffee47c 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPReceiverWithAckTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; -import {CCIPReceiverWithACK} from "../../production-examples/CCIPReceiverWithACK.sol"; +import {CCIPReceiverWithACK} from "../../../applications/external/CCIPReceiverWithACK.sol"; +import {ICCIPClientBase} from "../../../interfaces/ICCIPClientBase.sol"; -import {Client} from "../../libraries/Client.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; +import {Client} from "../../../libraries/Client.sol"; +import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { event MessageFailed(bytes32 indexed messageId, bytes reason); diff --git a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol similarity index 91% rename from contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol rename to contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol index 702f9416b9..6f7b1c57a6 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/CCIPSenderTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; -import {CCIPSender} from "../../production-examples/CCIPSender.sol"; +import {CCIPSender} from "../../../applications/external/CCIPSender.sol"; +import {ICCIPClientBase} from "../../../interfaces/ICCIPClientBase.sol"; -import {Client} from "../../libraries/Client.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; +import {Client} from "../../../libraries/Client.sol"; +import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; -import {IRouterClient} from "../../interfaces/IRouterClient.sol"; +import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IRouterClient} from "../../../interfaces/IRouterClient.sol"; contract CCIPSenderTest is EVM2EVMOnRampSetup { event MessageFailed(bytes32 indexed messageId, bytes reason); diff --git a/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol similarity index 95% rename from contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol rename to contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol index 77649f5c7a..08b07c76e9 100644 --- a/contracts/src/v0.8/ccip/test/production-examples/PingPongDemoTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; -import {Client} from "../../libraries/Client.sol"; -import {PingPongDemo} from "../../production-examples/PingPongDemo.sol"; -import "../onRamp/EVM2EVMOnRampSetup.t.sol"; +import {PingPongDemo} from "../../../applications/internal/PingPongDemo.sol"; +import {Client} from "../../../libraries/Client.sol"; +import "../../onRamp/EVM2EVMOnRampSetup.t.sol"; // setup contract PingPongDappSetup is EVM2EVMOnRampSetup { diff --git a/contracts/src/v0.8/ccip/test/applications/internal/SelfFundedPingPong.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/SelfFundedPingPong.t.sol new file mode 100644 index 0000000000..8dbbc2f39c --- /dev/null +++ b/contracts/src/v0.8/ccip/test/applications/internal/SelfFundedPingPong.t.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {CCIPReceiver} from "../../../applications/external/CCIPReceiver.sol"; +import {SelfFundedPingPong} from "../../../applications/internal/SelfFundedPingPong.sol"; + +import {Client} from "../../../libraries/Client.sol"; +import {EVM2EVMOnRamp} from "../../../onRamp/EVM2EVMOnRamp.sol"; +import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; + +import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +contract SelfFundedPingPongDappSetup is EVM2EVMOnRampSetup { + SelfFundedPingPong internal s_pingPong; + IERC20 internal s_feeToken; + uint8 internal constant s_roundTripsBeforeFunding = 0; + + address internal immutable i_pongContract = address(10); + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_feeToken = IERC20(s_sourceTokens[0]); + s_pingPong = new SelfFundedPingPong(address(s_sourceRouter), s_feeToken, s_roundTripsBeforeFunding); + s_pingPong.setCounterpart(DEST_CHAIN_SELECTOR, i_pongContract); + + uint256 fundingAmount = 5e18; + + // set ping pong as an onRamp nop to make sure that funding runs + EVM2EVMOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMOnRamp.NopAndWeight[](1); + nopsAndWeights[0] = EVM2EVMOnRamp.NopAndWeight({nop: address(s_pingPong), weight: 1}); + s_onRamp.setNops(nopsAndWeights); + + // Fund the contract with LINK tokens + s_feeToken.transfer(address(s_pingPong), fundingAmount); + } +} + +contract SelfFundedPingPong_ccipReceive is SelfFundedPingPongDappSetup { + function test_Funding_Success() public { + Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ + messageId: bytes32("a"), + sourceChainSelector: DEST_CHAIN_SELECTOR, + sender: abi.encode(i_pongContract), + data: "", + destTokenAmounts: new Client.EVMTokenAmount[](0) + }); + + uint8 countIncrBeforeFunding = 5; + + vm.expectEmit(); + emit SelfFundedPingPong.CountIncrBeforeFundingSet(countIncrBeforeFunding); + + s_pingPong.setCountIncrBeforeFunding(countIncrBeforeFunding); + + vm.startPrank(address(s_sourceRouter)); + for (uint256 pingPongNumber = 0; pingPongNumber <= countIncrBeforeFunding; ++pingPongNumber) { + message.data = abi.encode(pingPongNumber); + if (pingPongNumber == countIncrBeforeFunding - 1) { + vm.expectEmit(); + emit SelfFundedPingPong.Funded(); + vm.expectCall(address(s_onRamp), ""); + } + s_pingPong.ccipReceive(message); + } + } + + function test_FundingIfNotANop_Revert() public { + EVM2EVMOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMOnRamp.NopAndWeight[](0); + s_onRamp.setNops(nopsAndWeights); + + uint8 countIncrBeforeFunding = 3; + s_pingPong.setCountIncrBeforeFunding(countIncrBeforeFunding); + + vm.startPrank(address(s_sourceRouter)); + Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ + messageId: bytes32("a"), + sourceChainSelector: DEST_CHAIN_SELECTOR, + sender: abi.encode(i_pongContract), + data: abi.encode(countIncrBeforeFunding), + destTokenAmounts: new Client.EVMTokenAmount[](0) + }); + + // Because pingPong is not set as a nop expect call to occur, but the tx will not revert since it occurs inside a try-catch + vm.expectCall(address(s_onRamp), abi.encodePacked(EVM2EVMOnRamp.payNops.selector)); + + // Check that the revert occured as expected by watching for MessageFailed + // We don't care what the messageId was, only that the call failed for the right reason, so we check the revert string on the third topic + vm.expectEmit(false, false, true, false); + emit CCIPReceiver.MessageFailed( + bytes32(0), abi.encodePacked(EVM2EVMOnRamp.OnlyCallableByOwnerOrAdminOrNop.selector) + ); + + s_pingPong.ccipReceive(message); + } +} + +contract SelfFundedPingPong_setCountIncrBeforeFunding is SelfFundedPingPongDappSetup { + function test_setCountIncrBeforeFunding() public { + uint8 c = s_pingPong.getCountIncrBeforeFunding(); + + vm.expectEmit(); + emit SelfFundedPingPong.CountIncrBeforeFundingSet(c + 1); + + s_pingPong.setCountIncrBeforeFunding(c + 1); + uint8 c2 = s_pingPong.getCountIncrBeforeFunding(); + assertEq(c2, c + 1); + } +} diff --git a/contracts/src/v0.8/ccip/test/applications/TokenProxy.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/TokenProxy.t.sol similarity index 94% rename from contracts/src/v0.8/ccip/test/applications/TokenProxy.t.sol rename to contracts/src/v0.8/ccip/test/applications/internal/TokenProxy.t.sol index 9e78f6e369..aecde32a75 100644 --- a/contracts/src/v0.8/ccip/test/applications/TokenProxy.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/internal/TokenProxy.t.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.24; -import {TokenProxy} from "../../applications/TokenProxy.sol"; -import {Client} from "../../libraries/Client.sol"; -import {Internal} from "../../libraries/Internal.sol"; -import {EVM2EVMOnRamp} from "../../onRamp/EVM2EVMOnRamp.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; +import {TokenProxy} from "../../../applications/internal/TokenProxy.sol"; +import {Client} from "../../../libraries/Client.sol"; +import {Internal} from "../../../libraries/Internal.sol"; +import {EVM2EVMOnRamp} from "../../../onRamp/EVM2EVMOnRamp.sol"; +import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; contract TokenProxySetup is EVM2EVMOnRampSetup { TokenProxy internal s_tokenProxy; diff --git a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol index 8495f646e4..7ccf748c6b 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; +import {CCIPSender} from "../../applications/external/CCIPSender.sol"; import {Client} from "../../libraries/Client.sol"; -import {CCIPReceiverBasic} from "../../production-examples/CCIPReceiverBasic.sol"; -import {CCIPSender} from "../../production-examples/CCIPSender.sol"; +import {CCIPReceiverBasic} from "./receivers/CCIPReceiverBasic.sol"; import {IWrappedNative} from "../../interfaces/IWrappedNative.sol"; @@ -60,16 +60,16 @@ contract EtherSenderReceiverHelper is CCIPSender { view returns (Client.EVM2AnyMessage memory) { - Client.EVM2AnyMessage memory validatedMessage = message; + Client.EVM2AnyMessage memory validMessage = message; - if (validatedMessage.tokenAmounts.length != 1) { - revert InvalidTokenAmounts(validatedMessage.tokenAmounts.length); + if (validMessage.tokenAmounts.length != 1) { + revert InvalidTokenAmounts(validMessage.tokenAmounts.length); } - validatedMessage.data = abi.encode(msg.sender); - validatedMessage.tokenAmounts[0].token = address(i_weth); + validMessage.data = abi.encode(msg.sender); + validMessage.tokenAmounts[0].token = address(i_weth); - return validatedMessage; + return validMessage; } function publicCcipReceive(Client.Any2EVMMessage memory message) public { diff --git a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol similarity index 83% rename from contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol rename to contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol index 8e80ccc2b1..a457ea1793 100644 --- a/contracts/src/v0.8/ccip/production-examples/CCIPReceiverBasic.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol"; +import {IAny2EVMMessageReceiver} from "../../../interfaces/IAny2EVMMessageReceiver.sol"; -import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; -import {Client} from "../libraries/Client.sol"; -import {CCIPClientBase} from "./CCIPClientBase.sol"; +import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; + +import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {Client} from "../../../libraries/Client.sol"; /// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. contract CCIPReceiverBasic is CCIPClientBase, IAny2EVMMessageReceiver, IERC165 { diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol index a6c8d7bb58..8478217d46 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.24; import {Client} from "../../../libraries/Client.sol"; -import {CCIPReceiverBasic} from "../../../production-examples/CCIPReceiverBasic.sol"; +import {CCIPReceiverBasic} from "./CCIPReceiverBasic.sol"; contract ConformingReceiver is CCIPReceiverBasic { event MessageReceived(); diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol index 0af15a6714..5530dcc333 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.24; import {Client} from "../../../libraries/Client.sol"; import {Internal} from "../../../libraries/Internal.sol"; import {EVM2EVMOffRamp} from "../../../offRamp/EVM2EVMOffRamp.sol"; -import {CCIPReceiverBasic} from "../../../production-examples/CCIPReceiverBasic.sol"; +import {CCIPReceiverBasic} from "./CCIPReceiverBasic.sol"; contract ReentrancyAbuser is CCIPReceiverBasic { event ReentrancySucceeded(); diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol index 268b1fa728..11dcb6bbf1 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.19; import {Client} from "../../../libraries/Client.sol"; import {Internal} from "../../../libraries/Internal.sol"; import {EVM2EVMMultiOffRamp} from "../../../offRamp/EVM2EVMMultiOffRamp.sol"; -import {CCIPReceiverBasic} from "../../../production-examples/CCIPReceiverBasic.sol"; +import {CCIPReceiverBasic} from "./CCIPReceiverBasic.sol"; contract ReentrancyAbuserMultiRamp is CCIPReceiverBasic { event ReentrancySucceeded(); From 13b9c9133f1f619ebbebfb7692343b66f4c5dbfb Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 26 Jun 2024 14:27:02 -0400 Subject: [PATCH 10/31] fix issues created during merge, and --- contracts/gas-snapshots/ccip.gas-snapshot | 132 +++++++++---- .../ccip/applications/CCIPClientExample.sol | 174 ----------------- .../ccip/applications/EtherSenderReceiver.sol | 182 ------------------ .../ccip/applications/external/CCIPClient.sol | 12 +- .../applications/external/CCIPClientBase.sol | 43 +++-- .../external/CCIPReceiverWithACK.sol | 2 +- .../ccip/applications/external/CCIPSender.sol | 4 +- .../applications/internal/PingPongDemo.sol | 7 +- .../test/applications/ImmutableExample.t.sol | 61 ------ .../external/CCIPReceiverTest.t.sol | 3 +- 10 files changed, 135 insertions(+), 485 deletions(-) delete mode 100644 contracts/src/v0.8/ccip/applications/CCIPClientExample.sol delete mode 100644 contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol delete mode 100644 contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index c4f04f4a5e..fe15519809 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,34 +34,84 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28789) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55208) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243659) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 329845) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 346013) -CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 84106) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 241012) -CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 552160) -CCIPReceiverTest:test_HappyPath_Success() (gas: 191871) -CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426569) -CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430405) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195931) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422998) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18764) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 53048) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 329799) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435470) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2527173) -CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72547) -CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 81734) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 334866) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 223788) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 368070) -CommitStore_constructor:test_Constructor_Success() (gas: 3113994) -CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 74815) -CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28693) -CommitStore_report:test_InvalidInterval_Revert() (gas: 28633) -CommitStore_report:test_InvalidRootRevert() (gas: 27866) -CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 55389) -CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 61208) -CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 55387) +CCIPCapabilityConfigurationSetup:test_getCapabilityConfiguration_Success() (gas: 9561) +CCIPCapabilityConfiguration_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70645) +CCIPCapabilityConfiguration_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 350565) +CCIPCapabilityConfiguration_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 471510) +CCIPCapabilityConfiguration_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 440232) +CCIPCapabilityConfiguration_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 37027) +CCIPCapabilityConfiguration_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 61043) +CCIPCapabilityConfiguration_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 60963) +CCIPCapabilityConfiguration_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11764) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8897) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 303038) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 49619) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 32253) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 367516) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 120877) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 156973) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 367292) +CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 157040) +CCIPCapabilityConfiguration_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9648) +CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_InitToRunning_Success() (gas: 1044370) +CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 27539) +CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 23083) +CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_RunningToStaging_Success() (gas: 1992245) +CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_StagingToRunning_Success() (gas: 2595825) +CCIPCapabilityConfiguration__updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9626) +CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1833893) +CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1055282) +CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1055313) +CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilityRegistryCanCall_Reverts() (gas: 9576) +CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16070) +CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9626) +CCIPCapabilityConfiguration_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 182909) +CCIPCapabilityConfiguration_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 342472) +CCIPCapabilityConfiguration_chainConfig:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 19116) +CCIPCapabilityConfiguration_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 266071) +CCIPCapabilityConfiguration_chainConfig:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14807) +CCIPCapabilityConfiguration_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9604) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 285383) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 282501) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 283422) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 283588) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 287815) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1068544) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 282309) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_P2PIdsLengthNotMatching_Reverts() (gas: 284277) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_Success() (gas: 289222) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() (gas: 285518) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1120660) +CCIPCapabilityConfiguration_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1119000) +CCIPCapabilityConfiguration_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9540) +CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 329842) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 345519) +CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 84023) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 240978) +CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 551652) +CCIPReceiverTest:test_HappyPath_Success() (gas: 191895) +CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426665) +CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430412) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195900) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422972) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18786) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 53078) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 329840) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435500) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2559441) +CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72524) +CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 81718) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 334315) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 223821) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 367519) +CommitStore_constructor:test_Constructor_Success() (gas: 3091440) +CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 75331) +CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28784) +CommitStore_report:test_InvalidInterval_Revert() (gas: 28724) +CommitStore_report:test_InvalidRootRevert() (gas: 27957) +CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 55480) +CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 61390) +CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 55478) CommitStore_report:test_Paused_Revert() (gas: 21259) CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 86469) CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56427) @@ -82,8 +132,6 @@ CommitStore_verify:test_Blessed_Success() (gas: 96279) CommitStore_verify:test_NotBlessed_Success() (gas: 58800) CommitStore_verify:test_Paused_Revert() (gas: 18496) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) -DefensiveExampleTest:test_Recovery() (gas: 424253) E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106837) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38297) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108537) @@ -161,7 +209,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 170378) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 182190) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47177) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 405951) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1390097) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 233102) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 180689) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 251836) @@ -193,8 +241,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 199879) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28213) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 160718) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 497791) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2371474) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1482012) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3173532) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 201989) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 202563) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 651271) @@ -333,7 +381,7 @@ EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101560) EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165312) EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 178182) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41431) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 402717) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1386878) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 160103) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175334) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248878) @@ -365,14 +413,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132026) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 484053) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1468371) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 187049) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26009) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 189243) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188704) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2028045) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2853756) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144226) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -632,9 +680,9 @@ OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 381362) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 148868) -PingPong_plumbing:test_Pausing_Success() (gas: 17803) -PingPong_startPingPong:test_StartPingPong_Success() (gas: 178941) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 200924) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17898) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 224406) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_applyPriceUpdatersUpdates:test_ApplyPriceUpdaterUpdates_Success() (gas: 82654) @@ -763,9 +811,9 @@ Router_routeMessage:test_ManualExec_Success() (gas: 35387) Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25122) Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44669) Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 53600) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 419773) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20157) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 288024) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 449940) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20226) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12629) diff --git a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol b/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol deleted file mode 100644 index 7fe8977948..0000000000 --- a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IRouterClient} from "../interfaces/IRouterClient.sol"; - -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {Client} from "../libraries/Client.sol"; -import {CCIPReceiver} from "./CCIPReceiver.sol"; - -import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; - -// @notice Example of a client which supports EVM/non-EVM chains -// @dev If chain specific logic is required for different chain families (e.g. particular -// decoding the bytes sender for authorization checks), it may be required to point to a helper -// authorization contract unless all chain families are known up front. -// @dev If contract does not implement IAny2EVMMessageReceiver and IERC165, -// and tokens are sent to it, ccipReceive will not be called but tokens will be transferred. -// @dev If the client is upgradeable you have significantly more flexibility and -// can avoid storage based options like the below contract uses. However it's -// worth carefully considering how the trust assumptions of your client dapp will -// change if you introduce upgradeability. An immutable dapp building on top of CCIP -// like the example below will inherit the trust properties of CCIP (i.e. the oracle network). -// @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting -// new chain family receivers (e.g. a solana encoded receiver address) without upgrading. -contract CCIPClientExample is CCIPReceiver, OwnerIsCreator { - error InvalidConfig(); - error InvalidChain(uint64 chainSelector); - - event MessageSent(bytes32 messageId); - event MessageReceived(bytes32 messageId); - - // Current feeToken - IERC20 public s_feeToken; - // Below is a simplistic example (same params for all messages) of using storage to allow for new options without - // upgrading the dapp. Note that extra args are chain family specific (e.g. gasLimit is EVM specific etc.). - // and will always be backwards compatible i.e. upgrades are opt-in. - // Offchain we can compute the V1 extraArgs: - // Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 300_000}); - // bytes memory encodedV1ExtraArgs = Client._argsToBytes(extraArgs); - // Then later compute V2 extraArgs, for example if a refund feature was added: - // Client.EVMExtraArgsV2 memory extraArgs = Client.EVMExtraArgsV2({gasLimit: 300_000, destRefundAddress: 0x1234}); - // bytes memory encodedV2ExtraArgs = Client._argsToBytes(extraArgs); - // and update storage with the new args. - // If different options are required for different messages, for example different gas limits, - // one can simply key based on (chainSelector, messageType) instead of only chainSelector. - mapping(uint64 destChainSelector => bytes extraArgsBytes) public s_chains; - - constructor(IRouterClient router, IERC20 feeToken) CCIPReceiver(address(router)) { - s_feeToken = feeToken; - s_feeToken.approve(address(router), type(uint256).max); - } - - function enableChain(uint64 chainSelector, bytes memory extraArgs) external onlyOwner { - s_chains[chainSelector] = extraArgs; - } - - function disableChain(uint64 chainSelector) external onlyOwner { - delete s_chains[chainSelector]; - } - - function ccipReceive(Client.Any2EVMMessage calldata message) - external - virtual - override - onlyRouter - validChain(message.sourceChainSelector) - { - // Extremely important to ensure only router calls this. - // Tokens in message if any will be transferred to this contract - // TODO: Validate sender/origin chain and process message and/or tokens. - _ccipReceive(message); - } - - function _ccipReceive(Client.Any2EVMMessage memory message) internal override { - emit MessageReceived(message.messageId); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native asset. - function sendDataPayNative( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data - ) external validChain(destChainSelector) { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(0) // We leave the feeToken empty indicating we'll pay raw native. - }); - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend{ - value: IRouterClient(i_ccipRouter).getFee(destChainSelector, message) - }(destChainSelector, message); - emit MessageSent(messageId); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient feeToken. - function sendDataPayFeeToken( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data - ) external validChain(destChainSelector) { - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } - - /// @notice sends data to receiver on dest chain. Assumes address(this) has sufficient native token. - function sendDataAndTokens( - uint64 destChainSelector, - bytes memory receiver, - bytes memory data, - Client.EVMTokenAmount[] memory tokenAmounts - ) external validChain(destChainSelector) { - for (uint256 i = 0; i < tokenAmounts.length; ++i) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); - } - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } - - // @notice user sends tokens to a receiver - // Approvals can be optimized with a whitelist of tokens and inf approvals if desired. - function sendTokens( - uint64 destChainSelector, - bytes memory receiver, - Client.EVMTokenAmount[] memory tokenAmounts - ) external validChain(destChainSelector) { - for (uint256 i = 0; i < tokenAmounts.length; ++i) { - IERC20(tokenAmounts[i].token).transferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).approve(i_ccipRouter, tokenAmounts[i].amount); - } - bytes memory data; - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: receiver, - data: data, - tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector], - feeToken: address(s_feeToken) - }); - // Optional uint256 fee = i_ccipRouter.getFee(destChainSelector, message); - // Can decide if fee is acceptable. - // address(this) must have sufficient feeToken or the send will revert. - bytes32 messageId = IRouterClient(i_ccipRouter).ccipSend(destChainSelector, message); - emit MessageSent(messageId); - } - - modifier validChain(uint64 chainSelector) { - if (s_chains[chainSelector].length == 0) revert InvalidChain(chainSelector); - _; - } -} diff --git a/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol b/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol deleted file mode 100644 index 10a1d202d9..0000000000 --- a/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol +++ /dev/null @@ -1,182 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.24; - -import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; - -import {IRouterClient} from "../interfaces/IRouterClient.sol"; -import {IWrappedNative} from "../interfaces/IWrappedNative.sol"; - -import {Client} from "./../libraries/Client.sol"; -import {CCIPReceiver} from "./CCIPReceiver.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"; - -interface CCIPRouter { - function getWrappedNative() external view returns (address); -} - -/// @notice A contract that can send raw ether cross-chain using CCIP. -/// Since CCIP only supports ERC-20 token transfers, this contract accepts -/// normal ether, wraps it, and uses CCIP to send it cross-chain. -/// On the receiving side, the wrapped ether is unwrapped and sent to the final receiver. -/// @notice This contract only supports chains where the wrapped native contract -/// is the WETH contract (i.e not WMATIC, or WAVAX, etc.). This is because the -/// receiving contract will always unwrap the ether using it's local wrapped native contract. -/// @dev This contract is both a sender and a receiver. This same contract can be -/// deployed on source and destination chains to facilitate cross-chain ether transfers -/// and act as a sender and a receiver. -/// @dev This contract is intentionally ownerless and permissionless. This contract -/// will never hold any excess funds, native or otherwise, when used correctly. -contract EtherSenderReceiver is CCIPReceiver, ITypeAndVersion { - using SafeERC20 for IERC20; - - error InvalidTokenAmounts(uint256 gotAmounts); - error InvalidToken(address gotToken, address expectedToken); - error TokenAmountNotEqualToMsgValue(uint256 gotAmount, uint256 msgValue); - error InsufficientMsgValue(uint256 gotAmount, uint256 msgValue); - error InsufficientFee(uint256 gotFee, uint256 fee); - error GasLimitTooLow(uint256 minLimit, uint256 gotLimit); - - string public constant override typeAndVersion = "EtherSenderReceiver 1.5.0"; - - /// @notice The wrapped native token address. - /// @dev If the wrapped native token address changes on the router, this contract will need to be redeployed. - IWrappedNative public immutable i_weth; - - /// @param router The CCIP router address. - constructor(address router) CCIPReceiver(router) { - i_weth = IWrappedNative(CCIPRouter(router).getWrappedNative()); - i_weth.approve(router, type(uint256).max); - } - - /// @notice Need this in order to unwrap correctly. - receive() external payable {} - - /// @notice Get the fee for sending a message to a destination chain. - /// This is mirrored from the router for convenience, construct the appropriate - /// message and get it's fee. - /// @param destinationChainSelector The destination chainSelector - /// @param message The cross-chain CCIP message including data and/or tokens - /// @return fee returns execution fee for the message - /// delivery to destination chain, denominated in the feeToken specified in the message. - /// @dev Reverts with appropriate reason upon invalid message. - function getFee( - uint64 destinationChainSelector, - Client.EVM2AnyMessage calldata message - ) external view returns (uint256 fee) { - Client.EVM2AnyMessage memory validatedMessage = _validatedMessage(message); - - return IRouterClient(getRouter()).getFee(destinationChainSelector, validatedMessage); - } - - /// @notice Send raw native tokens cross-chain. - /// @param destinationChainSelector The destination chain selector. - /// @param message The CCIP message with the following fields correctly set: - /// - bytes receiver: The _contract_ address on the destination chain that will receive the wrapped ether. - /// The caller must ensure that this contract address is correct, otherwise funds may be lost forever. - /// - address feeToken: The fee token address. Must be address(0) for native tokens, or a supported CCIP fee token otherwise (i.e, LINK token). - /// In the event a feeToken is set, we will transferFrom the caller the fee amount before sending the message, in order to forward them to the router. - /// - EVMTokenAmount[] tokenAmounts: The tokenAmounts array must contain a single element with the following fields: - /// - uint256 amount: The amount of ether to send. - /// There are a couple of cases here that depend on the fee token specified: - /// 1. If feeToken == address(0), the fee must be included in msg.value. Therefore tokenAmounts[0].amount must be less than msg.value, - /// and the difference will be used as the fee. - /// 2. If feeToken != address(0), the fee is not included in msg.value, and tokenAmounts[0].amount must be equal to msg.value. - /// these fees to the CCIP router. - /// @return messageId The CCIP message ID. - function ccipSend( - uint64 destinationChainSelector, - Client.EVM2AnyMessage calldata message - ) external payable returns (bytes32) { - _validateFeeToken(message); - Client.EVM2AnyMessage memory validatedMessage = _validatedMessage(message); - - i_weth.deposit{value: validatedMessage.tokenAmounts[0].amount}(); - - uint256 fee = IRouterClient(getRouter()).getFee(destinationChainSelector, validatedMessage); - if (validatedMessage.feeToken != address(0)) { - // If the fee token is not native, we need to transfer the fee to this contract and re-approve it to the router. - // Its not possible to have any leftover tokens in this path because we transferFrom the exact fee that CCIP - // requires from the caller. - IERC20(validatedMessage.feeToken).safeTransferFrom(msg.sender, address(this), fee); - - // We gave an infinite approval of weth to the router in the constructor. - if (validatedMessage.feeToken != address(i_weth)) { - IERC20(validatedMessage.feeToken).approve(getRouter(), fee); - } - - return IRouterClient(getRouter()).ccipSend(destinationChainSelector, validatedMessage); - } - - // We don't want to keep any excess ether in this contract, so we send over the entire address(this).balance as the fee. - // CCIP will revert if the fee is insufficient, so we don't need to check here. - return IRouterClient(getRouter()).ccipSend{value: address(this).balance}(destinationChainSelector, validatedMessage); - } - - /// @notice Validate the message content. - /// @dev Only allows a single token to be sent. Always overwritten to be address(i_weth) - /// and receiver is always msg.sender. - function _validatedMessage(Client.EVM2AnyMessage calldata message) - internal - view - returns (Client.EVM2AnyMessage memory) - { - Client.EVM2AnyMessage memory validatedMessage = message; - - if (validatedMessage.tokenAmounts.length != 1) { - revert InvalidTokenAmounts(validatedMessage.tokenAmounts.length); - } - - validatedMessage.data = abi.encode(msg.sender); - validatedMessage.tokenAmounts[0].token = address(i_weth); - - return validatedMessage; - } - - function _validateFeeToken(Client.EVM2AnyMessage calldata message) internal view { - uint256 tokenAmount = message.tokenAmounts[0].amount; - - if (message.feeToken != address(0)) { - // If the fee token is NOT native, then the token amount must be equal to msg.value. - // This is done to ensure that there is no leftover ether in this contract. - if (msg.value != tokenAmount) { - revert TokenAmountNotEqualToMsgValue(tokenAmount, msg.value); - } - } - } - - /// @notice Receive the wrapped ether, unwrap it, and send it to the specified EOA in the data field. - /// @param message The CCIP message containing the wrapped ether amount and the final receiver. - /// @dev The code below should never revert if the message being is valid according - /// to the above _validatedMessage and _validateFeeToken functions. - function _ccipReceive(Client.Any2EVMMessage memory message) internal override { - address receiver = abi.decode(message.data, (address)); - - if (message.destTokenAmounts.length != 1) { - revert InvalidTokenAmounts(message.destTokenAmounts.length); - } - - if (message.destTokenAmounts[0].token != address(i_weth)) { - revert InvalidToken(message.destTokenAmounts[0].token, address(i_weth)); - } - - uint256 tokenAmount = message.destTokenAmounts[0].amount; - i_weth.withdraw(tokenAmount); - - // it is possible that the below call may fail if receiver.code.length > 0 and the contract - // doesn't e.g have a receive() or a fallback() function. - (bool success,) = payable(receiver).call{value: tokenAmount}(""); - if (!success) { - // We have a few options here: - // 1. Revert: this is bad generally because it may mean that these tokens are stuck. - // 2. Store the tokens in a mapping and allow the user to withdraw them with another tx. - // 3. Send WETH to the receiver address. - // We opt for (3) here because at least the receiver will have the funds and can unwrap them if needed. - // However it is worth noting that if receiver is actually a contract AND the contract _cannot_ withdraw - // the WETH, then the WETH will be stuck in this contract. - i_weth.deposit{value: tokenAmount}(); - i_weth.transfer(receiver, tokenAmount); - } - } -} diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 7a90084387..ecd94b89af 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -1,12 +1,12 @@ pragma solidity ^0.8.0; -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 {IRouterClient} from "../../interfaces/IRouterClient.sol"; +import {Client} from "../../libraries/Client.sol"; import {CCIPReceiverWithACK} from "./CCIPReceiverWithACK.sol"; -import {IRouterClient} from "../../interfaces/IRouterClient.sol"; -import {Client} from "../../libraries/Client.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"; contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; @@ -28,10 +28,10 @@ contract CCIPClient is CCIPReceiverWithACK { address feeToken ) public payable validChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: s_chains[destChainSelector], + receiver: s_chains[destChainSelector].recipient, data: data, tokenAmounts: tokenAmounts, - extraArgs: s_extraArgsBytes[destChainSelector], + extraArgs: s_chains[destChainSelector].extraArgsBytes, feeToken: feeToken }); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 6ace66b358..75dc5f3e42 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -15,12 +15,22 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVer address internal immutable i_ccipRouter; - mapping(uint64 destChainSelector => mapping(bytes sender => bool approved)) public s_approvedSenders; - mapping(uint64 destChainSelector => bytes recipient) public s_chains; - mapping(uint64 destChainselector => bytes extraArgsBytes) public s_extraArgsBytes; + error ZeroAddressNotAllowed(); + + struct ChainInfo { + bytes recipient; + bytes extraArgsBytes; + mapping(bytes => bool) approvedSender; + } + + mapping(uint64 => ChainInfo) public s_chains; + + // mapping(uint64 => mapping(bytes sender => bool)) public s_approvedSenders; + // mapping(uint64 => bytes) public s_chains; + // mapping(uint64 => bytes) public s_extraArgsBytes; constructor(address router) { - if (router == address(0)) revert InvalidRouter(address(0)); + if (router == address(0)) revert ZeroAddressNotAllowed(); i_ccipRouter = router; } @@ -28,7 +38,7 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVer // │ Router Management │ // ================================================================ - function getRouter() public view returns (address) { + function getRouter() public view virtual returns (address) { return i_ccipRouter; } @@ -47,14 +57,20 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVer approvedSenderUpdate[] calldata removes ) external onlyOwner { for (uint256 i = 0; i < removes.length; ++i) { - delete s_approvedSenders[removes[i].destChainSelector][removes[i].sender]; + // delete s_approvedSenders[removes[i].destChainSelector][removes[i].sender]; + delete s_chains[removes[i].destChainSelector].approvedSender[removes[i].sender]; } for (uint256 i = 0; i < adds.length; ++i) { - s_approvedSenders[adds[i].destChainSelector][adds[i].sender] = true; + // s_approvedSenders[adds[i].destChainSelector][adds[i].sender] = true; + s_chains[adds[i].destChainSelector].approvedSender[adds[i].sender] = true; } } + function isApprovedSender(uint64 sourceChainSelector, bytes calldata senderAddr) external view returns (bool) { + return s_chains[sourceChainSelector].approvedSender[senderAddr]; + } + // ================================================================ // │ Fee Token Management │ // =============================================================== @@ -77,25 +93,26 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVer function enableChain( uint64 chainSelector, bytes calldata recipient, - bytes calldata extraArgsBytes + bytes calldata _extraArgsBytes ) external onlyOwner { - s_chains[chainSelector] = recipient; + s_chains[chainSelector].recipient = recipient; - if (extraArgsBytes.length != 0) s_extraArgsBytes[chainSelector] = extraArgsBytes; + if (_extraArgsBytes.length != 0) s_chains[chainSelector].extraArgsBytes = _extraArgsBytes; } function disableChain(uint64 chainSelector) external onlyOwner { delete s_chains[chainSelector]; - delete s_extraArgsBytes[chainSelector]; + // delete s_extraArgsBytes[chainSelector]; } modifier validChain(uint64 chainSelector) { - if (s_chains[chainSelector].length == 0) revert InvalidChain(chainSelector); + if (s_chains[chainSelector].recipient.length == 0) revert InvalidChain(chainSelector); _; } modifier validSender(uint64 chainSelector, bytes memory sender) { - if (!s_approvedSenders[chainSelector][sender]) revert InvalidSender(sender); + // if (!s_approvedSenders[chainSelector][sender]) revert InvalidSender(sender); + if (!s_chains[chainSelector].approvedSender[sender]) revert InvalidSender(sender); _; } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 9c35f8ab0a..a1384b2153 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -138,7 +138,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { receiver: incomingMessage.sender, data: abi.encode(ACKMESSAGEMAGICBYTES, incomingMessage.messageId), tokenAmounts: tokenAmounts, - extraArgs: s_extraArgsBytes[incomingMessage.sourceChainSelector], + extraArgs: s_chains[incomingMessage.sourceChainSelector].extraArgsBytes, //s_extraArgsBytes[incomingMessage.sourceChainSelector], feeToken: address(s_feeToken) }); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index 2ac119c46c..77c95654bb 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -44,11 +44,11 @@ contract CCIPSender is CCIPClientBase { address feeToken ) public payable validChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: s_chains[destChainSelector], + receiver: s_chains[destChainSelector].recipient, data: data, tokenAmounts: tokenAmounts, feeToken: feeToken, - extraArgs: s_extraArgsBytes[destChainSelector] + extraArgs: s_chains[destChainSelector].extraArgsBytes }); uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index c9cf40bb68..5bb7914d93 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -81,10 +81,11 @@ contract PingPongDemo is CCIPClient { s_counterpartAddress = counterpartAddress; // Approve the counterpart contract under validSender - s_approvedSenders[counterpartChainSelector][abi.encode(counterpartAddress)] = true; + // s_approvedSenders[counterpartChainSelector][abi.encode(counterpartAddress)] = true; + s_chains[counterpartChainSelector].approvedSender[abi.encode(counterpartAddress)] = true; // Approve the counterpart Chain selector under validChain - s_chains[counterpartChainSelector] = abi.encode(counterpartAddress); + s_chains[counterpartChainSelector].recipient = abi.encode(counterpartAddress); } function setCounterpartChainSelector(uint64 counterpartChainSelector) external onlyOwner { @@ -94,7 +95,7 @@ contract PingPongDemo is CCIPClient { function setCounterpartAddress(address counterpartAddress) external onlyOwner { s_counterpartAddress = counterpartAddress; - s_chains[s_counterpartChainSelector] = abi.encode(counterpartAddress); + s_chains[s_counterpartChainSelector].recipient = abi.encode(counterpartAddress); } function setPaused(bool pause) external onlyOwner { diff --git a/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol b/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol deleted file mode 100644 index c1ea303d68..0000000000 --- a/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol +++ /dev/null @@ -1,61 +0,0 @@ -pragma solidity ^0.8.0; - -import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol"; - -import {CCIPClientExample} from "../../applications/CCIPClientExample.sol"; -import {Client} from "../../libraries/Client.sol"; -import {EVM2EVMOnRampSetup} from "../onRamp/EVM2EVMOnRampSetup.t.sol"; - -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; -import {ERC165Checker} from - "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/ERC165Checker.sol"; - -contract CCIPClientExample_sanity is EVM2EVMOnRampSetup { - function test_Examples() public { - CCIPClientExample exampleContract = new CCIPClientExample(s_sourceRouter, IERC20(s_sourceFeeToken)); - deal(address(exampleContract), 100 ether); - deal(s_sourceFeeToken, address(exampleContract), 100 ether); - - // feeToken approval works - assertEq(IERC20(s_sourceFeeToken).allowance(address(exampleContract), address(s_sourceRouter)), 2 ** 256 - 1); - - // Can set chain - Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 300_000}); - bytes memory encodedExtraArgs = Client._argsToBytes(extraArgs); - exampleContract.enableChain(DEST_CHAIN_SELECTOR, encodedExtraArgs); - assertEq(exampleContract.s_chains(DEST_CHAIN_SELECTOR), encodedExtraArgs); - - address toAddress = address(100); - - // Can send data pay native - exampleContract.sendDataPayNative(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello")); - - // Can send data pay feeToken - exampleContract.sendDataPayFeeToken(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello")); - - // Can send data tokens - address sourceToken = s_sourceTokens[1]; - assertEq( - address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_SELECTOR, IERC20(sourceToken))), - address(s_sourcePoolByToken[sourceToken]) - ); - deal(sourceToken, OWNER, 100 ether); - IERC20(sourceToken).approve(address(exampleContract), 1 ether); - Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); - tokenAmounts[0] = Client.EVMTokenAmount({token: sourceToken, amount: 1 ether}); - exampleContract.sendDataAndTokens(DEST_CHAIN_SELECTOR, abi.encode(toAddress), bytes("hello"), tokenAmounts); - // Tokens transferred from owner to router then burned in pool. - assertEq(IERC20(sourceToken).balanceOf(OWNER), 99 ether); - assertEq(IERC20(sourceToken).balanceOf(address(s_sourceRouter)), 0); - - // Can send just tokens - IERC20(sourceToken).approve(address(exampleContract), 1 ether); - exampleContract.sendTokens(DEST_CHAIN_SELECTOR, abi.encode(toAddress), tokenAmounts); - - // Can receive - assertTrue(ERC165Checker.supportsInterface(address(exampleContract), type(IAny2EVMMessageReceiver).interfaceId)); - - // Can disable chain - exampleContract.disableChain(DEST_CHAIN_SELECTOR); - } -} diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index 952fbcc1e4..95037f3359 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -199,7 +199,8 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { s_receiver.updateApprovedSenders(new ICCIPClientBase.approvedSenderUpdate[](0), senderUpdates); - assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); + // assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); + assertFalse(s_receiver.isApprovedSender(sourceChainSelector, abi.encode(address(s_receiver)))); bytes32 messageId = keccak256("messageId"); address token = address(s_destFeeToken); From 6d0b0c18bec3a5412653dcbd9395db27f978985f Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 28 Jun 2024 11:32:28 -0400 Subject: [PATCH 11/31] updated geth wrappers for new audited reference contracts --- .../scripts/native_solc_compile_all_ccip | 11 +- .../ccip/generated/ccipClient/ccipClient.go | 1941 +++++++++++++++++ .../generated/ccipReceiver/ccipReceiver.go | 1287 +++++++++++ .../ccipReceiverWithAck.go | 1927 ++++++++++++++++ .../ccip/generated/ccipSender/ccipSender.go | 1029 +++++++++ .../ping_pong_demo/ping_pong_demo.go | 1552 +++++++++++-- .../self_funded_ping_pong.go | 1526 +++++++++++-- core/gethwrappers/ccip/go_generate.go | 7 +- 8 files changed, 9017 insertions(+), 263 deletions(-) create mode 100644 core/gethwrappers/ccip/generated/ccipClient/ccipClient.go create mode 100644 core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go create mode 100644 core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go create mode 100644 core/gethwrappers/ccip/generated/ccipSender/ccipSender.go diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 661de2b842..784425d1bc 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -54,9 +54,12 @@ compileContract () { # Contracts should be ordered in reverse-import-complexity-order to minimize overwrite risks. compileContract ccip/offRamp/EVM2EVMOffRamp.sol compileContract ccip/offRamp/EVM2EVMMultiOffRamp.sol -compileContract ccip/applications/PingPongDemo.sol -compileContract ccip/applications/SelfFundedPingPong.sol -compileContract ccip/applications/EtherSenderReceiver.sol +compileContract ccip/applications/internal/PingPongDemo.sol +compileContract ccip/applications/internal/SelfFundedPingPong.sol +compileContract ccip/applications/external/CCIPClient.sol +compileContract ccip/applications/external/CCIPReceiver.sol +compileContract ccip/applications/external/CCIPReceiverWithAck.sol +compileContract ccip/applications/external/CCIPSender.sol compileContract ccip/onRamp/EVM2EVMMultiOnRamp.sol compileContract ccip/onRamp/EVM2EVMOnRamp.sol compileContract ccip/CommitStore.sol @@ -77,6 +80,8 @@ compileContract ccip/tokenAdminRegistry/TokenAdminRegistry.sol compileContract ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol compileContract ccip/capability/CCIPCapabilityConfiguration.sol + + # Test helpers compileContract ccip/test/helpers/BurnMintERC677Helper.sol compileContract ccip/test/helpers/CommitStoreHelper.sol diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go new file mode 100644 index 0000000000..44de16fc5c --- /dev/null +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -0,0 +1,1941 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccipClient + +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 ClientAny2EVMMessage struct { + MessageId [32]byte + SourceChainSelector uint64 + Sender []byte + Data []byte + DestTokenAmounts []ClientEVMTokenAmount +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type ICCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + +var CCIPClientMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMagicBytes\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACKMESSAGEMAGICBYTES\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162004558380380620045588339810160408190526200003491620005c8565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000140565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013657620001366001600160a01b03821683600019620001eb565b50505050620006c5565b336001600160a01b038216036200019a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002695750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000241573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000267919062000607565b155b620002dd5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003359185916200033a16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000389906001600160a01b0385169084906200040b565b805190915015620003355780806020019051810190620003aa919062000621565b620003355760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b60606200041c848460008562000424565b949350505050565b606082471015620004875760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b03168587604051620004a5919062000672565b60006040518083038185875af1925050503d8060008114620004e4576040519150601f19603f3d011682016040523d82523d6000602084013e620004e9565b606091505b509092509050620004fd8783838762000508565b979650505050505050565b606083156200057c57825160000362000574576001600160a01b0385163b620005745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b50816200041c565b6200041c8383815115620005935781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000690565b6001600160a01b0381168114620005c557600080fd5b50565b60008060408385031215620005dc57600080fd5b8251620005e981620005af565b6020840151909250620005fc81620005af565b809150509250929050565b6000602082840312156200061a57600080fd5b5051919050565b6000602082840312156200063457600080fd5b815180151581146200064557600080fd5b9392505050565b60005b83811015620006695781810151838201526020016200064f565b50506000910152565b60008251620006868184602087016200064c565b9190910192915050565b6020815260008251806020840152620006b18160408501602087016200064c565b601f01601f19169190910160400192915050565b608051613e3f620007196000396000818161045c015281816105bf0152818161065d01528181610e1b015281816117f5015281816119c801528181611bde0152818161235b01526124270152613e3f6000f3fe60806040526004361061016c5760003560e01c80636939cd97116100ca578063cf6730f811610079578063effde24011610056578063effde240146104e0578063f2fde38b146104f3578063ff2deec31461051357005b8063cf6730f814610480578063d8469e40146104a0578063e4ca8754146104c057005b806385572ffb116100a757806385572ffb146103e15780638da5cb5b14610401578063b0f479a11461044d57005b80636939cd971461037f57806379ba5097146103ac5780638462a2b9146103c157005b806341eade4611610126578063536c6bfa11610103578063536c6bfa146103115780635dc5ebdb146103315780635e35359e1461035f57005b806341eade46146102a35780635075a9d4146102c357806352f813c3146102f157005b806311e85dff1161015457806311e85dff146101eb578063181f5a771461020b5780633a51b79e1461025a57005b806305bfe982146101755780630e958d6b146101bb57005b3661017357005b005b34801561018157600080fd5b506101a5610190366004612cb5565b60086020526000908152604090205460ff1681565b6040516101b29190612cfd565b60405180910390f35b3480156101c757600080fd5b506101db6101d6366004612d9d565b610545565b60405190151581526020016101b2565b3480156101f757600080fd5b50610173610206366004612e24565b61058f565b34801561021757600080fd5b5060408051808201909152601d81527f4343495052656365697665725769746841434b20312e302e302d64657600000060208201525b6040516101b29190612eaf565b34801561026657600080fd5b5061024d6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156102af57600080fd5b506101736102be366004612ec2565b61071f565b3480156102cf57600080fd5b506102e36102de366004612cb5565b61075e565b6040519081526020016101b2565b3480156102fd57600080fd5b5061017361030c366004612eed565b610771565b34801561031d57600080fd5b5061017361032c366004612f0a565b6107aa565b34801561033d57600080fd5b5061035161034c366004612ec2565b6107c0565b6040516101b2929190612f36565b34801561036b57600080fd5b5061017361037a366004612f64565b6108ec565b34801561038b57600080fd5b5061039f61039a366004612cb5565b610915565b6040516101b29190613002565b3480156103b857600080fd5b50610173610b20565b3480156103cd57600080fd5b506101736103dc3660046130db565b610c22565b3480156103ed57600080fd5b506101736103fc366004613147565b610e03565b34801561040d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b2565b34801561045957600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610428565b34801561048c57600080fd5b5061017361049b366004613147565b6110f3565b3480156104ac57600080fd5b506101736104bb366004613182565b611310565b3480156104cc57600080fd5b506101736104db366004612cb5565b611372565b6102e36104ee36600461336b565b6115f0565b3480156104ff57600080fd5b5061017361050e366004612e24565b611ce8565b34801561051f57600080fd5b5060075461042890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020819052604080832090519101906105739085908590613489565b9081526040519081900360200190205460ff1690509392505050565b610597611cfc565b600754610100900473ffffffffffffffffffffffffffffffffffffffff1615610604576106047f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000611d7f565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff851617909455929091041690156106c1576106c17f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611d7f565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b610727611cfc565b67ffffffffffffffff811660009081526002602052604081209061074b8282612c67565b610759600183016000612c67565b505050565b600061076b600483611f7f565b92915050565b610779611cfc565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6107b2611cfc565b6107bc8282611f92565b5050565b6002602052600090815260409020805481906107db90613499565b80601f016020809104026020016040519081016040528092919081815260200182805461080790613499565b80156108545780601f1061082957610100808354040283529160200191610854565b820191906000526020600020905b81548152906001019060200180831161083757829003601f168201915b50505050509080600101805461086990613499565b80601f016020809104026020016040519081016040528092919081815260200182805461089590613499565b80156108e25780601f106108b7576101008083540402835291602001916108e2565b820191906000526020600020905b8154815290600101906020018083116108c557829003601f168201915b5050505050905082565b6108f4611cfc565b61075973ffffffffffffffffffffffffffffffffffffffff841683836120ec565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161098490613499565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090613499565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b50505050508152602001600382018054610a1690613499565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4290613499565b8015610a8f5780601f10610a6457610100808354040283529160200191610a8f565b820191906000526020600020905b815481529060010190602001808311610a7257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b125760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610abd565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c2a611cfc565b60005b81811015610d0d5760026000848484818110610c4b57610c4b6134ec565b9050602002810190610c5d919061351b565b610c6b906020810190612ec2565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610ca257610ca26134ec565b9050602002810190610cb4919061351b565b610cc2906020810190613559565b604051610cd0929190613489565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c2d565b5060005b83811015610dfc57600160026000878785818110610d3157610d316134ec565b9050602002810190610d43919061351b565b610d51906020810190612ec2565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610d8857610d886134ec565b9050602002810190610d9a919061351b565b610da8906020810190613559565b604051610db6929190613489565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d11565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e74576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b9d565b610e846040820160208301612ec2565b610e916040830183613559565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020819052604091829020915191019350610eee92508491506135be565b9081526040519081900360200190205460ff16610f3957806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b9d9190612eaf565b610f496040840160208501612ec2565b67ffffffffffffffff811660009081526002602052604090208054610f6d90613499565b9050600003610fb4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610b9d565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610ff09087906004016136d2565b600060405180830381600087803b15801561100a57600080fd5b505af192505050801561101b575060015b6110c0573d808015611049576040519150601f19603f3d011682016040523d82523d6000602084013e61104e565b606091505b50611060853560015b60049190612142565b5084356000908152600360205260409020859061107d8282613aa4565b50506040518535907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906110b2908490612eaf565b60405180910390a2506110ed565b6040518435907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b50505050565b33301461112c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061113b6060830183613559565b8101906111489190613b9e565b905060008160400151600181111561116257611162612cce565b03611170576107bc82612157565b60018160400151600181111561118857611188612cce565b036107bc5760008082602001518060200190518101906111a89190613c4a565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611240576040517f9f0b03b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561126557611265612cce565b1461129f576040517f3ec8770000000000000000000000000000000000000000000000000000000000815260048101829052602401610b9d565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b611318611cfc565b67ffffffffffffffff8516600090815260026020526040902061133c848683613828565b508015610dfc5767ffffffffffffffff8516600090815260026020526040902060010161136a828483613828565b505050505050565b61137a611cfc565b6001611387600483611f7f565b146113c1576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b9d565b6113cc816000611057565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161141490613499565b80601f016020809104026020016040519081016040528092919081815260200182805461144090613499565b801561148d5780601f106114625761010080835404028352916020019161148d565b820191906000526020600020905b81548152906001019060200180831161147057829003601f168201915b505050505081526020016003820180546114a690613499565b80601f01602080910402602001604051908101604052809291908181526020018280546114d290613499565b801561151f5780601f106114f45761010080835404028352916020019161151f565b820191906000526020600020905b81548152906001019060200180831161150257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156115a25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161154d565b505050508152505090506115b58161250d565b6115c06004836125b3565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff84166000908152600260205260408120805486919061161790613499565b905060000361165e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610b9d565b6040805160a08101825267ffffffffffffffff881660009081526002602052918220805482919061168e90613499565b80601f01602080910402602001604051908101604052809291908181526020018280546116ba90613499565b80156117075780601f106116dc57610100808354040283529160200191611707565b820191906000526020600020905b8154815290600101906020018083116116ea57829003601f168201915b505050505081526020018681526020018781526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600260008a67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101805461176e90613499565b80601f016020809104026020016040519081016040528092919081815260200182805461179a90613499565b80156117e75780601f106117bc576101008083540402835291602001916117e7565b820191906000526020600020905b8154815290600101906020018083116117ca57829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded89846040518363ffffffff1660e01b815260040161184e929190613ccb565b602060405180830381865afa15801561186b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188f9190613d98565b90506000805b8851811015611a505761190533308b84815181106118b5576118b56134ec565b6020026020010151602001518c85815181106118d3576118d36134ec565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125bf909392919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff1689828151811061192e5761192e6134ec565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16148015611972575073ffffffffffffffffffffffffffffffffffffffff871615155b801561199d575060075473ffffffffffffffffffffffffffffffffffffffff88811661010090920416145b156119c357600191506119be3330858c85815181106118d3576118d36134ec565b611a48565b611a487f00000000000000000000000000000000000000000000000000000000000000008a83815181106119f9576119f96134ec565b6020026020010151602001518b8481518110611a1757611a176134ec565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611d7f9092919063ffffffff16565b600101611895565b5080158015611a7e575060075473ffffffffffffffffffffffffffffffffffffffff87811661010090920416145b8015611a9f575073ffffffffffffffffffffffffffffffffffffffff861615155b15611b6d576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b349190613d98565b108015611b415750333014155b15611b6857611b6873ffffffffffffffffffffffffffffffffffffffff87163330856125bf565b611bc7565b73ffffffffffffffffffffffffffffffffffffffff8616158015611b9057508134105b15611bc7576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615611c14576000611c16565b835b8b866040518463ffffffff1660e01b8152600401611c35929190613ccb565b60206040518083038185885af1158015611c53573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611c789190613d98565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a350505050949350505050565b611cf0611cfc565b611cf98161261d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b9d565b565b801580611e1f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1d9190613d98565b155b611eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b9d565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107599084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612712565b6000611f8b838361281e565b9392505050565b80471015611ffc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b9d565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612056576040519150601f19603f3d011682016040523d82523d6000602084013e61205b565b606091505b5050905080610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b9d565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107599084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611efd565b600061214f8484846128a8565b949350505050565b6040805160008082526020820190925281612194565b604080518082019091526000808252602082015281526020019060019003908161216d5790505b50905060006040518060a001604052808480604001906121b49190613559565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926122359288359101613db1565b6040516020818303038152906040528152602001838152602001600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600260008660200160208101906122a49190612ec2565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546122d490613499565b80601f016020809104026020016040519081016040528092919081815260200182805461230090613499565b801561234d5780601f106123225761010080835404028352916020019161234d565b820191906000526020600020905b81548152906001019060200180831161233057829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906123a89190612ec2565b846040518363ffffffff1660e01b81526004016123c6929190613ccb565b602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124079190613d98565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615612462576000612464565b835b6124746040890160208a01612ec2565b866040518463ffffffff1660e01b8152600401612492929190613ccb565b60206040518083038185885af11580156124b0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124d59190613d98565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60005b8160800151518110156107bc57600082608001518281518110612535576125356134ec565b602002602001015160200151905060008360800151838151811061255b5761255b6134ec565b60200260200101516000015190506125a961258b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff831690846120ec565b5050600101612510565b6000611f8b83836128c5565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526110ed9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611efd565b3373ffffffffffffffffffffffffffffffffffffffff82160361269c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b9d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612774826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166128e29092919063ffffffff16565b80519091501561075957808060200190518101906127929190613dd3565b610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b9d565b600081815260028301602052604081205480151580612842575061284284846128f1565b611f8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b9d565b6000828152600284016020526040812082905561214f84846128fd565b60008181526002830160205260408120819055611f8b8383612909565b606061214f8484600085612915565b6000611f8b8383612a2e565b6000611f8b8383612a46565b6000611f8b8383612a95565b6060824710156129a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b9d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516129d091906135be565b60006040518083038185875af1925050503d8060008114612a0d576040519150601f19603f3d011682016040523d82523d6000602084013e612a12565b606091505b5091509150612a2387838387612b88565b979650505050505050565b60008181526001830160205260408120541515611f8b565b6000818152600183016020526040812054612a8d5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561076b565b50600061076b565b60008181526001830160205260408120548015612b7e576000612ab9600183613df0565b8554909150600090612acd90600190613df0565b9050818114612b32576000866000018281548110612aed57612aed6134ec565b9060005260206000200154905080876000018481548110612b1057612b106134ec565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612b4357612b43613e03565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061076b565b600091505061076b565b60608315612c1e578251600003612c175773ffffffffffffffffffffffffffffffffffffffff85163b612c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b9d565b508161214f565b61214f8383815115612c335781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d9190612eaf565b508054612c7390613499565b6000825580601f10612c83575050565b601f016020900490600052602060002090810190611cf991905b80821115612cb15760008155600101612c9d565b5090565b600060208284031215612cc757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612d38577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611cf957600080fd5b60008083601f840112612d6657600080fd5b50813567ffffffffffffffff811115612d7e57600080fd5b602083019150836020828501011115612d9657600080fd5b9250929050565b600080600060408486031215612db257600080fd5b8335612dbd81612d3e565b9250602084013567ffffffffffffffff811115612dd957600080fd5b612de586828701612d54565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611cf957600080fd5b8035612e1f81612df2565b919050565b600060208284031215612e3657600080fd5b8135611f8b81612df2565b60005b83811015612e5c578181015183820152602001612e44565b50506000910152565b60008151808452612e7d816020860160208601612e41565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f8b6020830184612e65565b600060208284031215612ed457600080fd5b8135611f8b81612d3e565b8015158114611cf957600080fd5b600060208284031215612eff57600080fd5b8135611f8b81612edf565b60008060408385031215612f1d57600080fd5b8235612f2881612df2565b946020939093013593505050565b604081526000612f496040830185612e65565b8281036020840152612f5b8185612e65565b95945050505050565b600080600060608486031215612f7957600080fd5b8335612f8481612df2565b92506020840135612f9481612df2565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612ff7578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612fba565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261303c60c0840182612e65565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130788383612e65565b925060808601519150808584030160a086015250612f5b8282612fa5565b60008083601f8401126130a857600080fd5b50813567ffffffffffffffff8111156130c057600080fd5b6020830191508360208260051b8501011115612d9657600080fd5b600080600080604085870312156130f157600080fd5b843567ffffffffffffffff8082111561310957600080fd5b61311588838901613096565b9096509450602087013591508082111561312e57600080fd5b5061313b87828801613096565b95989497509550505050565b60006020828403121561315957600080fd5b813567ffffffffffffffff81111561317057600080fd5b820160a08185031215611f8b57600080fd5b60008060008060006060868803121561319a57600080fd5b85356131a581612d3e565b9450602086013567ffffffffffffffff808211156131c257600080fd5b6131ce89838a01612d54565b909650945060408801359150808211156131e757600080fd5b506131f488828901612d54565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561325757613257613205565b60405290565b6040516060810167ffffffffffffffff8111828210171561325757613257613205565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132c7576132c7613205565b604052919050565b600067ffffffffffffffff8211156132e9576132e9613205565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261332657600080fd5b8135613339613334826132cf565b613280565b81815284602083860101111561334e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561338157600080fd5b843561338c81612d3e565b935060208581013567ffffffffffffffff808211156133aa57600080fd5b818801915088601f8301126133be57600080fd5b8135818111156133d0576133d0613205565b6133de848260051b01613280565b81815260069190911b8301840190848101908b8311156133fd57600080fd5b938501935b82851015613449576040858d03121561341b5760008081fd5b613423613234565b853561342e81612df2565b81528587013587820152825260409094019390850190613402565b97505050604088013592508083111561346157600080fd5b505061346f87828801613315565b92505061347e60608601612e14565b905092959194509250565b8183823760009101908152919050565b600181811c908216806134ad57607f821691505b6020821081036134e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261354f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261358e57600080fd5b83018035915067ffffffffffffffff8211156135a957600080fd5b602001915036819003821315612d9657600080fd5b6000825161354f818460208701612e41565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261360557600080fd5b830160208101925035905067ffffffffffffffff81111561362557600080fd5b803603821315612d9657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612ff75781356136a081612df2565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161368d565b6020815281356020820152600060208301356136ed81612d3e565b67ffffffffffffffff808216604085015261370b60408601866135d0565b925060a0606086015261372260c086018483613634565b92505061373260608601866135d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613768858385613634565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126137a157600080fd5b602092880192830192359150838211156137ba57600080fd5b8160061b36038313156137cc57600080fd5b8685030160a0870152612a2384828461367d565b601f821115610759576000816000526020600020601f850160051c810160208610156138095750805b601f850160051c820191505b8181101561136a57828155600101613815565b67ffffffffffffffff83111561384057613840613205565b6138548361384e8354613499565b836137e0565b6000601f8411600181146138a657600085156138705750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610dfc565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156138f557868501358255602094850194600190920191016138d5565b5086821015613930577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561397c81612df2565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156139e2576139e2613205565b805483825580841015613a6f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a2357613a23613942565b8086168614613a3457613a34613942565b5060008360005260206000208360011b81018760011b820191505b80821015613a6a578282558284830155600282019150613a4f565b505050505b5060008181526020812083915b8581101561136a57613a8e8383613971565b6040929092019160029190910190600101613a7c565b81358155600181016020830135613aba81612d3e565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613afa6040860186613559565b93509150613b0c838360028701613828565b613b196060860186613559565b93509150613b2b838360038701613828565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613b6257600080fd5b918401918235915080821115613b7757600080fd5b506020820191508060061b3603821315613b9057600080fd5b6110ed8183600486016139c9565b600060208284031215613bb057600080fd5b813567ffffffffffffffff80821115613bc857600080fd5b9083019060608286031215613bdc57600080fd5b613be461325d565b823582811115613bf357600080fd5b613bff87828601613315565b825250602083013582811115613c1457600080fd5b613c2087828601613315565b6020830152506040830135925060028310613c3a57600080fd5b6040810192909252509392505050565b60008060408385031215613c5d57600080fd5b825167ffffffffffffffff811115613c7457600080fd5b8301601f81018513613c8557600080fd5b8051613c93613334826132cf565b818152866020838501011115613ca857600080fd5b613cb9826020830160208601612e41565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613cf760e0840182612e65565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613d338383612e65565b92506040860151915080858403016080860152613d508383612fa5565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613d8e8282612e65565b9695505050505050565b600060208284031215613daa57600080fd5b5051919050565b604081526000613dc46040830185612e65565b90508260208301529392505050565b600060208284031215613de557600080fd5b8151611f8b81612edf565b8181038181111561076b5761076b613942565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", +} + +var CCIPClientABI = CCIPClientMetaData.ABI + +var CCIPClientBin = CCIPClientMetaData.Bin + +func DeployCCIPClient(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address, feeToken common.Address) (common.Address, *types.Transaction, *CCIPClient, error) { + parsed, err := CCIPClientMetaData.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(CCIPClientBin), backend, router, feeToken) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CCIPClient{address: address, abi: *parsed, CCIPClientCaller: CCIPClientCaller{contract: contract}, CCIPClientTransactor: CCIPClientTransactor{contract: contract}, CCIPClientFilterer: CCIPClientFilterer{contract: contract}}, nil +} + +type CCIPClient struct { + address common.Address + abi abi.ABI + CCIPClientCaller + CCIPClientTransactor + CCIPClientFilterer +} + +type CCIPClientCaller struct { + contract *bind.BoundContract +} + +type CCIPClientTransactor struct { + contract *bind.BoundContract +} + +type CCIPClientFilterer struct { + contract *bind.BoundContract +} + +type CCIPClientSession struct { + Contract *CCIPClient + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type CCIPClientCallerSession struct { + Contract *CCIPClientCaller + CallOpts bind.CallOpts +} + +type CCIPClientTransactorSession struct { + Contract *CCIPClientTransactor + TransactOpts bind.TransactOpts +} + +type CCIPClientRaw struct { + Contract *CCIPClient +} + +type CCIPClientCallerRaw struct { + Contract *CCIPClientCaller +} + +type CCIPClientTransactorRaw struct { + Contract *CCIPClientTransactor +} + +func NewCCIPClient(address common.Address, backend bind.ContractBackend) (*CCIPClient, error) { + abi, err := abi.JSON(strings.NewReader(CCIPClientABI)) + if err != nil { + return nil, err + } + contract, err := bindCCIPClient(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CCIPClient{address: address, abi: abi, CCIPClientCaller: CCIPClientCaller{contract: contract}, CCIPClientTransactor: CCIPClientTransactor{contract: contract}, CCIPClientFilterer: CCIPClientFilterer{contract: contract}}, nil +} + +func NewCCIPClientCaller(address common.Address, caller bind.ContractCaller) (*CCIPClientCaller, error) { + contract, err := bindCCIPClient(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CCIPClientCaller{contract: contract}, nil +} + +func NewCCIPClientTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPClientTransactor, error) { + contract, err := bindCCIPClient(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CCIPClientTransactor{contract: contract}, nil +} + +func NewCCIPClientFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPClientFilterer, error) { + contract, err := bindCCIPClient(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CCIPClientFilterer{contract: contract}, nil +} + +func bindCCIPClient(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CCIPClientMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_CCIPClient *CCIPClientRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPClient.Contract.CCIPClientCaller.contract.Call(opts, result, method, params...) +} + +func (_CCIPClient *CCIPClientRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPClient.Contract.CCIPClientTransactor.contract.Transfer(opts) +} + +func (_CCIPClient *CCIPClientRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPClient.Contract.CCIPClientTransactor.contract.Transact(opts, method, params...) +} + +func (_CCIPClient *CCIPClientCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPClient.Contract.contract.Call(opts, result, method, params...) +} + +func (_CCIPClient *CCIPClientTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPClient.Contract.contract.Transfer(opts) +} + +func (_CCIPClient *CCIPClientTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPClient.Contract.contract.Transact(opts, method, params...) +} + +func (_CCIPClient *CCIPClientCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "ACKMESSAGEMAGICBYTES") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { + return _CCIPClient.Contract.ACKMESSAGEMAGICBYTES(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCallerSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { + return _CCIPClient.Contract.ACKMESSAGEMAGICBYTES(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "getMessageContents", messageId) + + if err != nil { + return *new(ClientAny2EVMMessage), err + } + + out0 := *abi.ConvertType(out[0], new(ClientAny2EVMMessage)).(*ClientAny2EVMMessage) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPClient.Contract.GetMessageContents(&_CCIPClient.CallOpts, messageId) +} + +func (_CCIPClient *CCIPClientCallerSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPClient.Contract.GetMessageContents(&_CCIPClient.CallOpts, messageId) +} + +func (_CCIPClient *CCIPClientCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "getMessageStatus", messageId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _CCIPClient.Contract.GetMessageStatus(&_CCIPClient.CallOpts, messageId) +} + +func (_CCIPClient *CCIPClientCallerSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _CCIPClient.Contract.GetMessageStatus(&_CCIPClient.CallOpts, messageId) +} + +func (_CCIPClient *CCIPClientCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPClient.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 (_CCIPClient *CCIPClientSession) GetRouter() (common.Address, error) { + return _CCIPClient.Contract.GetRouter(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCallerSession) GetRouter() (common.Address, error) { + return _CCIPClient.Contract.GetRouter(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPClient.Contract.IsApprovedSender(&_CCIPClient.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPClient *CCIPClientCallerSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPClient.Contract.IsApprovedSender(&_CCIPClient.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPClient *CCIPClientCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPClient.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 (_CCIPClient *CCIPClientSession) Owner() (common.Address, error) { + return _CCIPClient.Contract.Owner(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCallerSession) Owner() (common.Address, error) { + return _CCIPClient.Contract.Owner(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "s_chains", arg0) + + outstruct := new(SChains) + if err != nil { + return *outstruct, err + } + + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + + return *outstruct, err + +} + +func (_CCIPClient *CCIPClientSession) SChains(arg0 uint64) (SChains, + + error) { + return _CCIPClient.Contract.SChains(&_CCIPClient.CallOpts, arg0) +} + +func (_CCIPClient *CCIPClientCallerSession) SChains(arg0 uint64) (SChains, + + error) { + return _CCIPClient.Contract.SChains(&_CCIPClient.CallOpts, arg0) +} + +func (_CCIPClient *CCIPClientCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "s_feeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) SFeeToken() (common.Address, error) { + return _CCIPClient.Contract.SFeeToken(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCallerSession) SFeeToken() (common.Address, error) { + return _CCIPClient.Contract.SFeeToken(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "s_messageStatus", messageId) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPClient.Contract.SMessageStatus(&_CCIPClient.CallOpts, messageId) +} + +func (_CCIPClient *CCIPClientCallerSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPClient.Contract.SMessageStatus(&_CCIPClient.CallOpts, messageId) +} + +func (_CCIPClient *CCIPClientCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) TypeAndVersion() (string, error) { + return _CCIPClient.Contract.TypeAndVersion(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCallerSession) TypeAndVersion() (string, error) { + return _CCIPClient.Contract.TypeAndVersion(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "acceptOwnership") +} + +func (_CCIPClient *CCIPClientSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPClient.Contract.AcceptOwnership(&_CCIPClient.TransactOpts) +} + +func (_CCIPClient *CCIPClientTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPClient.Contract.AcceptOwnership(&_CCIPClient.TransactOpts) +} + +func (_CCIPClient *CCIPClientTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "ccipReceive", message) +} + +func (_CCIPClient *CCIPClientSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClient.Contract.CcipReceive(&_CCIPClient.TransactOpts, message) +} + +func (_CCIPClient *CCIPClientTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClient.Contract.CcipReceive(&_CCIPClient.TransactOpts, message) +} + +func (_CCIPClient *CCIPClientTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data, feeToken) +} + +func (_CCIPClient *CCIPClientSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.CcipSend(&_CCIPClient.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +} + +func (_CCIPClient *CCIPClientTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.CcipSend(&_CCIPClient.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +} + +func (_CCIPClient *CCIPClientTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "disableChain", chainSelector) +} + +func (_CCIPClient *CCIPClientSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _CCIPClient.Contract.DisableChain(&_CCIPClient.TransactOpts, chainSelector) +} + +func (_CCIPClient *CCIPClientTransactorSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _CCIPClient.Contract.DisableChain(&_CCIPClient.TransactOpts, chainSelector) +} + +func (_CCIPClient *CCIPClientTransactor) EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "enableChain", chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPClient *CCIPClientSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPClient.Contract.EnableChain(&_CCIPClient.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPClient *CCIPClientTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPClient.Contract.EnableChain(&_CCIPClient.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPClient *CCIPClientTransactor) ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "modifyFeeToken", token) +} + +func (_CCIPClient *CCIPClientSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.ModifyFeeToken(&_CCIPClient.TransactOpts, token) +} + +func (_CCIPClient *CCIPClientTransactorSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.ModifyFeeToken(&_CCIPClient.TransactOpts, token) +} + +func (_CCIPClient *CCIPClientTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "processMessage", message) +} + +func (_CCIPClient *CCIPClientSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClient.Contract.ProcessMessage(&_CCIPClient.TransactOpts, message) +} + +func (_CCIPClient *CCIPClientTransactorSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClient.Contract.ProcessMessage(&_CCIPClient.TransactOpts, message) +} + +func (_CCIPClient *CCIPClientTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "retryFailedMessage", messageId) +} + +func (_CCIPClient *CCIPClientSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId) +} + +func (_CCIPClient *CCIPClientTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId) +} + +func (_CCIPClient *CCIPClientTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "setSimRevert", simRevert) +} + +func (_CCIPClient *CCIPClientSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _CCIPClient.Contract.SetSimRevert(&_CCIPClient.TransactOpts, simRevert) +} + +func (_CCIPClient *CCIPClientTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _CCIPClient.Contract.SetSimRevert(&_CCIPClient.TransactOpts, simRevert) +} + +func (_CCIPClient *CCIPClientTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "transferOwnership", to) +} + +func (_CCIPClient *CCIPClientSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.TransferOwnership(&_CCIPClient.TransactOpts, to) +} + +func (_CCIPClient *CCIPClientTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.TransferOwnership(&_CCIPClient.TransactOpts, to) +} + +func (_CCIPClient *CCIPClientTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_CCIPClient *CCIPClientSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) +} + +func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) +} + +func (_CCIPClient *CCIPClientTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "withdrawNativeToken", to, amount) +} + +func (_CCIPClient *CCIPClientSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClient.Contract.WithdrawNativeToken(&_CCIPClient.TransactOpts, to, amount) +} + +func (_CCIPClient *CCIPClientTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClient.Contract.WithdrawNativeToken(&_CCIPClient.TransactOpts, to, amount) +} + +func (_CCIPClient *CCIPClientTransactor) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "withdrawTokens", token, to, amount) +} + +func (_CCIPClient *CCIPClientSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClient.Contract.WithdrawTokens(&_CCIPClient.TransactOpts, token, to, amount) +} + +func (_CCIPClient *CCIPClientTransactorSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClient.Contract.WithdrawTokens(&_CCIPClient.TransactOpts, token, to, amount) +} + +func (_CCIPClient *CCIPClientTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _CCIPClient.contract.RawTransact(opts, calldata) +} + +func (_CCIPClient *CCIPClientSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _CCIPClient.Contract.Fallback(&_CCIPClient.TransactOpts, calldata) +} + +func (_CCIPClient *CCIPClientTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _CCIPClient.Contract.Fallback(&_CCIPClient.TransactOpts, calldata) +} + +func (_CCIPClient *CCIPClientTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPClient.contract.RawTransact(opts, nil) +} + +func (_CCIPClient *CCIPClientSession) Receive() (*types.Transaction, error) { + return _CCIPClient.Contract.Receive(&_CCIPClient.TransactOpts) +} + +func (_CCIPClient *CCIPClientTransactorSession) Receive() (*types.Transaction, error) { + return _CCIPClient.Contract.Receive(&_CCIPClient.TransactOpts) +} + +type CCIPClientFeeTokenModifiedIterator struct { + Event *CCIPClientFeeTokenModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientFeeTokenModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientFeeTokenModified) + 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(CCIPClientFeeTokenModified) + 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 *CCIPClientFeeTokenModifiedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientFeeTokenModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientFeeTokenModified struct { + OldToken common.Address + NewToken common.Address + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPClientFeeTokenModifiedIterator, error) { + + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) + } + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + if err != nil { + return nil, err + } + return &CCIPClientFeeTokenModifiedIterator{contract: _CCIPClient.contract, event: "FeeTokenModified", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *CCIPClientFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { + + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) + } + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientFeeTokenModified) + if err := _CCIPClient.contract.UnpackLog(event, "FeeTokenModified", 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 (_CCIPClient *CCIPClientFilterer) ParseFeeTokenModified(log types.Log) (*CCIPClientFeeTokenModified, error) { + event := new(CCIPClientFeeTokenModified) + if err := _CCIPClient.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientMessageAckReceivedIterator struct { + Event *CCIPClientMessageAckReceived + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientMessageAckReceivedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientMessageAckReceived) + 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(CCIPClientMessageAckReceived) + 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 *CCIPClientMessageAckReceivedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientMessageAckReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientMessageAckReceived struct { + Arg0 [32]byte + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPClientMessageAckReceivedIterator, error) { + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "MessageAckReceived") + if err != nil { + return nil, err + } + return &CCIPClientMessageAckReceivedIterator{contract: _CCIPClient.contract, event: "MessageAckReceived", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageAckReceived) (event.Subscription, error) { + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageAckReceived") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientMessageAckReceived) + if err := _CCIPClient.contract.UnpackLog(event, "MessageAckReceived", 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 (_CCIPClient *CCIPClientFilterer) ParseMessageAckReceived(log types.Log) (*CCIPClientMessageAckReceived, error) { + event := new(CCIPClientMessageAckReceived) + if err := _CCIPClient.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientMessageAckSentIterator struct { + Event *CCIPClientMessageAckSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientMessageAckSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientMessageAckSent) + 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(CCIPClientMessageAckSent) + 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 *CCIPClientMessageAckSentIterator) Error() error { + return it.fail +} + +func (it *CCIPClientMessageAckSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientMessageAckSent struct { + IncomingMessageId [32]byte + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPClientMessageAckSentIterator, error) { + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "MessageAckSent") + if err != nil { + return nil, err + } + return &CCIPClientMessageAckSentIterator{contract: _CCIPClient.contract, event: "MessageAckSent", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageAckSent) (event.Subscription, error) { + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageAckSent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientMessageAckSent) + if err := _CCIPClient.contract.UnpackLog(event, "MessageAckSent", 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 (_CCIPClient *CCIPClientFilterer) ParseMessageAckSent(log types.Log) (*CCIPClientMessageAckSent, error) { + event := new(CCIPClientMessageAckSent) + if err := _CCIPClient.contract.UnpackLog(event, "MessageAckSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientMessageFailedIterator struct { + Event *CCIPClientMessageFailed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientMessageFailedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientMessageFailed) + 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(CCIPClientMessageFailed) + 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 *CCIPClientMessageFailedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientMessageFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageFailedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientMessageFailedIterator{contract: _CCIPClient.contract, event: "MessageFailed", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageFailed, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientMessageFailed) + if err := _CCIPClient.contract.UnpackLog(event, "MessageFailed", 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 (_CCIPClient *CCIPClientFilterer) ParseMessageFailed(log types.Log) (*CCIPClientMessageFailed, error) { + event := new(CCIPClientMessageFailed) + if err := _CCIPClient.contract.UnpackLog(event, "MessageFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientMessageRecoveredIterator struct { + Event *CCIPClientMessageRecovered + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientMessageRecoveredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientMessageRecovered) + 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(CCIPClientMessageRecovered) + 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 *CCIPClientMessageRecoveredIterator) Error() error { + return it.fail +} + +func (it *CCIPClientMessageRecoveredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientMessageRecovered struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageRecoveredIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientMessageRecoveredIterator{contract: _CCIPClient.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageRecovered, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientMessageRecovered) + if err := _CCIPClient.contract.UnpackLog(event, "MessageRecovered", 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 (_CCIPClient *CCIPClientFilterer) ParseMessageRecovered(log types.Log) (*CCIPClientMessageRecovered, error) { + event := new(CCIPClientMessageRecovered) + if err := _CCIPClient.contract.UnpackLog(event, "MessageRecovered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientMessageSentIterator struct { + Event *CCIPClientMessageSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientMessageSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientMessageSent) + 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(CCIPClientMessageSent) + 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 *CCIPClientMessageSentIterator) Error() error { + return it.fail +} + +func (it *CCIPClientMessageSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientMessageSent struct { + IncomingMessageId [32]byte + ACKMessageId [32]byte + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPClientMessageSentIterator, error) { + + var incomingMessageIdRule []interface{} + for _, incomingMessageIdItem := range incomingMessageId { + incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + } + var ACKMessageIdRule []interface{} + for _, ACKMessageIdItem := range ACKMessageId { + ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientMessageSentIterator{contract: _CCIPClient.contract, event: "MessageSent", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) { + + var incomingMessageIdRule []interface{} + for _, incomingMessageIdItem := range incomingMessageId { + incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + } + var ACKMessageIdRule []interface{} + for _, ACKMessageIdItem := range ACKMessageId { + ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientMessageSent) + if err := _CCIPClient.contract.UnpackLog(event, "MessageSent", 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 (_CCIPClient *CCIPClientFilterer) ParseMessageSent(log types.Log) (*CCIPClientMessageSent, error) { + event := new(CCIPClientMessageSent) + if err := _CCIPClient.contract.UnpackLog(event, "MessageSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientMessageSucceededIterator struct { + Event *CCIPClientMessageSucceeded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientMessageSucceededIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientMessageSucceeded) + 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(CCIPClientMessageSucceeded) + 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 *CCIPClientMessageSucceededIterator) Error() error { + return it.fail +} + +func (it *CCIPClientMessageSucceededIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientMessageSucceeded struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageSucceededIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientMessageSucceededIterator{contract: _CCIPClient.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageSucceeded, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientMessageSucceeded) + if err := _CCIPClient.contract.UnpackLog(event, "MessageSucceeded", 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 (_CCIPClient *CCIPClientFilterer) ParseMessageSucceeded(log types.Log) (*CCIPClientMessageSucceeded, error) { + event := new(CCIPClientMessageSucceeded) + if err := _CCIPClient.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientOwnershipTransferRequestedIterator struct { + Event *CCIPClientOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientOwnershipTransferRequested) + 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(CCIPClientOwnershipTransferRequested) + 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 *CCIPClientOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPClientOwnershipTransferRequestedIterator, 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 := _CCIPClient.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPClientOwnershipTransferRequestedIterator{contract: _CCIPClient.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPClientOwnershipTransferRequested, 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 := _CCIPClient.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(CCIPClientOwnershipTransferRequested) + if err := _CCIPClient.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 (_CCIPClient *CCIPClientFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPClientOwnershipTransferRequested, error) { + event := new(CCIPClientOwnershipTransferRequested) + if err := _CCIPClient.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientOwnershipTransferredIterator struct { + Event *CCIPClientOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientOwnershipTransferred) + 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(CCIPClientOwnershipTransferred) + 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 *CCIPClientOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *CCIPClientOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPClientOwnershipTransferredIterator, 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 := _CCIPClient.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPClientOwnershipTransferredIterator{contract: _CCIPClient.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPClientOwnershipTransferred, 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 := _CCIPClient.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(CCIPClientOwnershipTransferred) + if err := _CCIPClient.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 (_CCIPClient *CCIPClientFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPClientOwnershipTransferred, error) { + event := new(CCIPClientOwnershipTransferred) + if err := _CCIPClient.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChains struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPClient.abi.Events["FeeTokenModified"].ID: + return _CCIPClient.ParseFeeTokenModified(log) + case _CCIPClient.abi.Events["MessageAckReceived"].ID: + return _CCIPClient.ParseMessageAckReceived(log) + case _CCIPClient.abi.Events["MessageAckSent"].ID: + return _CCIPClient.ParseMessageAckSent(log) + case _CCIPClient.abi.Events["MessageFailed"].ID: + return _CCIPClient.ParseMessageFailed(log) + case _CCIPClient.abi.Events["MessageRecovered"].ID: + return _CCIPClient.ParseMessageRecovered(log) + case _CCIPClient.abi.Events["MessageSent"].ID: + return _CCIPClient.ParseMessageSent(log) + case _CCIPClient.abi.Events["MessageSucceeded"].ID: + return _CCIPClient.ParseMessageSucceeded(log) + case _CCIPClient.abi.Events["OwnershipTransferRequested"].ID: + return _CCIPClient.ParseOwnershipTransferRequested(log) + case _CCIPClient.abi.Events["OwnershipTransferred"].ID: + return _CCIPClient.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPClientFeeTokenModified) Topic() common.Hash { + return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") +} + +func (CCIPClientMessageAckReceived) Topic() common.Hash { + return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") +} + +func (CCIPClientMessageAckSent) Topic() common.Hash { + return common.HexToHash("0x75944f95ba0be568cb30faeb0ef135cb73d07006939da29722d670a97f5c5b26") +} + +func (CCIPClientMessageFailed) Topic() common.Hash { + return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") +} + +func (CCIPClientMessageRecovered) Topic() common.Hash { + return common.HexToHash("0xef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad") +} + +func (CCIPClientMessageSent) Topic() common.Hash { + return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") +} + +func (CCIPClientMessageSucceeded) Topic() common.Hash { + return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +} + +func (CCIPClientOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (CCIPClientOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_CCIPClient *CCIPClient) Address() common.Address { + return _CCIPClient.address +} + +type CCIPClientInterface interface { + ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) + + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) + + GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) + + SFeeToken(opts *bind.CallOpts) (common.Address, error) + + SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) + + DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + + EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + + ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + + SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + + WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) + + WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) + + Receive(opts *bind.TransactOpts) (*types.Transaction, error) + + FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPClientFeeTokenModifiedIterator, error) + + WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *CCIPClientFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + + ParseFeeTokenModified(log types.Log) (*CCIPClientFeeTokenModified, error) + + FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPClientMessageAckReceivedIterator, error) + + WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageAckReceived) (event.Subscription, error) + + ParseMessageAckReceived(log types.Log) (*CCIPClientMessageAckReceived, error) + + FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPClientMessageAckSentIterator, error) + + WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageAckSent) (event.Subscription, error) + + ParseMessageAckSent(log types.Log) (*CCIPClientMessageAckSent, error) + + FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageFailedIterator, error) + + WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageFailed, messageId [][32]byte) (event.Subscription, error) + + ParseMessageFailed(log types.Log) (*CCIPClientMessageFailed, error) + + FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageRecoveredIterator, error) + + WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageRecovered, messageId [][32]byte) (event.Subscription, error) + + ParseMessageRecovered(log types.Log) (*CCIPClientMessageRecovered, error) + + FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPClientMessageSentIterator, error) + + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + + ParseMessageSent(log types.Log) (*CCIPClientMessageSent, error) + + FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageSucceededIterator, error) + + WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageSucceeded, messageId [][32]byte) (event.Subscription, error) + + ParseMessageSucceeded(log types.Log) (*CCIPClientMessageSucceeded, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPClientOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPClientOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*CCIPClientOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPClientOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPClientOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*CCIPClientOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go new file mode 100644 index 0000000000..d37361a365 --- /dev/null +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -0,0 +1,1287 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccipReceiver + +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 ClientAny2EVMMessage struct { + MessageId [32]byte + SourceChainSelector uint64 + Sender []byte + Data []byte + DestTokenAmounts []ClientEVMTokenAmount +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type ICCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + +var CCIPReceiverMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620029e6380380620029e68339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b6080516127e9620001fd6000396000818161035e0152610b4801526127e96000f3fe60806040526004361061011b5760003560e01c806379ba50971161009c578063b0f479a11161006e578063d8469e4011610056578063d8469e40146103a2578063e4ca8754146103c2578063f2fde38b146103e257005b8063b0f479a11461034f578063cf6730f81461038257005b806379ba5097146102ae5780638462a2b9146102c357806385572ffb146102e35780638da5cb5b1461030357005b806352f813c3116100ed5780635dc5ebdb116100d55780635dc5ebdb146102335780635e35359e146102615780636939cd971461028157005b806352f813c3146101f3578063536c6bfa1461021357005b80630e958d6b14610124578063181f5a771461015957806341eade46146101a55780635075a9d4146101c557005b3661012257005b005b34801561013057600080fd5b5061014461013f366004611bc1565b610402565b60405190151581526020015b60405180910390f35b34801561016557600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101509190611c84565b3480156101b157600080fd5b506101226101c0366004611c97565b61044c565b3480156101d157600080fd5b506101e56101e0366004611cb4565b61048b565b604051908152602001610150565b3480156101ff57600080fd5b5061012261020e366004611cdb565b61049e565b34801561021f57600080fd5b5061012261022e366004611d1a565b6104d7565b34801561023f57600080fd5b5061025361024e366004611c97565b6104ed565b604051610150929190611d46565b34801561026d57600080fd5b5061012261027c366004611d74565b610619565b34801561028d57600080fd5b506102a161029c366004611cb4565b610642565b6040516101509190611db5565b3480156102ba57600080fd5b5061012261084d565b3480156102cf57600080fd5b506101226102de366004611ee1565b61094f565b3480156102ef57600080fd5b506101226102fe366004611f4d565b610b30565b34801561030f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610150565b34801561035b57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061032a565b34801561038e57600080fd5b5061012261039d366004611f4d565b610d57565b3480156103ae57600080fd5b506101226103bd366004611f88565b610e92565b3480156103ce57600080fd5b506101226103dd366004611cb4565b610ef4565b3480156103ee57600080fd5b506101226103fd36600461200b565b611172565b67ffffffffffffffff8316600090815260026020819052604080832090519101906104309085908590612028565b9081526040519081900360200190205460ff1690509392505050565b610454611186565b67ffffffffffffffff81166000908152600260205260408120906104788282611b14565b610486600183016000611b14565b505050565b6000610498600483611209565b92915050565b6104a6611186565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6104df611186565b6104e9828261121c565b5050565b60026020526000908152604090208054819061050890612038565b80601f016020809104026020016040519081016040528092919081815260200182805461053490612038565b80156105815780601f1061055657610100808354040283529160200191610581565b820191906000526020600020905b81548152906001019060200180831161056457829003601f168201915b50505050509080600101805461059690612038565b80601f01602080910402602001604051908101604052809291908181526020018280546105c290612038565b801561060f5780601f106105e45761010080835404028352916020019161060f565b820191906000526020600020905b8154815290600101906020018083116105f257829003601f168201915b5050505050905082565b610621611186565b61048673ffffffffffffffffffffffffffffffffffffffff84168383611376565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106b190612038565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90612038565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b5050505050815260200160038201805461074390612038565b80601f016020809104026020016040519081016040528092919081815260200182805461076f90612038565b80156107bc5780601f10610791576101008083540402835291602001916107bc565b820191906000526020600020905b81548152906001019060200180831161079f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561083f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107ea565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146108d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610957611186565b60005b81811015610a3a57600260008484848181106109785761097861208b565b905060200281019061098a91906120ba565b610998906020810190611c97565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106109cf576109cf61208b565b90506020028101906109e191906120ba565b6109ef9060208101906120f8565b6040516109fd929190612028565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560010161095a565b5060005b83811015610b2957600160026000878785818110610a5e57610a5e61208b565b9050602002810190610a7091906120ba565b610a7e906020810190611c97565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610ab557610ab561208b565b9050602002810190610ac791906120ba565b610ad59060208101906120f8565b604051610ae3929190612028565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610a3e565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610ba1576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108ca565b610bb16040820160208301611c97565b67ffffffffffffffff811660009081526002602052604090208054610bd590612038565b9050600003610c1c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108ca565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610c5890859060040161226a565b600060405180830381600087803b158015610c7257600080fd5b505af1925050508015610c83575060015b610d27573d808015610cb1576040519150601f19603f3d011682016040523d82523d6000602084013e610cb6565b606091505b50610cc8833560015b60049190611403565b50823560009081526003602052604090208390610ce5828261266b565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610d1a908490611c84565b60405180910390a2505050565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b333014610d90576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da06040820160208301611c97565b610dad60408301836120f8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020819052604091829020915191019350610e0a925084915061276b565b9081526040519081900360200190205460ff16610e5557806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108ca9190611c84565b60075460ff1615610486576040517f79f79e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9a611186565b67ffffffffffffffff85166000908152600260205260409020610ebe8486836123ef565b508015610b295767ffffffffffffffff85166000908152600260205260409020600101610eec8284836123ef565b505050505050565b610efc611186565b6001610f09600483611209565b14610f43576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016108ca565b610f4e816000610cbf565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610f9690612038565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc290612038565b801561100f5780601f10610fe45761010080835404028352916020019161100f565b820191906000526020600020905b815481529060010190602001808311610ff257829003601f168201915b5050505050815260200160038201805461102890612038565b80601f016020809104026020016040519081016040528092919081815260200182805461105490612038565b80156110a15780601f10611076576101008083540402835291602001916110a1565b820191906000526020600020905b81548152906001019060200180831161108457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156111245760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016110cf565b5050505081525050905061113781611418565b6111426004836114be565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b61117a611186565b611183816114ca565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108ca565b565b600061121583836115bf565b9392505050565b80471015611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108ca565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146112e0576040519150601f19603f3d011682016040523d82523d6000602084013e6112e5565b606091505b5050905080610486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108ca565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610486908490611649565b6000611410848484611755565b949350505050565b60005b8160800151518110156104e9576000826080015182815181106114405761144061208b565b60200260200101516020015190506000836080015183815181106114665761146661208b565b60200260200101516000015190506114b461149660005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff83169084611376565b505060010161141b565b60006112158383611772565b3373ffffffffffffffffffffffffffffffffffffffff821603611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108ca565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054801515806115e357506115e3848461178f565b611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016108ca565b60006116ab826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661179b9092919063ffffffff16565b80519091501561048657808060200190518101906116c9919061277d565b610486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108ca565b6000828152600284016020526040812082905561141084846117aa565b6000818152600283016020526040812081905561121583836117b6565b600061121583836117c2565b606061141084846000856117da565b600061121583836118f3565b60006112158383611942565b60008181526001830160205260408120541515611215565b60608247101561186c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108ca565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611895919061276b565b60006040518083038185875af1925050503d80600081146118d2576040519150601f19603f3d011682016040523d82523d6000602084013e6118d7565b606091505b50915091506118e887838387611a35565b979650505050505050565b600081815260018301602052604081205461193a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610498565b506000610498565b60008181526001830160205260408120548015611a2b57600061196660018361279a565b855490915060009061197a9060019061279a565b90508181146119df57600086600001828154811061199a5761199a61208b565b90600052602060002001549050808760000184815481106119bd576119bd61208b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806119f0576119f06127ad565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610498565b6000915050610498565b60608315611acb578251600003611ac45773ffffffffffffffffffffffffffffffffffffffff85163b611ac4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108ca565b5081611410565b6114108383815115611ae05781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca9190611c84565b508054611b2090612038565b6000825580601f10611b30575050565b601f01602090049060005260206000209081019061118391905b80821115611b5e5760008155600101611b4a565b5090565b67ffffffffffffffff8116811461118357600080fd5b60008083601f840112611b8a57600080fd5b50813567ffffffffffffffff811115611ba257600080fd5b602083019150836020828501011115611bba57600080fd5b9250929050565b600080600060408486031215611bd657600080fd5b8335611be181611b62565b9250602084013567ffffffffffffffff811115611bfd57600080fd5b611c0986828701611b78565b9497909650939450505050565b60005b83811015611c31578181015183820152602001611c19565b50506000910152565b60008151808452611c52816020860160208601611c16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112156020830184611c3a565b600060208284031215611ca957600080fd5b813561121581611b62565b600060208284031215611cc657600080fd5b5035919050565b801515811461118357600080fd5b600060208284031215611ced57600080fd5b813561121581611ccd565b73ffffffffffffffffffffffffffffffffffffffff8116811461118357600080fd5b60008060408385031215611d2d57600080fd5b8235611d3881611cf8565b946020939093013593505050565b604081526000611d596040830185611c3a565b8281036020840152611d6b8185611c3a565b95945050505050565b600080600060608486031215611d8957600080fd5b8335611d9481611cf8565b92506020840135611da481611cf8565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611df360c0860183611c3a565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611e2f8483611c3a565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611e90578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611e51565b50979650505050505050565b60008083601f840112611eae57600080fd5b50813567ffffffffffffffff811115611ec657600080fd5b6020830191508360208260051b8501011115611bba57600080fd5b60008060008060408587031215611ef757600080fd5b843567ffffffffffffffff80821115611f0f57600080fd5b611f1b88838901611e9c565b90965094506020870135915080821115611f3457600080fd5b50611f4187828801611e9c565b95989497509550505050565b600060208284031215611f5f57600080fd5b813567ffffffffffffffff811115611f7657600080fd5b820160a0818503121561121557600080fd5b600080600080600060608688031215611fa057600080fd5b8535611fab81611b62565b9450602086013567ffffffffffffffff80821115611fc857600080fd5b611fd489838a01611b78565b90965094506040880135915080821115611fed57600080fd5b50611ffa88828901611b78565b969995985093965092949392505050565b60006020828403121561201d57600080fd5b813561121581611cf8565b8183823760009101908152919050565b600181811c9082168061204c57607f821691505b602082108103612085577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126120ee57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261212d57600080fd5b83018035915067ffffffffffffffff82111561214857600080fd5b602001915036819003821315611bba57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261219257600080fd5b830160208101925035905067ffffffffffffffff8111156121b257600080fd5b803603821315611bba57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561225f57813561222d81611cf8565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161221a565b509495945050505050565b60208152813560208201526000602083013561228581611b62565b67ffffffffffffffff80821660408501526122a3604086018661215d565b925060a060608601526122ba60c0860184836121c1565b9250506122ca606086018661215d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123008583856121c1565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261233957600080fd5b6020928801928301923591508382111561235257600080fd5b8160061b360383131561236457600080fd5b8685030160a08701526118e884828461220a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610486576000816000526020600020601f850160051c810160208610156123d05750805b601f850160051c820191505b81811015610eec578281556001016123dc565b67ffffffffffffffff83111561240757612407612378565b61241b836124158354612038565b836123a7565b6000601f84116001811461246d57600085156124375750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610b29565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156124bc578685013582556020948501946001909201910161249c565b50868210156124f7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561254381611cf8565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156125a9576125a9612378565b8054838255808410156126365760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146125ea576125ea612509565b80861686146125fb576125fb612509565b5060008360005260206000208360011b81018760011b820191505b80821015612631578282558284830155600282019150612616565b505050505b5060008181526020812083915b85811015610eec576126558383612538565b6040929092019160029190910190600101612643565b8135815560018101602083013561268181611b62565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556126c160408601866120f8565b935091506126d38383600287016123ef565b6126e060608601866120f8565b935091506126f28383600387016123ef565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261272957600080fd5b91840191823591508082111561273e57600080fd5b506020820191508060061b360382131561275757600080fd5b612765818360048601612590565b50505050565b600082516120ee818460208701611c16565b60006020828403121561278f57600080fd5b815161121581611ccd565b8181038181111561049857610498612509565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", +} + +var CCIPReceiverABI = CCIPReceiverMetaData.ABI + +var CCIPReceiverBin = CCIPReceiverMetaData.Bin + +func DeployCCIPReceiver(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address) (common.Address, *types.Transaction, *CCIPReceiver, error) { + parsed, err := CCIPReceiverMetaData.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(CCIPReceiverBin), backend, router) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CCIPReceiver{address: address, abi: *parsed, CCIPReceiverCaller: CCIPReceiverCaller{contract: contract}, CCIPReceiverTransactor: CCIPReceiverTransactor{contract: contract}, CCIPReceiverFilterer: CCIPReceiverFilterer{contract: contract}}, nil +} + +type CCIPReceiver struct { + address common.Address + abi abi.ABI + CCIPReceiverCaller + CCIPReceiverTransactor + CCIPReceiverFilterer +} + +type CCIPReceiverCaller struct { + contract *bind.BoundContract +} + +type CCIPReceiverTransactor struct { + contract *bind.BoundContract +} + +type CCIPReceiverFilterer struct { + contract *bind.BoundContract +} + +type CCIPReceiverSession struct { + Contract *CCIPReceiver + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type CCIPReceiverCallerSession struct { + Contract *CCIPReceiverCaller + CallOpts bind.CallOpts +} + +type CCIPReceiverTransactorSession struct { + Contract *CCIPReceiverTransactor + TransactOpts bind.TransactOpts +} + +type CCIPReceiverRaw struct { + Contract *CCIPReceiver +} + +type CCIPReceiverCallerRaw struct { + Contract *CCIPReceiverCaller +} + +type CCIPReceiverTransactorRaw struct { + Contract *CCIPReceiverTransactor +} + +func NewCCIPReceiver(address common.Address, backend bind.ContractBackend) (*CCIPReceiver, error) { + abi, err := abi.JSON(strings.NewReader(CCIPReceiverABI)) + if err != nil { + return nil, err + } + contract, err := bindCCIPReceiver(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CCIPReceiver{address: address, abi: abi, CCIPReceiverCaller: CCIPReceiverCaller{contract: contract}, CCIPReceiverTransactor: CCIPReceiverTransactor{contract: contract}, CCIPReceiverFilterer: CCIPReceiverFilterer{contract: contract}}, nil +} + +func NewCCIPReceiverCaller(address common.Address, caller bind.ContractCaller) (*CCIPReceiverCaller, error) { + contract, err := bindCCIPReceiver(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CCIPReceiverCaller{contract: contract}, nil +} + +func NewCCIPReceiverTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPReceiverTransactor, error) { + contract, err := bindCCIPReceiver(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CCIPReceiverTransactor{contract: contract}, nil +} + +func NewCCIPReceiverFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPReceiverFilterer, error) { + contract, err := bindCCIPReceiver(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CCIPReceiverFilterer{contract: contract}, nil +} + +func bindCCIPReceiver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CCIPReceiverMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_CCIPReceiver *CCIPReceiverRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPReceiver.Contract.CCIPReceiverCaller.contract.Call(opts, result, method, params...) +} + +func (_CCIPReceiver *CCIPReceiverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiver.Contract.CCIPReceiverTransactor.contract.Transfer(opts) +} + +func (_CCIPReceiver *CCIPReceiverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPReceiver.Contract.CCIPReceiverTransactor.contract.Transact(opts, method, params...) +} + +func (_CCIPReceiver *CCIPReceiverCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPReceiver.Contract.contract.Call(opts, result, method, params...) +} + +func (_CCIPReceiver *CCIPReceiverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiver.Contract.contract.Transfer(opts) +} + +func (_CCIPReceiver *CCIPReceiverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPReceiver.Contract.contract.Transact(opts, method, params...) +} + +func (_CCIPReceiver *CCIPReceiverCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { + var out []interface{} + err := _CCIPReceiver.contract.Call(opts, &out, "getMessageContents", messageId) + + if err != nil { + return *new(ClientAny2EVMMessage), err + } + + out0 := *abi.ConvertType(out[0], new(ClientAny2EVMMessage)).(*ClientAny2EVMMessage) + + return out0, err + +} + +func (_CCIPReceiver *CCIPReceiverSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPReceiver.Contract.GetMessageContents(&_CCIPReceiver.CallOpts, messageId) +} + +func (_CCIPReceiver *CCIPReceiverCallerSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPReceiver.Contract.GetMessageContents(&_CCIPReceiver.CallOpts, messageId) +} + +func (_CCIPReceiver *CCIPReceiverCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { + var out []interface{} + err := _CCIPReceiver.contract.Call(opts, &out, "getMessageStatus", messageId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_CCIPReceiver *CCIPReceiverSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _CCIPReceiver.Contract.GetMessageStatus(&_CCIPReceiver.CallOpts, messageId) +} + +func (_CCIPReceiver *CCIPReceiverCallerSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _CCIPReceiver.Contract.GetMessageStatus(&_CCIPReceiver.CallOpts, messageId) +} + +func (_CCIPReceiver *CCIPReceiverCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPReceiver.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 (_CCIPReceiver *CCIPReceiverSession) GetRouter() (common.Address, error) { + return _CCIPReceiver.Contract.GetRouter(&_CCIPReceiver.CallOpts) +} + +func (_CCIPReceiver *CCIPReceiverCallerSession) GetRouter() (common.Address, error) { + return _CCIPReceiver.Contract.GetRouter(&_CCIPReceiver.CallOpts) +} + +func (_CCIPReceiver *CCIPReceiverCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { + var out []interface{} + err := _CCIPReceiver.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPReceiver *CCIPReceiverSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPReceiver.Contract.IsApprovedSender(&_CCIPReceiver.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPReceiver *CCIPReceiverCallerSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPReceiver.Contract.IsApprovedSender(&_CCIPReceiver.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPReceiver *CCIPReceiverCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPReceiver.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 (_CCIPReceiver *CCIPReceiverSession) Owner() (common.Address, error) { + return _CCIPReceiver.Contract.Owner(&_CCIPReceiver.CallOpts) +} + +func (_CCIPReceiver *CCIPReceiverCallerSession) Owner() (common.Address, error) { + return _CCIPReceiver.Contract.Owner(&_CCIPReceiver.CallOpts) +} + +func (_CCIPReceiver *CCIPReceiverCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) { + var out []interface{} + err := _CCIPReceiver.contract.Call(opts, &out, "s_chains", arg0) + + outstruct := new(SChains) + if err != nil { + return *outstruct, err + } + + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + + return *outstruct, err + +} + +func (_CCIPReceiver *CCIPReceiverSession) SChains(arg0 uint64) (SChains, + + error) { + return _CCIPReceiver.Contract.SChains(&_CCIPReceiver.CallOpts, arg0) +} + +func (_CCIPReceiver *CCIPReceiverCallerSession) SChains(arg0 uint64) (SChains, + + error) { + return _CCIPReceiver.Contract.SChains(&_CCIPReceiver.CallOpts, arg0) +} + +func (_CCIPReceiver *CCIPReceiverCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _CCIPReceiver.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_CCIPReceiver *CCIPReceiverSession) TypeAndVersion() (string, error) { + return _CCIPReceiver.Contract.TypeAndVersion(&_CCIPReceiver.CallOpts) +} + +func (_CCIPReceiver *CCIPReceiverCallerSession) TypeAndVersion() (string, error) { + return _CCIPReceiver.Contract.TypeAndVersion(&_CCIPReceiver.CallOpts) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "acceptOwnership") +} + +func (_CCIPReceiver *CCIPReceiverSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPReceiver.Contract.AcceptOwnership(&_CCIPReceiver.TransactOpts) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPReceiver.Contract.AcceptOwnership(&_CCIPReceiver.TransactOpts) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "ccipReceive", message) +} + +func (_CCIPReceiver *CCIPReceiverSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.Contract.CcipReceive(&_CCIPReceiver.TransactOpts, message) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.Contract.CcipReceive(&_CCIPReceiver.TransactOpts, message) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "disableChain", chainSelector) +} + +func (_CCIPReceiver *CCIPReceiverSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _CCIPReceiver.Contract.DisableChain(&_CCIPReceiver.TransactOpts, chainSelector) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _CCIPReceiver.Contract.DisableChain(&_CCIPReceiver.TransactOpts, chainSelector) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "enableChain", chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPReceiver *CCIPReceiverSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPReceiver.Contract.EnableChain(&_CCIPReceiver.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPReceiver.Contract.EnableChain(&_CCIPReceiver.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "processMessage", message) +} + +func (_CCIPReceiver *CCIPReceiverSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.Contract.ProcessMessage(&_CCIPReceiver.TransactOpts, message) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.Contract.ProcessMessage(&_CCIPReceiver.TransactOpts, message) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "retryFailedMessage", messageId) +} + +func (_CCIPReceiver *CCIPReceiverSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "setSimRevert", simRevert) +} + +func (_CCIPReceiver *CCIPReceiverSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _CCIPReceiver.Contract.SetSimRevert(&_CCIPReceiver.TransactOpts, simRevert) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _CCIPReceiver.Contract.SetSimRevert(&_CCIPReceiver.TransactOpts, simRevert) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "transferOwnership", to) +} + +func (_CCIPReceiver *CCIPReceiverSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.TransferOwnership(&_CCIPReceiver.TransactOpts, to) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.TransferOwnership(&_CCIPReceiver.TransactOpts, to) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_CCIPReceiver *CCIPReceiverSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiver.Contract.UpdateApprovedSenders(&_CCIPReceiver.TransactOpts, adds, removes) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiver.Contract.UpdateApprovedSenders(&_CCIPReceiver.TransactOpts, adds, removes) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "withdrawNativeToken", to, amount) +} + +func (_CCIPReceiver *CCIPReceiverSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiver.Contract.WithdrawNativeToken(&_CCIPReceiver.TransactOpts, to, amount) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiver.Contract.WithdrawNativeToken(&_CCIPReceiver.TransactOpts, to, amount) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "withdrawTokens", token, to, amount) +} + +func (_CCIPReceiver *CCIPReceiverSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiver.Contract.WithdrawTokens(&_CCIPReceiver.TransactOpts, token, to, amount) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiver.Contract.WithdrawTokens(&_CCIPReceiver.TransactOpts, token, to, amount) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _CCIPReceiver.contract.RawTransact(opts, calldata) +} + +func (_CCIPReceiver *CCIPReceiverSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _CCIPReceiver.Contract.Fallback(&_CCIPReceiver.TransactOpts, calldata) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _CCIPReceiver.Contract.Fallback(&_CCIPReceiver.TransactOpts, calldata) +} + +func (_CCIPReceiver *CCIPReceiverTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiver.contract.RawTransact(opts, nil) +} + +func (_CCIPReceiver *CCIPReceiverSession) Receive() (*types.Transaction, error) { + return _CCIPReceiver.Contract.Receive(&_CCIPReceiver.TransactOpts) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) Receive() (*types.Transaction, error) { + return _CCIPReceiver.Contract.Receive(&_CCIPReceiver.TransactOpts) +} + +type CCIPReceiverMessageFailedIterator struct { + Event *CCIPReceiverMessageFailed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverMessageFailedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverMessageFailed) + 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(CCIPReceiverMessageFailed) + 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 *CCIPReceiverMessageFailedIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverMessageFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log +} + +func (_CCIPReceiver *CCIPReceiverFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageFailedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPReceiverMessageFailedIterator{contract: _CCIPReceiver.contract, event: "MessageFailed", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageFailed, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverMessageFailed) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageFailed", 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 (_CCIPReceiver *CCIPReceiverFilterer) ParseMessageFailed(log types.Log) (*CCIPReceiverMessageFailed, error) { + event := new(CCIPReceiverMessageFailed) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverMessageRecoveredIterator struct { + Event *CCIPReceiverMessageRecovered + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverMessageRecoveredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverMessageRecovered) + 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(CCIPReceiverMessageRecovered) + 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 *CCIPReceiverMessageRecoveredIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverMessageRecoveredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverMessageRecovered struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPReceiver *CCIPReceiverFilterer) FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageRecoveredIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPReceiverMessageRecoveredIterator{contract: _CCIPReceiver.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageRecovered, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverMessageRecovered) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageRecovered", 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 (_CCIPReceiver *CCIPReceiverFilterer) ParseMessageRecovered(log types.Log) (*CCIPReceiverMessageRecovered, error) { + event := new(CCIPReceiverMessageRecovered) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageRecovered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverMessageSucceededIterator struct { + Event *CCIPReceiverMessageSucceeded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverMessageSucceededIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverMessageSucceeded) + 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(CCIPReceiverMessageSucceeded) + 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 *CCIPReceiverMessageSucceededIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverMessageSucceededIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverMessageSucceeded struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPReceiver *CCIPReceiverFilterer) FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageSucceededIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPReceiverMessageSucceededIterator{contract: _CCIPReceiver.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageSucceeded, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverMessageSucceeded) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageSucceeded", 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 (_CCIPReceiver *CCIPReceiverFilterer) ParseMessageSucceeded(log types.Log) (*CCIPReceiverMessageSucceeded, error) { + event := new(CCIPReceiverMessageSucceeded) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverOwnershipTransferRequestedIterator struct { + Event *CCIPReceiverOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverOwnershipTransferRequested) + 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(CCIPReceiverOwnershipTransferRequested) + 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 *CCIPReceiverOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPReceiver *CCIPReceiverFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverOwnershipTransferRequestedIterator, 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 := _CCIPReceiver.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPReceiverOwnershipTransferRequestedIterator{contract: _CCIPReceiver.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiver *CCIPReceiverFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPReceiverOwnershipTransferRequested, 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 := _CCIPReceiver.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(CCIPReceiverOwnershipTransferRequested) + if err := _CCIPReceiver.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 (_CCIPReceiver *CCIPReceiverFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPReceiverOwnershipTransferRequested, error) { + event := new(CCIPReceiverOwnershipTransferRequested) + if err := _CCIPReceiver.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverOwnershipTransferredIterator struct { + Event *CCIPReceiverOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverOwnershipTransferred) + 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(CCIPReceiverOwnershipTransferred) + 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 *CCIPReceiverOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPReceiver *CCIPReceiverFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverOwnershipTransferredIterator, 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 := _CCIPReceiver.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPReceiverOwnershipTransferredIterator{contract: _CCIPReceiver.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiver *CCIPReceiverFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPReceiverOwnershipTransferred, 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 := _CCIPReceiver.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(CCIPReceiverOwnershipTransferred) + if err := _CCIPReceiver.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 (_CCIPReceiver *CCIPReceiverFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPReceiverOwnershipTransferred, error) { + event := new(CCIPReceiverOwnershipTransferred) + if err := _CCIPReceiver.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChains struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_CCIPReceiver *CCIPReceiver) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPReceiver.abi.Events["MessageFailed"].ID: + return _CCIPReceiver.ParseMessageFailed(log) + case _CCIPReceiver.abi.Events["MessageRecovered"].ID: + return _CCIPReceiver.ParseMessageRecovered(log) + case _CCIPReceiver.abi.Events["MessageSucceeded"].ID: + return _CCIPReceiver.ParseMessageSucceeded(log) + case _CCIPReceiver.abi.Events["OwnershipTransferRequested"].ID: + return _CCIPReceiver.ParseOwnershipTransferRequested(log) + case _CCIPReceiver.abi.Events["OwnershipTransferred"].ID: + return _CCIPReceiver.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPReceiverMessageFailed) Topic() common.Hash { + return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") +} + +func (CCIPReceiverMessageRecovered) Topic() common.Hash { + return common.HexToHash("0xef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad") +} + +func (CCIPReceiverMessageSucceeded) Topic() common.Hash { + return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +} + +func (CCIPReceiverOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (CCIPReceiverOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_CCIPReceiver *CCIPReceiver) Address() common.Address { + return _CCIPReceiver.address +} + +type CCIPReceiverInterface interface { + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) + + GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + + EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + + SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + + WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) + + WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) + + Receive(opts *bind.TransactOpts) (*types.Transaction, error) + + FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageFailedIterator, error) + + WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageFailed, messageId [][32]byte) (event.Subscription, error) + + ParseMessageFailed(log types.Log) (*CCIPReceiverMessageFailed, error) + + FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageRecoveredIterator, error) + + WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageRecovered, messageId [][32]byte) (event.Subscription, error) + + ParseMessageRecovered(log types.Log) (*CCIPReceiverMessageRecovered, error) + + FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageSucceededIterator, error) + + WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageSucceeded, messageId [][32]byte) (event.Subscription, error) + + ParseMessageSucceeded(log types.Log) (*CCIPReceiverMessageSucceeded, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPReceiverOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*CCIPReceiverOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPReceiverOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*CCIPReceiverOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go b/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go new file mode 100644 index 0000000000..f695b20319 --- /dev/null +++ b/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go @@ -0,0 +1,1927 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccipReceiverWithAck + +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 ClientAny2EVMMessage struct { + MessageId [32]byte + SourceChainSelector uint64 + Sender []byte + Data []byte + DestTokenAmounts []ClientEVMTokenAmount +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type ICCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + +var CCIPReceiverWithAckMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMagicBytes\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACKMESSAGEMAGICBYTES\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162003c7a38038062003c7a8339810160408190526200003491620005c4565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c0816200013c565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013457620001346001600160a01b03821683600019620001e7565b5050620006c1565b336001600160a01b03821603620001965760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002655750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156200023d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000263919062000603565b155b620002d95760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003319185916200033616565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000385906001600160a01b03851690849062000407565b805190915015620003315780806020019051810190620003a691906200061d565b620003315760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b606062000418848460008562000420565b949350505050565b606082471015620004835760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620004a191906200066e565b60006040518083038185875af1925050503d8060008114620004e0576040519150601f19603f3d011682016040523d82523d6000602084013e620004e5565b606091505b509092509050620004f98783838762000504565b979650505050505050565b606083156200057857825160000362000570576001600160a01b0385163b620005705760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162000418565b6200041883838151156200058f5781518083602001fd5b8060405162461bcd60e51b81526004016200008491906200068c565b6001600160a01b0381168114620005c157600080fd5b50565b60008060408385031215620005d857600080fd5b8251620005e581620005ab565b6020840151909250620005f881620005ab565b809150509250929050565b6000602082840312156200061657600080fd5b5051919050565b6000602082840312156200063057600080fd5b815180151581146200064157600080fd5b9392505050565b60005b83811015620006655781810151838201526020016200064b565b50506000910152565b600082516200068281846020870162000648565b9190910192915050565b6020815260008251806020840152620006ad81604085016020870162000648565b601f01601f19169190910160400192915050565b60805161357a6200070060003960008181610451015281816105a10152818161063f01528181610dfd01528181611c450152611d11015261357a6000f3fe6080604052600436106101615760003560e01c80636939cd97116100bf578063b0f479a111610079578063e4ca875411610056578063e4ca8754146104b5578063f2fde38b146104d5578063ff2deec3146104f557005b8063b0f479a114610442578063cf6730f814610475578063d8469e401461049557005b80638462a2b9116100a75780638462a2b9146103b657806385572ffb146103d65780638da5cb5b146103f657005b80636939cd971461037457806379ba5097146103a157005b806341eade461161011b578063536c6bfa116100f8578063536c6bfa146103065780635dc5ebdb146103265780635e35359e1461035457005b806341eade46146102985780635075a9d4146102b857806352f813c3146102e657005b806311e85dff1161014957806311e85dff146101e0578063181f5a77146102005780633a51b79e1461024f57005b806305bfe9821461016a5780630e958d6b146101b057005b3661016857005b005b34801561017657600080fd5b5061019a610185366004612541565b60086020526000908152604090205460ff1681565b6040516101a79190612589565b60405180910390f35b3480156101bc57600080fd5b506101d06101cb366004612629565b610527565b60405190151581526020016101a7565b3480156101ec57600080fd5b506101686101fb3660046126a0565b610571565b34801561020c57600080fd5b5060408051808201909152601d81527f4343495052656365697665725769746841434b20312e302e302d64657600000060208201525b6040516101a7919061272b565b34801561025b57600080fd5b506102426040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156102a457600080fd5b506101686102b336600461273e565b610701565b3480156102c457600080fd5b506102d86102d3366004612541565b610740565b6040519081526020016101a7565b3480156102f257600080fd5b50610168610301366004612769565b610753565b34801561031257600080fd5b50610168610321366004612786565b61078c565b34801561033257600080fd5b5061034661034136600461273e565b6107a2565b6040516101a79291906127b2565b34801561036057600080fd5b5061016861036f3660046127e0565b6108ce565b34801561038057600080fd5b5061039461038f366004612541565b6108f7565b6040516101a7919061287e565b3480156103ad57600080fd5b50610168610b02565b3480156103c257600080fd5b506101686103d1366004612957565b610c04565b3480156103e257600080fd5b506101686103f13660046129c3565b610de5565b34801561040257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a7565b34801561044e57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061041d565b34801561048157600080fd5b506101686104903660046129c3565b6110d5565b3480156104a157600080fd5b506101686104b03660046129fe565b6112f2565b3480156104c157600080fd5b506101686104d0366004612541565b611354565b3480156104e157600080fd5b506101686104f03660046126a0565b6115d2565b34801561050157600080fd5b5060075461041d90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020819052604080832090519101906105559085908590612a81565b9081526040519081900360200190205460ff1690509392505050565b6105796115e6565b600754610100900473ffffffffffffffffffffffffffffffffffffffff16156105e6576105e67f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000611669565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff851617909455929091041690156106a3576106a37f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611669565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6107096115e6565b67ffffffffffffffff811660009081526002602052604081209061072d82826124f3565b61073b6001830160006124f3565b505050565b600061074d600483611869565b92915050565b61075b6115e6565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6107946115e6565b61079e828261187c565b5050565b6002602052600090815260409020805481906107bd90612a91565b80601f01602080910402602001604051908101604052809291908181526020018280546107e990612a91565b80156108365780601f1061080b57610100808354040283529160200191610836565b820191906000526020600020905b81548152906001019060200180831161081957829003601f168201915b50505050509080600101805461084b90612a91565b80601f016020809104026020016040519081016040528092919081815260200182805461087790612a91565b80156108c45780601f10610899576101008083540402835291602001916108c4565b820191906000526020600020905b8154815290600101906020018083116108a757829003601f168201915b5050505050905082565b6108d66115e6565b61073b73ffffffffffffffffffffffffffffffffffffffff841683836119d6565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161096690612a91565b80601f016020809104026020016040519081016040528092919081815260200182805461099290612a91565b80156109df5780601f106109b4576101008083540402835291602001916109df565b820191906000526020600020905b8154815290600101906020018083116109c257829003601f168201915b505050505081526020016003820180546109f890612a91565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2490612a91565b8015610a715780601f10610a4657610100808354040283529160200191610a71565b820191906000526020600020905b815481529060010190602001808311610a5457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610af45760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a9f565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c0c6115e6565b60005b81811015610cef5760026000848484818110610c2d57610c2d612ae4565b9050602002810190610c3f9190612b13565b610c4d90602081019061273e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c8457610c84612ae4565b9050602002810190610c969190612b13565b610ca4906020810190612b51565b604051610cb2929190612a81565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c0f565b5060005b83811015610dde57600160026000878785818110610d1357610d13612ae4565b9050602002810190610d259190612b13565b610d3390602081019061273e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610d6a57610d6a612ae4565b9050602002810190610d7c9190612b13565b610d8a906020810190612b51565b604051610d98929190612a81565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610cf3565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e56576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b7f565b610e66604082016020830161273e565b610e736040830183612b51565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020819052604091829020915191019350610ed09250849150612bb6565b9081526040519081900360200190205460ff16610f1b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b7f919061272b565b610f2b604084016020850161273e565b67ffffffffffffffff811660009081526002602052604090208054610f4f90612a91565b9050600003610f96576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610b7f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610fd2908790600401612cca565b600060405180830381600087803b158015610fec57600080fd5b505af1925050508015610ffd575060015b6110a2573d80801561102b576040519150601f19603f3d011682016040523d82523d6000602084013e611030565b606091505b50611042853560015b60049190611a2c565b5084356000908152600360205260409020859061105f82826130cb565b50506040518535907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061109490849061272b565b60405180910390a2506110cf565b6040518435907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b50505050565b33301461110e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061111d6060830183612b51565b81019061112a91906132d9565b90506000816040015160018111156111445761114461255a565b036111525761079e82611a41565b60018160400151600181111561116a5761116a61255a565b0361079e57600080826020015180602001905181019061118a9190613385565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611222576040517f9f0b03b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff1660028111156112475761124761255a565b03611281576040517f33704b2800000000000000000000000000000000000000000000000000000000815260048101829052602401610b7f565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b6112fa6115e6565b67ffffffffffffffff8516600090815260026020526040902061131e848683612e4f565b508015610dde5767ffffffffffffffff8516600090815260026020526040902060010161134c828483612e4f565b505050505050565b61135c6115e6565b6001611369600483611869565b146113a3576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b7f565b6113ae816000611039565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916113f690612a91565b80601f016020809104026020016040519081016040528092919081815260200182805461142290612a91565b801561146f5780601f106114445761010080835404028352916020019161146f565b820191906000526020600020905b81548152906001019060200180831161145257829003601f168201915b5050505050815260200160038201805461148890612a91565b80601f01602080910402602001604051908101604052809291908181526020018280546114b490612a91565b80156115015780601f106114d657610100808354040283529160200191611501565b820191906000526020600020905b8154815290600101906020018083116114e457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156115845760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161152f565b5050505081525050905061159781611df7565b6115a2600483611e9d565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6115da6115e6565b6115e381611ea9565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b7f565b565b80158061170957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156116e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117079190613406565b155b611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b7f565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261073b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f9e565b600061187583836120aa565b9392505050565b804710156118e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b7f565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611940576040519150601f19603f3d011682016040523d82523d6000602084013e611945565b606091505b505090508061073b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b7f565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261073b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016117e7565b6000611a39848484612134565b949350505050565b6040805160008082526020820190925281611a7e565b6040805180820190915260008082526020820152815260200190600190039081611a575790505b50905060006040518060a00160405280848060400190611a9e9190612b51565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192611b1f928835910161341f565b6040516020818303038152906040528152602001838152602001600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160026000866020016020810190611b8e919061273e565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054611bbe90612a91565b80601f0160208091040260200160405190810160405280929190818152602001828054611bea90612a91565b8015611c375780601f10611c0c57610100808354040283529160200191611c37565b820191906000526020600020905b815481529060010190602001808311611c1a57829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded856020016020810190611c92919061273e565b846040518363ffffffff1660e01b8152600401611cb0929190613441565b602060405180830381865afa158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf19190613406565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615611d4c576000611d4e565b835b611d5e6040890160208a0161273e565b866040518463ffffffff1660e01b8152600401611d7c929190613441565b60206040518083038185885af1158015611d9a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611dbf9190613406565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60005b81608001515181101561079e57600082608001518281518110611e1f57611e1f612ae4565b6020026020010151602001519050600083608001518381518110611e4557611e45612ae4565b6020026020010151600001519050611e93611e7560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff831690846119d6565b5050600101611dfa565b60006118758383612151565b3373ffffffffffffffffffffffffffffffffffffffff821603611f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b7f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612000826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661216e9092919063ffffffff16565b80519091501561073b578080602001905181019061201e919061350e565b61073b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b7f565b6000818152600283016020526040812054801515806120ce57506120ce848461217d565b611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b7f565b60008281526002840160205260408120829055611a398484612189565b600081815260028301602052604081208190556118758383612195565b6060611a3984846000856121a1565b600061187583836122ba565b600061187583836122d2565b60006118758383612321565b606082471015612233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b7f565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161225c9190612bb6565b60006040518083038185875af1925050503d8060008114612299576040519150601f19603f3d011682016040523d82523d6000602084013e61229e565b606091505b50915091506122af87838387612414565b979650505050505050565b60008181526001830160205260408120541515611875565b60008181526001830160205260408120546123195750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561074d565b50600061074d565b6000818152600183016020526040812054801561240a57600061234560018361352b565b85549091506000906123599060019061352b565b90508181146123be57600086600001828154811061237957612379612ae4565b906000526020600020015490508087600001848154811061239c5761239c612ae4565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123cf576123cf61353e565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061074d565b600091505061074d565b606083156124aa5782516000036124a35773ffffffffffffffffffffffffffffffffffffffff85163b6124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b7f565b5081611a39565b611a3983838151156124bf5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f919061272b565b5080546124ff90612a91565b6000825580601f1061250f575050565b601f0160209004906000526020600020908101906115e391905b8082111561253d5760008155600101612529565b5090565b60006020828403121561255357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106125c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146115e357600080fd5b60008083601f8401126125f257600080fd5b50813567ffffffffffffffff81111561260a57600080fd5b60208301915083602082850101111561262257600080fd5b9250929050565b60008060006040848603121561263e57600080fd5b8335612649816125ca565b9250602084013567ffffffffffffffff81111561266557600080fd5b612671868287016125e0565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146115e357600080fd5b6000602082840312156126b257600080fd5b81356118758161267e565b60005b838110156126d85781810151838201526020016126c0565b50506000910152565b600081518084526126f98160208601602086016126bd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061187560208301846126e1565b60006020828403121561275057600080fd5b8135611875816125ca565b80151581146115e357600080fd5b60006020828403121561277b57600080fd5b81356118758161275b565b6000806040838503121561279957600080fd5b82356127a48161267e565b946020939093013593505050565b6040815260006127c560408301856126e1565b82810360208401526127d781856126e1565b95945050505050565b6000806000606084860312156127f557600080fd5b83356128008161267e565b925060208401356128108161267e565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612873578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612836565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526128b860c08401826126e1565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526128f483836126e1565b925060808601519150808584030160a0860152506127d78282612821565b60008083601f84011261292457600080fd5b50813567ffffffffffffffff81111561293c57600080fd5b6020830191508360208260051b850101111561262257600080fd5b6000806000806040858703121561296d57600080fd5b843567ffffffffffffffff8082111561298557600080fd5b61299188838901612912565b909650945060208701359150808211156129aa57600080fd5b506129b787828801612912565b95989497509550505050565b6000602082840312156129d557600080fd5b813567ffffffffffffffff8111156129ec57600080fd5b820160a0818503121561187557600080fd5b600080600080600060608688031215612a1657600080fd5b8535612a21816125ca565b9450602086013567ffffffffffffffff80821115612a3e57600080fd5b612a4a89838a016125e0565b90965094506040880135915080821115612a6357600080fd5b50612a70888289016125e0565b969995985093965092949392505050565b8183823760009101908152919050565b600181811c90821680612aa557607f821691505b602082108103612ade577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112612b4757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612b8657600080fd5b83018035915067ffffffffffffffff821115612ba157600080fd5b60200191503681900382131561262257600080fd5b60008251612b478184602087016126bd565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612bfd57600080fd5b830160208101925035905067ffffffffffffffff811115612c1d57600080fd5b80360382131561262257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612873578135612c988161267e565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612c85565b602081528135602082015260006020830135612ce5816125ca565b67ffffffffffffffff8082166040850152612d036040860186612bc8565b925060a06060860152612d1a60c086018483612c2c565b925050612d2a6060860186612bc8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152612d60858385612c2c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612d9957600080fd5b60209288019283019235915083821115612db257600080fd5b8160061b3603831315612dc457600080fd5b8685030160a08701526122af848284612c75565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561073b576000816000526020600020601f850160051c81016020861015612e305750805b601f850160051c820191505b8181101561134c57828155600101612e3c565b67ffffffffffffffff831115612e6757612e67612dd8565b612e7b83612e758354612a91565b83612e07565b6000601f841160018114612ecd5760008515612e975750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610dde565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612f1c5786850135825560209485019460019092019101612efc565b5086821015612f57577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135612fa38161267e565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561300957613009612dd8565b8054838255808410156130965760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461304a5761304a612f69565b808616861461305b5761305b612f69565b5060008360005260206000208360011b81018760011b820191505b80821015613091578282558284830155600282019150613076565b505050505b5060008181526020812083915b8581101561134c576130b58383612f98565b60409290920191600291909101906001016130a3565b813581556001810160208301356130e1816125ca565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556131216040860186612b51565b93509150613133838360028701612e4f565b6131406060860186612b51565b93509150613152838360038701612e4f565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261318957600080fd5b91840191823591508082111561319e57600080fd5b506020820191508060061b36038213156131b757600080fd5b6110cf818360048601612ff0565b6040516060810167ffffffffffffffff811182821017156131e8576131e8612dd8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561323557613235612dd8565b604052919050565b600067ffffffffffffffff82111561325757613257612dd8565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261329457600080fd5b81356132a76132a28261323d565b6131ee565b8181528460208386010111156132bc57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156132eb57600080fd5b813567ffffffffffffffff8082111561330357600080fd5b908301906060828603121561331757600080fd5b61331f6131c5565b82358281111561332e57600080fd5b61333a87828601613283565b82525060208301358281111561334f57600080fd5b61335b87828601613283565b602083015250604083013592506002831061337557600080fd5b6040810192909252509392505050565b6000806040838503121561339857600080fd5b825167ffffffffffffffff8111156133af57600080fd5b8301601f810185136133c057600080fd5b80516133ce6132a28261323d565b8181528660208385010111156133e357600080fd5b6133f48260208301602086016126bd565b60209590950151949694955050505050565b60006020828403121561341857600080fd5b5051919050565b60408152600061343260408301856126e1565b90508260208301529392505050565b67ffffffffffffffff83168152604060208201526000825160a0604084015261346d60e08401826126e1565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526134a983836126e1565b925060408601519150808584030160808601526134c68383612821565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061350482826126e1565b9695505050505050565b60006020828403121561352057600080fd5b81516118758161275b565b8181038181111561074d5761074d612f69565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", +} + +var CCIPReceiverWithAckABI = CCIPReceiverWithAckMetaData.ABI + +var CCIPReceiverWithAckBin = CCIPReceiverWithAckMetaData.Bin + +func DeployCCIPReceiverWithAck(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address, feeToken common.Address) (common.Address, *types.Transaction, *CCIPReceiverWithAck, error) { + parsed, err := CCIPReceiverWithAckMetaData.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(CCIPReceiverWithAckBin), backend, router, feeToken) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CCIPReceiverWithAck{address: address, abi: *parsed, CCIPReceiverWithAckCaller: CCIPReceiverWithAckCaller{contract: contract}, CCIPReceiverWithAckTransactor: CCIPReceiverWithAckTransactor{contract: contract}, CCIPReceiverWithAckFilterer: CCIPReceiverWithAckFilterer{contract: contract}}, nil +} + +type CCIPReceiverWithAck struct { + address common.Address + abi abi.ABI + CCIPReceiverWithAckCaller + CCIPReceiverWithAckTransactor + CCIPReceiverWithAckFilterer +} + +type CCIPReceiverWithAckCaller struct { + contract *bind.BoundContract +} + +type CCIPReceiverWithAckTransactor struct { + contract *bind.BoundContract +} + +type CCIPReceiverWithAckFilterer struct { + contract *bind.BoundContract +} + +type CCIPReceiverWithAckSession struct { + Contract *CCIPReceiverWithAck + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type CCIPReceiverWithAckCallerSession struct { + Contract *CCIPReceiverWithAckCaller + CallOpts bind.CallOpts +} + +type CCIPReceiverWithAckTransactorSession struct { + Contract *CCIPReceiverWithAckTransactor + TransactOpts bind.TransactOpts +} + +type CCIPReceiverWithAckRaw struct { + Contract *CCIPReceiverWithAck +} + +type CCIPReceiverWithAckCallerRaw struct { + Contract *CCIPReceiverWithAckCaller +} + +type CCIPReceiverWithAckTransactorRaw struct { + Contract *CCIPReceiverWithAckTransactor +} + +func NewCCIPReceiverWithAck(address common.Address, backend bind.ContractBackend) (*CCIPReceiverWithAck, error) { + abi, err := abi.JSON(strings.NewReader(CCIPReceiverWithAckABI)) + if err != nil { + return nil, err + } + contract, err := bindCCIPReceiverWithAck(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAck{address: address, abi: abi, CCIPReceiverWithAckCaller: CCIPReceiverWithAckCaller{contract: contract}, CCIPReceiverWithAckTransactor: CCIPReceiverWithAckTransactor{contract: contract}, CCIPReceiverWithAckFilterer: CCIPReceiverWithAckFilterer{contract: contract}}, nil +} + +func NewCCIPReceiverWithAckCaller(address common.Address, caller bind.ContractCaller) (*CCIPReceiverWithAckCaller, error) { + contract, err := bindCCIPReceiverWithAck(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckCaller{contract: contract}, nil +} + +func NewCCIPReceiverWithAckTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPReceiverWithAckTransactor, error) { + contract, err := bindCCIPReceiverWithAck(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckTransactor{contract: contract}, nil +} + +func NewCCIPReceiverWithAckFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPReceiverWithAckFilterer, error) { + contract, err := bindCCIPReceiverWithAck(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckFilterer{contract: contract}, nil +} + +func bindCCIPReceiverWithAck(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CCIPReceiverWithAckMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPReceiverWithAck.Contract.CCIPReceiverWithAckCaller.contract.Call(opts, result, method, params...) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.CCIPReceiverWithAckTransactor.contract.Transfer(opts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.CCIPReceiverWithAckTransactor.contract.Transact(opts, method, params...) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPReceiverWithAck.Contract.contract.Call(opts, result, method, params...) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.contract.Transfer(opts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.contract.Transact(opts, method, params...) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _CCIPReceiverWithAck.contract.Call(opts, &out, "ACKMESSAGEMAGICBYTES") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { + return _CCIPReceiverWithAck.Contract.ACKMESSAGEMAGICBYTES(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { + return _CCIPReceiverWithAck.Contract.ACKMESSAGEMAGICBYTES(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { + var out []interface{} + err := _CCIPReceiverWithAck.contract.Call(opts, &out, "getMessageContents", messageId) + + if err != nil { + return *new(ClientAny2EVMMessage), err + } + + out0 := *abi.ConvertType(out[0], new(ClientAny2EVMMessage)).(*ClientAny2EVMMessage) + + return out0, err + +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPReceiverWithAck.Contract.GetMessageContents(&_CCIPReceiverWithAck.CallOpts, messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPReceiverWithAck.Contract.GetMessageContents(&_CCIPReceiverWithAck.CallOpts, messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { + var out []interface{} + err := _CCIPReceiverWithAck.contract.Call(opts, &out, "getMessageStatus", messageId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _CCIPReceiverWithAck.Contract.GetMessageStatus(&_CCIPReceiverWithAck.CallOpts, messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _CCIPReceiverWithAck.Contract.GetMessageStatus(&_CCIPReceiverWithAck.CallOpts, messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPReceiverWithAck.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 (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) GetRouter() (common.Address, error) { + return _CCIPReceiverWithAck.Contract.GetRouter(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) GetRouter() (common.Address, error) { + return _CCIPReceiverWithAck.Contract.GetRouter(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { + var out []interface{} + err := _CCIPReceiverWithAck.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPReceiverWithAck.Contract.IsApprovedSender(&_CCIPReceiverWithAck.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPReceiverWithAck.Contract.IsApprovedSender(&_CCIPReceiverWithAck.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPReceiverWithAck.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 (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) Owner() (common.Address, error) { + return _CCIPReceiverWithAck.Contract.Owner(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) Owner() (common.Address, error) { + return _CCIPReceiverWithAck.Contract.Owner(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) { + var out []interface{} + err := _CCIPReceiverWithAck.contract.Call(opts, &out, "s_chains", arg0) + + outstruct := new(SChains) + if err != nil { + return *outstruct, err + } + + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + + return *outstruct, err + +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) SChains(arg0 uint64) (SChains, + + error) { + return _CCIPReceiverWithAck.Contract.SChains(&_CCIPReceiverWithAck.CallOpts, arg0) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) SChains(arg0 uint64) (SChains, + + error) { + return _CCIPReceiverWithAck.Contract.SChains(&_CCIPReceiverWithAck.CallOpts, arg0) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPReceiverWithAck.contract.Call(opts, &out, "s_feeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) SFeeToken() (common.Address, error) { + return _CCIPReceiverWithAck.Contract.SFeeToken(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) SFeeToken() (common.Address, error) { + return _CCIPReceiverWithAck.Contract.SFeeToken(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { + var out []interface{} + err := _CCIPReceiverWithAck.contract.Call(opts, &out, "s_messageStatus", messageId) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPReceiverWithAck.Contract.SMessageStatus(&_CCIPReceiverWithAck.CallOpts, messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPReceiverWithAck.Contract.SMessageStatus(&_CCIPReceiverWithAck.CallOpts, messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _CCIPReceiverWithAck.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) TypeAndVersion() (string, error) { + return _CCIPReceiverWithAck.Contract.TypeAndVersion(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) TypeAndVersion() (string, error) { + return _CCIPReceiverWithAck.Contract.TypeAndVersion(&_CCIPReceiverWithAck.CallOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "acceptOwnership") +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.AcceptOwnership(&_CCIPReceiverWithAck.TransactOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.AcceptOwnership(&_CCIPReceiverWithAck.TransactOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "ccipReceive", message) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.CcipReceive(&_CCIPReceiverWithAck.TransactOpts, message) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.CcipReceive(&_CCIPReceiverWithAck.TransactOpts, message) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "disableChain", chainSelector) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.DisableChain(&_CCIPReceiverWithAck.TransactOpts, chainSelector) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.DisableChain(&_CCIPReceiverWithAck.TransactOpts, chainSelector) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "enableChain", chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.EnableChain(&_CCIPReceiverWithAck.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.EnableChain(&_CCIPReceiverWithAck.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "modifyFeeToken", token) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.ModifyFeeToken(&_CCIPReceiverWithAck.TransactOpts, token) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.ModifyFeeToken(&_CCIPReceiverWithAck.TransactOpts, token) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "processMessage", message) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.ProcessMessage(&_CCIPReceiverWithAck.TransactOpts, message) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.ProcessMessage(&_CCIPReceiverWithAck.TransactOpts, message) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "retryFailedMessage", messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.RetryFailedMessage(&_CCIPReceiverWithAck.TransactOpts, messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.RetryFailedMessage(&_CCIPReceiverWithAck.TransactOpts, messageId) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "setSimRevert", simRevert) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.SetSimRevert(&_CCIPReceiverWithAck.TransactOpts, simRevert) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.SetSimRevert(&_CCIPReceiverWithAck.TransactOpts, simRevert) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "transferOwnership", to) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.TransferOwnership(&_CCIPReceiverWithAck.TransactOpts, to) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.TransferOwnership(&_CCIPReceiverWithAck.TransactOpts, to) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.UpdateApprovedSenders(&_CCIPReceiverWithAck.TransactOpts, adds, removes) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.UpdateApprovedSenders(&_CCIPReceiverWithAck.TransactOpts, adds, removes) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "withdrawNativeToken", to, amount) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.WithdrawNativeToken(&_CCIPReceiverWithAck.TransactOpts, to, amount) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.WithdrawNativeToken(&_CCIPReceiverWithAck.TransactOpts, to, amount) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.Transact(opts, "withdrawTokens", token, to, amount) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.WithdrawTokens(&_CCIPReceiverWithAck.TransactOpts, token, to, amount) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.WithdrawTokens(&_CCIPReceiverWithAck.TransactOpts, token, to, amount) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.RawTransact(opts, calldata) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.Fallback(&_CCIPReceiverWithAck.TransactOpts, calldata) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.Fallback(&_CCIPReceiverWithAck.TransactOpts, calldata) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiverWithAck.contract.RawTransact(opts, nil) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) Receive() (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.Receive(&_CCIPReceiverWithAck.TransactOpts) +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) Receive() (*types.Transaction, error) { + return _CCIPReceiverWithAck.Contract.Receive(&_CCIPReceiverWithAck.TransactOpts) +} + +type CCIPReceiverWithAckFeeTokenModifiedIterator struct { + Event *CCIPReceiverWithAckFeeTokenModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckFeeTokenModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckFeeTokenModified) + 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(CCIPReceiverWithAckFeeTokenModified) + 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 *CCIPReceiverWithAckFeeTokenModifiedIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckFeeTokenModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckFeeTokenModified struct { + OldToken common.Address + NewToken common.Address + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPReceiverWithAckFeeTokenModifiedIterator, error) { + + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) + } + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckFeeTokenModifiedIterator{contract: _CCIPReceiverWithAck.contract, event: "FeeTokenModified", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { + + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) + } + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverWithAckFeeTokenModified) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "FeeTokenModified", 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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseFeeTokenModified(log types.Log) (*CCIPReceiverWithAckFeeTokenModified, error) { + event := new(CCIPReceiverWithAckFeeTokenModified) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverWithAckMessageAckReceivedIterator struct { + Event *CCIPReceiverWithAckMessageAckReceived + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckMessageAckReceivedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckMessageAckReceived) + 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(CCIPReceiverWithAckMessageAckReceived) + 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 *CCIPReceiverWithAckMessageAckReceivedIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckMessageAckReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckMessageAckReceived struct { + Arg0 [32]byte + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPReceiverWithAckMessageAckReceivedIterator, error) { + + logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageAckReceived") + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckMessageAckReceivedIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageAckReceived", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageAckReceived) (event.Subscription, error) { + + logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageAckReceived") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverWithAckMessageAckReceived) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageAckReceived", 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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageAckReceived(log types.Log) (*CCIPReceiverWithAckMessageAckReceived, error) { + event := new(CCIPReceiverWithAckMessageAckReceived) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverWithAckMessageAckSentIterator struct { + Event *CCIPReceiverWithAckMessageAckSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckMessageAckSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckMessageAckSent) + 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(CCIPReceiverWithAckMessageAckSent) + 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 *CCIPReceiverWithAckMessageAckSentIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckMessageAckSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckMessageAckSent struct { + IncomingMessageId [32]byte + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPReceiverWithAckMessageAckSentIterator, error) { + + logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageAckSent") + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckMessageAckSentIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageAckSent", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageAckSent) (event.Subscription, error) { + + logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageAckSent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverWithAckMessageAckSent) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageAckSent", 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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageAckSent(log types.Log) (*CCIPReceiverWithAckMessageAckSent, error) { + event := new(CCIPReceiverWithAckMessageAckSent) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageAckSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverWithAckMessageFailedIterator struct { + Event *CCIPReceiverWithAckMessageFailed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckMessageFailedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckMessageFailed) + 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(CCIPReceiverWithAckMessageFailed) + 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 *CCIPReceiverWithAckMessageFailedIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckMessageFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageFailedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckMessageFailedIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageFailed", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageFailed, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverWithAckMessageFailed) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageFailed", 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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageFailed(log types.Log) (*CCIPReceiverWithAckMessageFailed, error) { + event := new(CCIPReceiverWithAckMessageFailed) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverWithAckMessageRecoveredIterator struct { + Event *CCIPReceiverWithAckMessageRecovered + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckMessageRecoveredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckMessageRecovered) + 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(CCIPReceiverWithAckMessageRecovered) + 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 *CCIPReceiverWithAckMessageRecoveredIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckMessageRecoveredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckMessageRecovered struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageRecoveredIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckMessageRecoveredIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageRecovered, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverWithAckMessageRecovered) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageRecovered", 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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageRecovered(log types.Log) (*CCIPReceiverWithAckMessageRecovered, error) { + event := new(CCIPReceiverWithAckMessageRecovered) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageRecovered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverWithAckMessageSentIterator struct { + Event *CCIPReceiverWithAckMessageSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckMessageSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckMessageSent) + 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(CCIPReceiverWithAckMessageSent) + 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 *CCIPReceiverWithAckMessageSentIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckMessageSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckMessageSent struct { + IncomingMessageId [32]byte + ACKMessageId [32]byte + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPReceiverWithAckMessageSentIterator, error) { + + var incomingMessageIdRule []interface{} + for _, incomingMessageIdItem := range incomingMessageId { + incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + } + var ACKMessageIdRule []interface{} + for _, ACKMessageIdItem := range ACKMessageId { + ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckMessageSentIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageSent", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) { + + var incomingMessageIdRule []interface{} + for _, incomingMessageIdItem := range incomingMessageId { + incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + } + var ACKMessageIdRule []interface{} + for _, ACKMessageIdItem := range ACKMessageId { + ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverWithAckMessageSent) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageSent", 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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageSent(log types.Log) (*CCIPReceiverWithAckMessageSent, error) { + event := new(CCIPReceiverWithAckMessageSent) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverWithAckMessageSucceededIterator struct { + Event *CCIPReceiverWithAckMessageSucceeded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckMessageSucceededIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckMessageSucceeded) + 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(CCIPReceiverWithAckMessageSucceeded) + 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 *CCIPReceiverWithAckMessageSucceededIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckMessageSucceededIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckMessageSucceeded struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageSucceededIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckMessageSucceededIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageSucceeded, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverWithAckMessageSucceeded) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageSucceeded", 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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageSucceeded(log types.Log) (*CCIPReceiverWithAckMessageSucceeded, error) { + event := new(CCIPReceiverWithAckMessageSucceeded) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverWithAckOwnershipTransferRequestedIterator struct { + Event *CCIPReceiverWithAckOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckOwnershipTransferRequested) + 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(CCIPReceiverWithAckOwnershipTransferRequested) + 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 *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverWithAckOwnershipTransferRequestedIterator, 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 := _CCIPReceiverWithAck.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckOwnershipTransferRequestedIterator{contract: _CCIPReceiverWithAck.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckOwnershipTransferRequested, 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 := _CCIPReceiverWithAck.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(CCIPReceiverWithAckOwnershipTransferRequested) + if err := _CCIPReceiverWithAck.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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPReceiverWithAckOwnershipTransferRequested, error) { + event := new(CCIPReceiverWithAckOwnershipTransferRequested) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverWithAckOwnershipTransferredIterator struct { + Event *CCIPReceiverWithAckOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithAckOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithAckOwnershipTransferred) + 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(CCIPReceiverWithAckOwnershipTransferred) + 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 *CCIPReceiverWithAckOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithAckOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithAckOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverWithAckOwnershipTransferredIterator, 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 := _CCIPReceiverWithAck.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPReceiverWithAckOwnershipTransferredIterator{contract: _CCIPReceiverWithAck.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckOwnershipTransferred, 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 := _CCIPReceiverWithAck.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(CCIPReceiverWithAckOwnershipTransferred) + if err := _CCIPReceiverWithAck.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 (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPReceiverWithAckOwnershipTransferred, error) { + event := new(CCIPReceiverWithAckOwnershipTransferred) + if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChains struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAck) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPReceiverWithAck.abi.Events["FeeTokenModified"].ID: + return _CCIPReceiverWithAck.ParseFeeTokenModified(log) + case _CCIPReceiverWithAck.abi.Events["MessageAckReceived"].ID: + return _CCIPReceiverWithAck.ParseMessageAckReceived(log) + case _CCIPReceiverWithAck.abi.Events["MessageAckSent"].ID: + return _CCIPReceiverWithAck.ParseMessageAckSent(log) + case _CCIPReceiverWithAck.abi.Events["MessageFailed"].ID: + return _CCIPReceiverWithAck.ParseMessageFailed(log) + case _CCIPReceiverWithAck.abi.Events["MessageRecovered"].ID: + return _CCIPReceiverWithAck.ParseMessageRecovered(log) + case _CCIPReceiverWithAck.abi.Events["MessageSent"].ID: + return _CCIPReceiverWithAck.ParseMessageSent(log) + case _CCIPReceiverWithAck.abi.Events["MessageSucceeded"].ID: + return _CCIPReceiverWithAck.ParseMessageSucceeded(log) + case _CCIPReceiverWithAck.abi.Events["OwnershipTransferRequested"].ID: + return _CCIPReceiverWithAck.ParseOwnershipTransferRequested(log) + case _CCIPReceiverWithAck.abi.Events["OwnershipTransferred"].ID: + return _CCIPReceiverWithAck.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPReceiverWithAckFeeTokenModified) Topic() common.Hash { + return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") +} + +func (CCIPReceiverWithAckMessageAckReceived) Topic() common.Hash { + return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") +} + +func (CCIPReceiverWithAckMessageAckSent) Topic() common.Hash { + return common.HexToHash("0x75944f95ba0be568cb30faeb0ef135cb73d07006939da29722d670a97f5c5b26") +} + +func (CCIPReceiverWithAckMessageFailed) Topic() common.Hash { + return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") +} + +func (CCIPReceiverWithAckMessageRecovered) Topic() common.Hash { + return common.HexToHash("0xef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad") +} + +func (CCIPReceiverWithAckMessageSent) Topic() common.Hash { + return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") +} + +func (CCIPReceiverWithAckMessageSucceeded) Topic() common.Hash { + return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +} + +func (CCIPReceiverWithAckOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (CCIPReceiverWithAckOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_CCIPReceiverWithAck *CCIPReceiverWithAck) Address() common.Address { + return _CCIPReceiverWithAck.address +} + +type CCIPReceiverWithAckInterface interface { + ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) + + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) + + GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) + + SFeeToken(opts *bind.CallOpts) (common.Address, error) + + SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + + EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + + ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + + SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + + WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) + + WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) + + Receive(opts *bind.TransactOpts) (*types.Transaction, error) + + FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPReceiverWithAckFeeTokenModifiedIterator, error) + + WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + + ParseFeeTokenModified(log types.Log) (*CCIPReceiverWithAckFeeTokenModified, error) + + FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPReceiverWithAckMessageAckReceivedIterator, error) + + WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageAckReceived) (event.Subscription, error) + + ParseMessageAckReceived(log types.Log) (*CCIPReceiverWithAckMessageAckReceived, error) + + FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPReceiverWithAckMessageAckSentIterator, error) + + WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageAckSent) (event.Subscription, error) + + ParseMessageAckSent(log types.Log) (*CCIPReceiverWithAckMessageAckSent, error) + + FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageFailedIterator, error) + + WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageFailed, messageId [][32]byte) (event.Subscription, error) + + ParseMessageFailed(log types.Log) (*CCIPReceiverWithAckMessageFailed, error) + + FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageRecoveredIterator, error) + + WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageRecovered, messageId [][32]byte) (event.Subscription, error) + + ParseMessageRecovered(log types.Log) (*CCIPReceiverWithAckMessageRecovered, error) + + FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPReceiverWithAckMessageSentIterator, error) + + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + + ParseMessageSent(log types.Log) (*CCIPReceiverWithAckMessageSent, error) + + FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageSucceededIterator, error) + + WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageSucceeded, messageId [][32]byte) (event.Subscription, error) + + ParseMessageSucceeded(log types.Log) (*CCIPReceiverWithAckMessageSucceeded, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverWithAckOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*CCIPReceiverWithAckOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverWithAckOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*CCIPReceiverWithAckOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go new file mode 100644 index 0000000000..8a680436d9 --- /dev/null +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -0,0 +1,1029 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccipSender + +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 ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type ICCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + +var CCIPSenderMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002467380380620024678339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051612247620002206000396000818161027201528181610ab901528181610c2601528181610d4401528181610e0801528181610ec00152610f5b01526122476000f3fe6080604052600436106100ca5760003560e01c806379ba509711610079578063b0f479a111610056578063b0f479a114610263578063d8469e4014610296578063effde240146102b6578063f2fde38b146102d757005b806379ba5097146101e25780638462a2b9146101f75780638da5cb5b1461021757005b8063536c6bfa116100a7578063536c6bfa146101745780635dc5ebdb146101945780635e35359e146101c257005b80630e958d6b146100d3578063181f5a771461010857806341eade461461015457005b366100d157005b005b3480156100df57600080fd5b506100f36100ee3660046119ac565b6102f7565b60405190151581526020015b60405180910390f35b34801561011457600080fd5b50604080518082018252601481527f4343495053656e64657220312e302e302d646576000000000000000000000000602082015290516100ff9190611a6d565b34801561016057600080fd5b506100d161016f366004611a87565b610341565b34801561018057600080fd5b506100d161018f366004611ac4565b610380565b3480156101a057600080fd5b506101b46101af366004611a87565b610396565b6040516100ff929190611af0565b3480156101ce57600080fd5b506100d16101dd366004611b29565b6104c2565b3480156101ee57600080fd5b506100d16104eb565b34801561020357600080fd5b506100d1610212366004611baf565b6105ed565b34801561022357600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ff565b34801561026f57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061023e565b3480156102a257600080fd5b506100d16102b1366004611c1b565b6107ce565b6102c96102c4366004611c9c565b610830565b6040519081526020016100ff565b3480156102e357600080fd5b506100d16102f2366004611d5d565b61103d565b67ffffffffffffffff8316600090815260026020819052604080832090519101906103259085908590611d7a565b9081526040519081900360200190205460ff1690509392505050565b610349611051565b67ffffffffffffffff811660009081526002602052604081209061036d82826118f8565b61037b6001830160006118f8565b505050565b610388611051565b61039282826110d4565b5050565b6002602052600090815260409020805481906103b190611d8a565b80601f01602080910402602001604051908101604052809291908181526020018280546103dd90611d8a565b801561042a5780601f106103ff5761010080835404028352916020019161042a565b820191906000526020600020905b81548152906001019060200180831161040d57829003601f168201915b50505050509080600101805461043f90611d8a565b80601f016020809104026020016040519081016040528092919081815260200182805461046b90611d8a565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905082565b6104ca611051565b61037b73ffffffffffffffffffffffffffffffffffffffff8416838361122e565b60015473ffffffffffffffffffffffffffffffffffffffff163314610571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6105f5611051565b60005b818110156106d8576002600084848481811061061657610616611ddd565b90506020028101906106289190611e0c565b610636906020810190611a87565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061066d5761066d611ddd565b905060200281019061067f9190611e0c565b61068d906020810190611e4a565b60405161069b929190611d7a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556001016105f8565b5060005b838110156107c7576001600260008787858181106106fc576106fc611ddd565b905060200281019061070e9190611e0c565b61071c906020810190611a87565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061075357610753611ddd565b90506020028101906107659190611e0c565b610773906020810190611e4a565b604051610781929190611d7a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790556001016106dc565b5050505050565b6107d6611051565b67ffffffffffffffff851660009081526002602052604090206107fa848683611f26565b5080156107c75767ffffffffffffffff85166000908152600260205260409020600101610828828483611f26565b505050505050565b67ffffffffffffffff86166000908152600260205260408120805488919061085790611d8a565b905060000361089e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610568565b6040805160a08101825267ffffffffffffffff8a166000908152600260205291822080548291906108ce90611d8a565b80601f01602080910402602001604051908101604052809291908181526020018280546108fa90611d8a565b80156109475780601f1061091c57610100808354040283529160200191610947565b820191906000526020600020905b81548152906001019060200180831161092a57829003601f168201915b5050505050815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208d8102820181019092528c815293810193928d92508c9182919085015b828210156109d7576109c860408302860136819003810190612040565b815260200190600101906109ab565b505050505081526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600260008c67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610a3290611d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e90611d8a565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8b846040518363ffffffff1660e01b8152600401610b12929190612098565b602060405180830381865afa158015610b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5391906121ad565b905060005b88811015610da457610bc733308c8c85818110610b7757610b77611ddd565b905060400201602001358d8d86818110610b9357610b93611ddd565b610ba99260206040909202019081019150611d5d565b73ffffffffffffffffffffffffffffffffffffffff16929190611302565b8573ffffffffffffffffffffffffffffffffffffffff168a8a83818110610bf057610bf0611ddd565b610c069260206040909202019081019150611d5d565b73ffffffffffffffffffffffffffffffffffffffff1614610cab57610ca67f00000000000000000000000000000000000000000000000000000000000000008b8b84818110610c5757610c57611ddd565b905060400201602001358c8c85818110610c7357610c73611ddd565b610c899260206040909202019081019150611d5d565b73ffffffffffffffffffffffffffffffffffffffff169190611366565b610d9c565b8573ffffffffffffffffffffffffffffffffffffffff168a8a83818110610cd457610cd4611ddd565b610cea9260206040909202019081019150611d5d565b73ffffffffffffffffffffffffffffffffffffffff16148015610d22575073ffffffffffffffffffffffffffffffffffffffff861615155b15610d9c57610d3f3330848d8d86818110610b9357610b93611ddd565b610d9c7f0000000000000000000000000000000000000000000000000000000000000000838c8c85818110610d7657610d76611ddd565b90506040020160200135610d8a91906121c6565b8c8c85818110610c7357610c73611ddd565b600101610b58565b5073ffffffffffffffffffffffffffffffffffffffff851615801590610e7d57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116602483015286169063dd62ed3e90604401602060405180830381865afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7b91906121ad565b155b15610eea57610ea473ffffffffffffffffffffffffffffffffffffffff8616333084611302565b610ee573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000083611366565b610f44565b73ffffffffffffffffffffffffffffffffffffffff8516158015610f0d57508034105b15610f44576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990871615610f91576000610f93565b825b8c856040518463ffffffff1660e01b8152600401610fb2929190612098565b60206040518083038185885af1158015610fd0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ff591906121ad565b93507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8460405161102891815260200190565b60405180910390a15050509695505050505050565b611045611051565b61104e816114e8565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610568565b565b8047101561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610568565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611198576040519150601f19603f3d011682016040523d82523d6000602084013e61119d565b606091505b505090508061037b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610568565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261037b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526115dd565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526113609085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611280565b50505050565b80158061140657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140491906121ad565b155b611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610568565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261037b9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611280565b3373ffffffffffffffffffffffffffffffffffffffff821603611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610568565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061163f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166116e99092919063ffffffff16565b80519091501561037b578080602001905181019061165d9190612206565b61037b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610568565b60606116f88484600085611700565b949350505050565b606082471015611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610568565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516117bb9190612228565b60006040518083038185875af1925050503d80600081146117f8576040519150601f19603f3d011682016040523d82523d6000602084013e6117fd565b606091505b509150915061180e87838387611819565b979650505050505050565b606083156118af5782516000036118a85773ffffffffffffffffffffffffffffffffffffffff85163b6118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610568565b50816116f8565b6116f883838151156118c45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105689190611a6d565b50805461190490611d8a565b6000825580601f10611914575050565b601f01602090049060005260206000209081019061104e91905b80821115611942576000815560010161192e565b5090565b803567ffffffffffffffff8116811461195e57600080fd5b919050565b60008083601f84011261197557600080fd5b50813567ffffffffffffffff81111561198d57600080fd5b6020830191508360208285010111156119a557600080fd5b9250929050565b6000806000604084860312156119c157600080fd5b6119ca84611946565b9250602084013567ffffffffffffffff8111156119e657600080fd5b6119f286828701611963565b9497909650939450505050565b60005b83811015611a1a578181015183820152602001611a02565b50506000910152565b60008151808452611a3b8160208601602086016119ff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a806020830184611a23565b9392505050565b600060208284031215611a9957600080fd5b611a8082611946565b73ffffffffffffffffffffffffffffffffffffffff8116811461104e57600080fd5b60008060408385031215611ad757600080fd5b8235611ae281611aa2565b946020939093013593505050565b604081526000611b036040830185611a23565b8281036020840152611b158185611a23565b95945050505050565b803561195e81611aa2565b600080600060608486031215611b3e57600080fd5b8335611b4981611aa2565b92506020840135611b5981611aa2565b929592945050506040919091013590565b60008083601f840112611b7c57600080fd5b50813567ffffffffffffffff811115611b9457600080fd5b6020830191508360208260051b85010111156119a557600080fd5b60008060008060408587031215611bc557600080fd5b843567ffffffffffffffff80821115611bdd57600080fd5b611be988838901611b6a565b90965094506020870135915080821115611c0257600080fd5b50611c0f87828801611b6a565b95989497509550505050565b600080600080600060608688031215611c3357600080fd5b611c3c86611946565b9450602086013567ffffffffffffffff80821115611c5957600080fd5b611c6589838a01611963565b90965094506040880135915080821115611c7e57600080fd5b50611c8b88828901611963565b969995985093965092949392505050565b60008060008060008060808789031215611cb557600080fd5b611cbe87611946565b9550602087013567ffffffffffffffff80821115611cdb57600080fd5b818901915089601f830112611cef57600080fd5b813581811115611cfe57600080fd5b8a60208260061b8501011115611d1357600080fd5b602083019750809650506040890135915080821115611d3157600080fd5b50611d3e89828a01611963565b9094509250611d51905060608801611b1e565b90509295509295509295565b600060208284031215611d6f57600080fd5b8135611a8081611aa2565b8183823760009101908152919050565b600181811c90821680611d9e57607f821691505b602082108103611dd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611e4057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e7f57600080fd5b83018035915067ffffffffffffffff821115611e9a57600080fd5b6020019150368190038213156119a557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561037b576000816000526020600020601f850160051c81016020861015611f075750805b601f850160051c820191505b8181101561082857828155600101611f13565b67ffffffffffffffff831115611f3e57611f3e611eaf565b611f5283611f4c8354611d8a565b83611ede565b6000601f841160018114611fa45760008515611f6e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556107c7565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611ff35786850135825560209485019460019092019101611fd3565b508682101561202e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60006040828403121561205257600080fd5b6040516040810181811067ffffffffffffffff8211171561207557612075611eaf565b604052823561208381611aa2565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526120c760e0860182611a23565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526121028383611a23565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612163578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190612124565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a0152955061219f8187611a23565b9a9950505050505050505050565b6000602082840312156121bf57600080fd5b5051919050565b80820180821115612200577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561221857600080fd5b81518015158114611a8057600080fd5b60008251611e408184602087016119ff56fea164736f6c6343000818000a", +} + +var CCIPSenderABI = CCIPSenderMetaData.ABI + +var CCIPSenderBin = CCIPSenderMetaData.Bin + +func DeployCCIPSender(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address) (common.Address, *types.Transaction, *CCIPSender, error) { + parsed, err := CCIPSenderMetaData.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(CCIPSenderBin), backend, router) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CCIPSender{address: address, abi: *parsed, CCIPSenderCaller: CCIPSenderCaller{contract: contract}, CCIPSenderTransactor: CCIPSenderTransactor{contract: contract}, CCIPSenderFilterer: CCIPSenderFilterer{contract: contract}}, nil +} + +type CCIPSender struct { + address common.Address + abi abi.ABI + CCIPSenderCaller + CCIPSenderTransactor + CCIPSenderFilterer +} + +type CCIPSenderCaller struct { + contract *bind.BoundContract +} + +type CCIPSenderTransactor struct { + contract *bind.BoundContract +} + +type CCIPSenderFilterer struct { + contract *bind.BoundContract +} + +type CCIPSenderSession struct { + Contract *CCIPSender + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type CCIPSenderCallerSession struct { + Contract *CCIPSenderCaller + CallOpts bind.CallOpts +} + +type CCIPSenderTransactorSession struct { + Contract *CCIPSenderTransactor + TransactOpts bind.TransactOpts +} + +type CCIPSenderRaw struct { + Contract *CCIPSender +} + +type CCIPSenderCallerRaw struct { + Contract *CCIPSenderCaller +} + +type CCIPSenderTransactorRaw struct { + Contract *CCIPSenderTransactor +} + +func NewCCIPSender(address common.Address, backend bind.ContractBackend) (*CCIPSender, error) { + abi, err := abi.JSON(strings.NewReader(CCIPSenderABI)) + if err != nil { + return nil, err + } + contract, err := bindCCIPSender(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CCIPSender{address: address, abi: abi, CCIPSenderCaller: CCIPSenderCaller{contract: contract}, CCIPSenderTransactor: CCIPSenderTransactor{contract: contract}, CCIPSenderFilterer: CCIPSenderFilterer{contract: contract}}, nil +} + +func NewCCIPSenderCaller(address common.Address, caller bind.ContractCaller) (*CCIPSenderCaller, error) { + contract, err := bindCCIPSender(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CCIPSenderCaller{contract: contract}, nil +} + +func NewCCIPSenderTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPSenderTransactor, error) { + contract, err := bindCCIPSender(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CCIPSenderTransactor{contract: contract}, nil +} + +func NewCCIPSenderFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPSenderFilterer, error) { + contract, err := bindCCIPSender(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CCIPSenderFilterer{contract: contract}, nil +} + +func bindCCIPSender(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CCIPSenderMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_CCIPSender *CCIPSenderRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPSender.Contract.CCIPSenderCaller.contract.Call(opts, result, method, params...) +} + +func (_CCIPSender *CCIPSenderRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPSender.Contract.CCIPSenderTransactor.contract.Transfer(opts) +} + +func (_CCIPSender *CCIPSenderRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPSender.Contract.CCIPSenderTransactor.contract.Transact(opts, method, params...) +} + +func (_CCIPSender *CCIPSenderCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPSender.Contract.contract.Call(opts, result, method, params...) +} + +func (_CCIPSender *CCIPSenderTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPSender.Contract.contract.Transfer(opts) +} + +func (_CCIPSender *CCIPSenderTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPSender.Contract.contract.Transact(opts, method, params...) +} + +func (_CCIPSender *CCIPSenderCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPSender.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 (_CCIPSender *CCIPSenderSession) GetRouter() (common.Address, error) { + return _CCIPSender.Contract.GetRouter(&_CCIPSender.CallOpts) +} + +func (_CCIPSender *CCIPSenderCallerSession) GetRouter() (common.Address, error) { + return _CCIPSender.Contract.GetRouter(&_CCIPSender.CallOpts) +} + +func (_CCIPSender *CCIPSenderCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { + var out []interface{} + err := _CCIPSender.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPSender *CCIPSenderSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPSender.Contract.IsApprovedSender(&_CCIPSender.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPSender *CCIPSenderCallerSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPSender.Contract.IsApprovedSender(&_CCIPSender.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPSender *CCIPSenderCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPSender.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 (_CCIPSender *CCIPSenderSession) Owner() (common.Address, error) { + return _CCIPSender.Contract.Owner(&_CCIPSender.CallOpts) +} + +func (_CCIPSender *CCIPSenderCallerSession) Owner() (common.Address, error) { + return _CCIPSender.Contract.Owner(&_CCIPSender.CallOpts) +} + +func (_CCIPSender *CCIPSenderCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) { + var out []interface{} + err := _CCIPSender.contract.Call(opts, &out, "s_chains", arg0) + + outstruct := new(SChains) + if err != nil { + return *outstruct, err + } + + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + + return *outstruct, err + +} + +func (_CCIPSender *CCIPSenderSession) SChains(arg0 uint64) (SChains, + + error) { + return _CCIPSender.Contract.SChains(&_CCIPSender.CallOpts, arg0) +} + +func (_CCIPSender *CCIPSenderCallerSession) SChains(arg0 uint64) (SChains, + + error) { + return _CCIPSender.Contract.SChains(&_CCIPSender.CallOpts, arg0) +} + +func (_CCIPSender *CCIPSenderCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _CCIPSender.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_CCIPSender *CCIPSenderSession) TypeAndVersion() (string, error) { + return _CCIPSender.Contract.TypeAndVersion(&_CCIPSender.CallOpts) +} + +func (_CCIPSender *CCIPSenderCallerSession) TypeAndVersion() (string, error) { + return _CCIPSender.Contract.TypeAndVersion(&_CCIPSender.CallOpts) +} + +func (_CCIPSender *CCIPSenderTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "acceptOwnership") +} + +func (_CCIPSender *CCIPSenderSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPSender.Contract.AcceptOwnership(&_CCIPSender.TransactOpts) +} + +func (_CCIPSender *CCIPSenderTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPSender.Contract.AcceptOwnership(&_CCIPSender.TransactOpts) +} + +func (_CCIPSender *CCIPSenderTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data, feeToken) +} + +func (_CCIPSender *CCIPSenderSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _CCIPSender.Contract.CcipSend(&_CCIPSender.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +} + +func (_CCIPSender *CCIPSenderTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _CCIPSender.Contract.CcipSend(&_CCIPSender.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +} + +func (_CCIPSender *CCIPSenderTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "disableChain", chainSelector) +} + +func (_CCIPSender *CCIPSenderSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _CCIPSender.Contract.DisableChain(&_CCIPSender.TransactOpts, chainSelector) +} + +func (_CCIPSender *CCIPSenderTransactorSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _CCIPSender.Contract.DisableChain(&_CCIPSender.TransactOpts, chainSelector) +} + +func (_CCIPSender *CCIPSenderTransactor) EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "enableChain", chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPSender *CCIPSenderSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPSender.Contract.EnableChain(&_CCIPSender.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPSender *CCIPSenderTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _CCIPSender.Contract.EnableChain(&_CCIPSender.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_CCIPSender *CCIPSenderTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "transferOwnership", to) +} + +func (_CCIPSender *CCIPSenderSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPSender.Contract.TransferOwnership(&_CCIPSender.TransactOpts, to) +} + +func (_CCIPSender *CCIPSenderTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPSender.Contract.TransferOwnership(&_CCIPSender.TransactOpts, to) +} + +func (_CCIPSender *CCIPSenderTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_CCIPSender *CCIPSenderSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPSender.Contract.UpdateApprovedSenders(&_CCIPSender.TransactOpts, adds, removes) +} + +func (_CCIPSender *CCIPSenderTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPSender.Contract.UpdateApprovedSenders(&_CCIPSender.TransactOpts, adds, removes) +} + +func (_CCIPSender *CCIPSenderTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "withdrawNativeToken", to, amount) +} + +func (_CCIPSender *CCIPSenderSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPSender.Contract.WithdrawNativeToken(&_CCIPSender.TransactOpts, to, amount) +} + +func (_CCIPSender *CCIPSenderTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPSender.Contract.WithdrawNativeToken(&_CCIPSender.TransactOpts, to, amount) +} + +func (_CCIPSender *CCIPSenderTransactor) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "withdrawTokens", token, to, amount) +} + +func (_CCIPSender *CCIPSenderSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPSender.Contract.WithdrawTokens(&_CCIPSender.TransactOpts, token, to, amount) +} + +func (_CCIPSender *CCIPSenderTransactorSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPSender.Contract.WithdrawTokens(&_CCIPSender.TransactOpts, token, to, amount) +} + +func (_CCIPSender *CCIPSenderTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _CCIPSender.contract.RawTransact(opts, calldata) +} + +func (_CCIPSender *CCIPSenderSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _CCIPSender.Contract.Fallback(&_CCIPSender.TransactOpts, calldata) +} + +func (_CCIPSender *CCIPSenderTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _CCIPSender.Contract.Fallback(&_CCIPSender.TransactOpts, calldata) +} + +func (_CCIPSender *CCIPSenderTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPSender.contract.RawTransact(opts, nil) +} + +func (_CCIPSender *CCIPSenderSession) Receive() (*types.Transaction, error) { + return _CCIPSender.Contract.Receive(&_CCIPSender.TransactOpts) +} + +func (_CCIPSender *CCIPSenderTransactorSession) Receive() (*types.Transaction, error) { + return _CCIPSender.Contract.Receive(&_CCIPSender.TransactOpts) +} + +type CCIPSenderMessageReceivedIterator struct { + Event *CCIPSenderMessageReceived + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPSenderMessageReceivedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPSenderMessageReceived) + 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(CCIPSenderMessageReceived) + 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 *CCIPSenderMessageReceivedIterator) Error() error { + return it.fail +} + +func (it *CCIPSenderMessageReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPSenderMessageReceived struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPSender *CCIPSenderFilterer) FilterMessageReceived(opts *bind.FilterOpts) (*CCIPSenderMessageReceivedIterator, error) { + + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "MessageReceived") + if err != nil { + return nil, err + } + return &CCIPSenderMessageReceivedIterator{contract: _CCIPSender.contract, event: "MessageReceived", logs: logs, sub: sub}, nil +} + +func (_CCIPSender *CCIPSenderFilterer) WatchMessageReceived(opts *bind.WatchOpts, sink chan<- *CCIPSenderMessageReceived) (event.Subscription, error) { + + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "MessageReceived") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPSenderMessageReceived) + if err := _CCIPSender.contract.UnpackLog(event, "MessageReceived", 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 (_CCIPSender *CCIPSenderFilterer) ParseMessageReceived(log types.Log) (*CCIPSenderMessageReceived, error) { + event := new(CCIPSenderMessageReceived) + if err := _CCIPSender.contract.UnpackLog(event, "MessageReceived", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPSenderMessageSentIterator struct { + Event *CCIPSenderMessageSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPSenderMessageSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPSenderMessageSent) + 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(CCIPSenderMessageSent) + 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 *CCIPSenderMessageSentIterator) Error() error { + return it.fail +} + +func (it *CCIPSenderMessageSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPSenderMessageSent struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPSender *CCIPSenderFilterer) FilterMessageSent(opts *bind.FilterOpts) (*CCIPSenderMessageSentIterator, error) { + + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "MessageSent") + if err != nil { + return nil, err + } + return &CCIPSenderMessageSentIterator{contract: _CCIPSender.contract, event: "MessageSent", logs: logs, sub: sub}, nil +} + +func (_CCIPSender *CCIPSenderFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPSenderMessageSent) (event.Subscription, error) { + + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "MessageSent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPSenderMessageSent) + if err := _CCIPSender.contract.UnpackLog(event, "MessageSent", 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 (_CCIPSender *CCIPSenderFilterer) ParseMessageSent(log types.Log) (*CCIPSenderMessageSent, error) { + event := new(CCIPSenderMessageSent) + if err := _CCIPSender.contract.UnpackLog(event, "MessageSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPSenderOwnershipTransferRequestedIterator struct { + Event *CCIPSenderOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPSenderOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPSenderOwnershipTransferRequested) + 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(CCIPSenderOwnershipTransferRequested) + 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 *CCIPSenderOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *CCIPSenderOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPSenderOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPSender *CCIPSenderFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPSenderOwnershipTransferRequestedIterator, 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 := _CCIPSender.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPSenderOwnershipTransferRequestedIterator{contract: _CCIPSender.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_CCIPSender *CCIPSenderFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPSenderOwnershipTransferRequested, 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 := _CCIPSender.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(CCIPSenderOwnershipTransferRequested) + if err := _CCIPSender.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 (_CCIPSender *CCIPSenderFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPSenderOwnershipTransferRequested, error) { + event := new(CCIPSenderOwnershipTransferRequested) + if err := _CCIPSender.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPSenderOwnershipTransferredIterator struct { + Event *CCIPSenderOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPSenderOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPSenderOwnershipTransferred) + 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(CCIPSenderOwnershipTransferred) + 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 *CCIPSenderOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *CCIPSenderOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPSenderOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPSender *CCIPSenderFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPSenderOwnershipTransferredIterator, 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 := _CCIPSender.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPSenderOwnershipTransferredIterator{contract: _CCIPSender.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_CCIPSender *CCIPSenderFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPSenderOwnershipTransferred, 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 := _CCIPSender.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(CCIPSenderOwnershipTransferred) + if err := _CCIPSender.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 (_CCIPSender *CCIPSenderFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPSenderOwnershipTransferred, error) { + event := new(CCIPSenderOwnershipTransferred) + if err := _CCIPSender.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChains struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_CCIPSender *CCIPSender) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPSender.abi.Events["MessageReceived"].ID: + return _CCIPSender.ParseMessageReceived(log) + case _CCIPSender.abi.Events["MessageSent"].ID: + return _CCIPSender.ParseMessageSent(log) + case _CCIPSender.abi.Events["OwnershipTransferRequested"].ID: + return _CCIPSender.ParseOwnershipTransferRequested(log) + case _CCIPSender.abi.Events["OwnershipTransferred"].ID: + return _CCIPSender.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPSenderMessageReceived) Topic() common.Hash { + return common.HexToHash("0xe29dc34207c78fc0f6048a32f159139c33339c6d6df8b07dcd33f6d699ff2327") +} + +func (CCIPSenderMessageSent) Topic() common.Hash { + return common.HexToHash("0x54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a") +} + +func (CCIPSenderOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (CCIPSenderOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_CCIPSender *CCIPSender) Address() common.Address { + return _CCIPSender.address +} + +type CCIPSenderInterface interface { + GetRouter(opts *bind.CallOpts) (common.Address, error) + + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) + + DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + + EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + + WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) + + WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) + + Receive(opts *bind.TransactOpts) (*types.Transaction, error) + + FilterMessageReceived(opts *bind.FilterOpts) (*CCIPSenderMessageReceivedIterator, error) + + WatchMessageReceived(opts *bind.WatchOpts, sink chan<- *CCIPSenderMessageReceived) (event.Subscription, error) + + ParseMessageReceived(log types.Log) (*CCIPSenderMessageReceived, error) + + FilterMessageSent(opts *bind.FilterOpts) (*CCIPSenderMessageSentIterator, error) + + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPSenderMessageSent) (event.Subscription, error) + + ParseMessageSent(log types.Log) (*CCIPSenderMessageSent, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPSenderOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPSenderOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*CCIPSenderOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPSenderOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPSenderOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*CCIPSenderOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index 4387dd3080..f12b84a906 100644 --- a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go +++ b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go @@ -43,9 +43,14 @@ type ClientEVMTokenAmount struct { Amount *big.Int } +type ICCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + var PingPongDemoMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620013d8380380620013d8833981016040819052620000349162000263565b33806000846001600160a01b03811662000069576040516335fdcccd60e21b8152600060048201526024015b60405180910390fd5b6001600160a01b039081166080528216620000c75760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f0000000000000000604482015260640162000060565b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000fa57620000fa816200019f565b50506002805460ff60a01b1916905550600380546001600160a01b0319166001600160a01b0383811691821790925560405163095ea7b360e01b8152918416600483015260001960248301529063095ea7b3906044016020604051808303816000875af115801562000170573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001969190620002a2565b505050620002cd565b336001600160a01b03821603620001f95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000060565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b03811681146200026057600080fd5b50565b600080604083850312156200027757600080fd5b825162000284816200024a565b602084015190925062000297816200024a565b809150509250929050565b600060208284031215620002b557600080fd5b81518015158114620002c657600080fd5b9392505050565b6080516110e1620002f7600039600081816102290152818161058e01526108f201526110e16000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063b5a1101111610066578063b5a1101114610270578063bee518a414610283578063ca709a25146102c1578063f2fde38b146102df57600080fd5b80638da5cb5b146101f65780639d2aede514610214578063b0f479a114610227578063b187bd261461024d57600080fd5b80632874d8bf116100d35780632874d8bf146101945780632b6e5d631461019c57806379ba5097146101db57806385572ffb146101e357600080fd5b806301ffc9a71461010557806316c38b3c1461012d578063181f5a77146101425780631892b90614610181575b600080fd5b610118610113366004610af5565b6102f2565b60405190151581526020015b60405180910390f35b61014061013b366004610b3e565b61038b565b005b604080518082018252601281527f50696e67506f6e6744656d6f20312e322e300000000000000000000000000000602082015290516101249190610bc4565b61014061018f366004610bf4565b6103dd565b610140610438565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b610140610474565b6101406101f1366004610c0f565b610576565b60005473ffffffffffffffffffffffffffffffffffffffff166101b6565b610140610222366004610c6e565b6105fb565b7f00000000000000000000000000000000000000000000000000000000000000006101b6565b60025474010000000000000000000000000000000000000000900460ff16610118565b61014061027e366004610c89565b61064a565b60015474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff9091168152602001610124565b60035473ffffffffffffffffffffffffffffffffffffffff166101b6565b6101406102ed366004610c6e565b6106ec565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb00000000000000000000000000000000000000000000000000000000148061038557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6103936106fd565b6002805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6103e56106fd565b6001805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6104406106fd565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055610472600161077e565b565b60015473ffffffffffffffffffffffffffffffffffffffff1633146104fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105e7576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016104f1565b6105f86105f382610ebf565b6109aa565b50565b6106036106fd565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6106526106fd565b6001805467ffffffffffffffff90931674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909316929092179091556002805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055565b6106f46106fd565b6105f881610a00565b60005473ffffffffffffffffffffffffffffffffffffffff163314610472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016104f1565b806001166001036107c1576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16107f5565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161080a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815260a08301825260025473ffffffffffffffffffffffffffffffffffffffff1660c0808501919091528251808503909101815260e084018352835260208084018290528251600080825291810184529194509291820190836108b8565b60408051808201909152600080825260208201528152602001906001900390816108915790505b50815260035473ffffffffffffffffffffffffffffffffffffffff16602080830191909152604080519182018152600082529091015290507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600160149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401610961929190610f6c565b6020604051808303816000875af1158015610980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a49190611081565b50505050565b600081606001518060200190518101906109c49190611081565b60025490915074010000000000000000000000000000000000000000900460ff166109fc576109fc6109f782600161109a565b61077e565b5050565b3373ffffffffffffffffffffffffffffffffffffffff821603610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016104f1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215610b0757600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610b3757600080fd5b9392505050565b600060208284031215610b5057600080fd5b81358015158114610b3757600080fd5b6000815180845260005b81811015610b8657602081850181015186830182015201610b6a565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b376020830184610b60565b803567ffffffffffffffff81168114610bef57600080fd5b919050565b600060208284031215610c0657600080fd5b610b3782610bd7565b600060208284031215610c2157600080fd5b813567ffffffffffffffff811115610c3857600080fd5b820160a08185031215610b3757600080fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610bef57600080fd5b600060208284031215610c8057600080fd5b610b3782610c4a565b60008060408385031215610c9c57600080fd5b610ca583610bd7565b9150610cb360208401610c4a565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610d0e57610d0e610cbc565b60405290565b60405160a0810167ffffffffffffffff81118282101715610d0e57610d0e610cbc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610d7e57610d7e610cbc565b604052919050565b600082601f830112610d9757600080fd5b813567ffffffffffffffff811115610db157610db1610cbc565b610de260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610d37565b818152846020838601011115610df757600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112610e2557600080fd5b8135602067ffffffffffffffff821115610e4157610e41610cbc565b610e4f818360051b01610d37565b82815260069290921b84018101918181019086841115610e6e57600080fd5b8286015b84811015610eb45760408189031215610e8b5760008081fd5b610e93610ceb565b610e9c82610c4a565b81528185013585820152835291830191604001610e72565b509695505050505050565b600060a08236031215610ed157600080fd5b610ed9610d14565b82358152610ee960208401610bd7565b6020820152604083013567ffffffffffffffff80821115610f0957600080fd5b610f1536838701610d86565b60408401526060850135915080821115610f2e57600080fd5b610f3a36838701610d86565b60608401526080850135915080821115610f5357600080fd5b50610f6036828601610e14565b60808301525092915050565b6000604067ffffffffffffffff851683526020604081850152845160a06040860152610f9b60e0860182610b60565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878403016060880152610fd68383610b60565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611037578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190610ff8565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506110738187610b60565b9a9950505050505050505050565b60006020828403121561109357600080fd5b5051919050565b80820180821115610385577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMagicBytes\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACKMESSAGEMAGICBYTES\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620046b6380380620046b68339810160408190526200003491620005cc565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000144565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013857620001386001600160a01b03821683600019620001ef565b505050505050620006c9565b336001600160a01b038216036200019e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200026d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026b91906200060b565b155b620002e15760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003399185916200033e16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200038d906001600160a01b0385169084906200040f565b805190915015620003395780806020019051810190620003ae919062000625565b620003395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b606062000420848460008562000428565b949350505050565b6060824710156200048b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004a9919062000676565b60006040518083038185875af1925050503d8060008114620004e8576040519150601f19603f3d011682016040523d82523d6000602084013e620004ed565b606091505b50909250905062000501878383876200050c565b979650505050505050565b606083156200058057825160000362000578576001600160a01b0385163b620005785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b508162000420565b620004208383815115620005975781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000694565b6001600160a01b0381168114620005c957600080fd5b50565b60008060408385031215620005e057600080fd5b8251620005ed81620005b3565b60208401519092506200060081620005b3565b809150509250929050565b6000602082840312156200061e57600080fd5b5051919050565b6000602082840312156200063857600080fd5b815180151581146200064957600080fd5b9392505050565b60005b838110156200066d57818101518382015260200162000653565b50506000910152565b600082516200068a81846020870162000650565b9190910192915050565b6020815260008251806020840152620006b581604085016020870162000650565b601f01601f19169190910160400192915050565b608051613fa76200070f6000396000818161056001528181610744015281816107e20152818161107901528181611c3201528181611e05015261201b0152613fa76000f3fe6080604052600436106101c45760003560e01c80636939cd97116100f6578063b5a110111161008f578063e4ca875411610061578063e4ca875414610645578063effde24014610665578063f2fde38b14610678578063ff2deec31461069857005b8063b5a11011146105bc578063bee518a4146105dc578063cf6730f814610605578063d8469e401461062557005b80638da5cb5b116100c85780638da5cb5b146105065780639d2aede514610531578063b0f479a114610551578063b187bd261461058457005b80636939cd971461048457806379ba5097146104b15780638462a2b9146104c657806385572ffb146104e657005b80632b6e5d631161016857806352f813c31161013a57806352f813c3146103f6578063536c6bfa146104165780635dc5ebdb146104365780635e35359e1461046457005b80632b6e5d63146103075780633a51b79e1461035f57806341eade46146103a85780635075a9d4146103c857005b806316c38b3c116101a157806316c38b3c14610263578063181f5a77146102835780631892b906146102d25780632874d8bf146102f257005b806305bfe982146101cd5780630e958d6b1461021357806311e85dff1461024357005b366101cb57005b005b3480156101d957600080fd5b506101fd6101e8366004612e66565b60086020526000908152604090205460ff1681565b60405161020a9190612e7f565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004612f1f565b6106ca565b604051901515815260200161020a565b34801561024f57600080fd5b506101cb61025e366004612fa6565b610714565b34801561026f57600080fd5b506101cb61027e366004612fd1565b6108a4565b34801561028f57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161020a919061305c565b3480156102de57600080fd5b506101cb6102ed36600461306f565b6108fe565b3480156102fe57600080fd5b506101cb610941565b34801561031357600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020a565b34801561036b57600080fd5b506102c56040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103b457600080fd5b506101cb6103c336600461306f565b61097d565b3480156103d457600080fd5b506103e86103e3366004612e66565b6109bc565b60405190815260200161020a565b34801561040257600080fd5b506101cb610411366004612fd1565b6109cf565b34801561042257600080fd5b506101cb61043136600461308c565b610a08565b34801561044257600080fd5b5061045661045136600461306f565b610a1e565b60405161020a9291906130b8565b34801561047057600080fd5b506101cb61047f3660046130e6565b610b4a565b34801561049057600080fd5b506104a461049f366004612e66565b610b73565b60405161020a9190613184565b3480156104bd57600080fd5b506101cb610d7e565b3480156104d257600080fd5b506101cb6104e136600461325d565b610e80565b3480156104f257600080fd5b506101cb6105013660046132c9565b611061565b34801561051257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661033a565b34801561053d57600080fd5b506101cb61054c366004612fa6565b611351565b34801561055d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061033a565b34801561059057600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff16610233565b3480156105c857600080fd5b506101cb6105d7366004613304565b611408565b3480156105e857600080fd5b5060095460405167ffffffffffffffff909116815260200161020a565b34801561061157600080fd5b506101cb6106203660046132c9565b611578565b34801561063157600080fd5b506101cb61064036600461333d565b61174d565b34801561065157600080fd5b506101cb610660366004612e66565b6117af565b6103e86106733660046134f5565b611a2d565b34801561068457600080fd5b506101cb610693366004612fa6565b612125565b3480156106a457600080fd5b5060075461033a90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020819052604080832090519101906106f89085908590613613565b9081526040519081900360200190205460ff1690509392505050565b61071c612139565b600754610100900473ffffffffffffffffffffffffffffffffffffffff1615610789576107897f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff169060006121ba565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945592909104169015610846576108467f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6121ba565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ac612139565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b610906612139565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610949612139565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097b60016123ba565b565b610985612139565b67ffffffffffffffff81166000908152600260205260408120906109a98282612e18565b6109b7600183016000612e18565b505050565b60006109c96004836124e6565b92915050565b6109d7612139565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610a10612139565b610a1a82826124f9565b5050565b600260205260009081526040902080548190610a3990613623565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6590613623565b8015610ab25780601f10610a8757610100808354040283529160200191610ab2565b820191906000526020600020905b815481529060010190602001808311610a9557829003601f168201915b505050505090806001018054610ac790613623565b80601f0160208091040260200160405190810160405280929190818152602001828054610af390613623565b8015610b405780601f10610b1557610100808354040283529160200191610b40565b820191906000526020600020905b815481529060010190602001808311610b2357829003601f168201915b5050505050905082565b610b52612139565b6109b773ffffffffffffffffffffffffffffffffffffffff84168383612653565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610be290613623565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e90613623565b8015610c5b5780601f10610c3057610100808354040283529160200191610c5b565b820191906000526020600020905b815481529060010190602001808311610c3e57829003601f168201915b50505050508152602001600382018054610c7490613623565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca090613623565b8015610ced5780601f10610cc257610100808354040283529160200191610ced565b820191906000526020600020905b815481529060010190602001808311610cd057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d705760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d1b565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e88612139565b60005b81811015610f6b5760026000848484818110610ea957610ea9613676565b9050602002810190610ebb91906136a5565b610ec990602081019061306f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610f0057610f00613676565b9050602002810190610f1291906136a5565b610f209060208101906136e3565b604051610f2e929190613613565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610e8b565b5060005b8381101561105a57600160026000878785818110610f8f57610f8f613676565b9050602002810190610fa191906136a5565b610faf90602081019061306f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fe657610fe6613676565b9050602002810190610ff891906136a5565b6110069060208101906136e3565b604051611014929190613613565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610f6f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146110d2576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610dfb565b6110e2604082016020830161306f565b6110ef60408301836136e3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602081905260409182902091519101935061114c9250849150613748565b9081526040519081900360200190205460ff1661119757806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dfb919061305c565b6111a7604084016020850161306f565b67ffffffffffffffff8116600090815260026020526040902080546111cb90613623565b9050600003611212576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610dfb565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061124e90879060040161385c565b600060405180830381600087803b15801561126857600080fd5b505af1925050508015611279575060015b61131e573d8080156112a7576040519150601f19603f3d011682016040523d82523d6000602084013e6112ac565b606091505b506112be853560015b600491906126a9565b508435600090815260036020526040902085906112db8282613c2e565b50506040518535907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061131090849061305c565b60405180910390a25061134b565b6040518435907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b50505050565b611359612139565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522090610a1a9082613d28565b611410612139565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260208181526040928390208351918201949094526001939091019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526114cb91613748565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600260205220906109b79082613d28565b3330146115b1576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115c1604082016020830161306f565b6115ce60408301836136e3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602081905260409182902091519101935061162b9250849150613748565b9081526040519081900360200190205460ff1661167657806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dfb919061305c565b611686604084016020850161306f565b67ffffffffffffffff8116600090815260026020526040902080546116aa90613623565b90506000036116f1576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610dfb565b600061170060608601866136e3565b81019061170d9190612e66565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff1661105a5761105a611748826001613e42565b6123ba565b611755612139565b67ffffffffffffffff851660009081526002602052604090206117798486836139b2565b50801561105a5767ffffffffffffffff851660009081526002602052604090206001016117a78284836139b2565b505050505050565b6117b7612139565b60016117c46004836124e6565b146117fe576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610dfb565b6118098160006112b5565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161185190613623565b80601f016020809104026020016040519081016040528092919081815260200182805461187d90613623565b80156118ca5780601f1061189f576101008083540402835291602001916118ca565b820191906000526020600020905b8154815290600101906020018083116118ad57829003601f168201915b505050505081526020016003820180546118e390613623565b80601f016020809104026020016040519081016040528092919081815260200182805461190f90613623565b801561195c5780601f106119315761010080835404028352916020019161195c565b820191906000526020600020905b81548152906001019060200180831161193f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156119df5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161198a565b505050508152505090506119f2816126be565b6119fd600483612764565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff841660009081526002602052604081208054869190611a5490613623565b9050600003611a9b576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610dfb565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182208054829190611acb90613623565b80601f0160208091040260200160405190810160405280929190818152602001828054611af790613623565b8015611b445780601f10611b1957610100808354040283529160200191611b44565b820191906000526020600020905b815481529060010190602001808311611b2757829003601f168201915b505050505081526020018681526020018781526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600260008a67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054611bab90613623565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd790613623565b8015611c245780601f10611bf957610100808354040283529160200191611c24565b820191906000526020600020905b815481529060010190602001808311611c0757829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded89846040518363ffffffff1660e01b8152600401611c8b929190613e55565b602060405180830381865afa158015611ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccc9190613f22565b90506000805b8851811015611e8d57611d4233308b8481518110611cf257611cf2613676565b6020026020010151602001518c8581518110611d1057611d10613676565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612770909392919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff16898281518110611d6b57611d6b613676565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16148015611daf575073ffffffffffffffffffffffffffffffffffffffff871615155b8015611dda575060075473ffffffffffffffffffffffffffffffffffffffff88811661010090920416145b15611e005760019150611dfb3330858c8581518110611d1057611d10613676565b611e85565b611e857f00000000000000000000000000000000000000000000000000000000000000008a8381518110611e3657611e36613676565b6020026020010151602001518b8481518110611e5457611e54613676565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166121ba9092919063ffffffff16565b600101611cd2565b5080158015611ebb575060075473ffffffffffffffffffffffffffffffffffffffff87811661010090920416145b8015611edc575073ffffffffffffffffffffffffffffffffffffffff861615155b15611faa576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f719190613f22565b108015611f7e5750333014155b15611fa557611fa573ffffffffffffffffffffffffffffffffffffffff8716333085612770565b612004565b73ffffffffffffffffffffffffffffffffffffffff8616158015611fcd57508134105b15612004576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615612051576000612053565b835b8b866040518463ffffffff1660e01b8152600401612072929190613e55565b60206040518083038185885af1158015612090573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120b59190613f22565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a350505050949350505050565b61212d612139565b612136816127ce565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610dfb565b80158061225a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612234573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122589190613f22565b155b6122e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610dfb565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109b79084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526128c3565b806001166001036123fd576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612431565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161244691815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181526009546000808552602085019093529093506109b79267ffffffffffffffff909116916124c0565b60408051808201909152600080825260208201528152602001906001900390816124995790505b506007548490610100900473ffffffffffffffffffffffffffffffffffffffff16611a2d565b60006124f283836129cf565b9392505050565b80471015612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dfb565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146125bd576040519150601f19603f3d011682016040523d82523d6000602084013e6125c2565b606091505b50509050806109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dfb565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109b79084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612338565b60006126b6848484612a59565b949350505050565b60005b816080015151811015610a1a576000826080015182815181106126e6576126e6613676565b602002602001015160200151905060008360800151838151811061270c5761270c613676565b602002602001015160000151905061275a61273c60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff83169084612653565b50506001016126c1565b60006124f28383612a76565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261134b9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612338565b3373ffffffffffffffffffffffffffffffffffffffff82160361284d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610dfb565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612925826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a939092919063ffffffff16565b8051909150156109b757808060200190518101906129439190613f3b565b6109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dfb565b6000818152600283016020526040812054801515806129f357506129f38484612aa2565b6124f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610dfb565b600082815260028401602052604081208290556126b68484612aae565b600081815260028301602052604081208190556124f28383612aba565b60606126b68484600085612ac6565b60006124f28383612bdf565b60006124f28383612bf7565b60006124f28383612c46565b606082471015612b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dfb565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b819190613748565b60006040518083038185875af1925050503d8060008114612bbe576040519150601f19603f3d011682016040523d82523d6000602084013e612bc3565b606091505b5091509150612bd487838387612d39565b979650505050505050565b600081815260018301602052604081205415156124f2565b6000818152600183016020526040812054612c3e575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109c9565b5060006109c9565b60008181526001830160205260408120548015612d2f576000612c6a600183613f58565b8554909150600090612c7e90600190613f58565b9050818114612ce3576000866000018281548110612c9e57612c9e613676565b9060005260206000200154905080876000018481548110612cc157612cc1613676565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612cf457612cf4613f6b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109c9565b60009150506109c9565b60608315612dcf578251600003612dc85773ffffffffffffffffffffffffffffffffffffffff85163b612dc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dfb565b50816126b6565b6126b68383815115612de45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb919061305c565b508054612e2490613623565b6000825580601f10612e34575050565b601f01602090049060005260206000209081019061213691905b80821115612e625760008155600101612e4e565b5090565b600060208284031215612e7857600080fd5b5035919050565b6020810160038310612eba577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461213657600080fd5b60008083601f840112612ee857600080fd5b50813567ffffffffffffffff811115612f0057600080fd5b602083019150836020828501011115612f1857600080fd5b9250929050565b600080600060408486031215612f3457600080fd5b8335612f3f81612ec0565b9250602084013567ffffffffffffffff811115612f5b57600080fd5b612f6786828701612ed6565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461213657600080fd5b8035612fa181612f74565b919050565b600060208284031215612fb857600080fd5b81356124f281612f74565b801515811461213657600080fd5b600060208284031215612fe357600080fd5b81356124f281612fc3565b60005b83811015613009578181015183820152602001612ff1565b50506000910152565b6000815180845261302a816020860160208601612fee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006124f26020830184613012565b60006020828403121561308157600080fd5b81356124f281612ec0565b6000806040838503121561309f57600080fd5b82356130aa81612f74565b946020939093013593505050565b6040815260006130cb6040830185613012565b82810360208401526130dd8185613012565b95945050505050565b6000806000606084860312156130fb57600080fd5b833561310681612f74565b9250602084013561311681612f74565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613179578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161313c565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526131be60c0840182613012565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526131fa8383613012565b925060808601519150808584030160a0860152506130dd8282613127565b60008083601f84011261322a57600080fd5b50813567ffffffffffffffff81111561324257600080fd5b6020830191508360208260051b8501011115612f1857600080fd5b6000806000806040858703121561327357600080fd5b843567ffffffffffffffff8082111561328b57600080fd5b61329788838901613218565b909650945060208701359150808211156132b057600080fd5b506132bd87828801613218565b95989497509550505050565b6000602082840312156132db57600080fd5b813567ffffffffffffffff8111156132f257600080fd5b820160a081850312156124f257600080fd5b6000806040838503121561331757600080fd5b823561332281612ec0565b9150602083013561333281612f74565b809150509250929050565b60008060008060006060868803121561335557600080fd5b853561336081612ec0565b9450602086013567ffffffffffffffff8082111561337d57600080fd5b61338989838a01612ed6565b909650945060408801359150808211156133a257600080fd5b506133af88828901612ed6565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613412576134126133c0565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561345f5761345f6133c0565b604052919050565b600082601f83011261347857600080fd5b813567ffffffffffffffff811115613492576134926133c0565b6134c360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613418565b8181528460208386010111156134d857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561350b57600080fd5b843561351681612ec0565b935060208581013567ffffffffffffffff8082111561353457600080fd5b818801915088601f83011261354857600080fd5b81358181111561355a5761355a6133c0565b613568848260051b01613418565b81815260069190911b8301840190848101908b83111561358757600080fd5b938501935b828510156135d3576040858d0312156135a55760008081fd5b6135ad6133ef565b85356135b881612f74565b8152858701358782015282526040909401939085019061358c565b9750505060408801359250808311156135eb57600080fd5b50506135f987828801613467565b92505061360860608601612f96565b905092959194509250565b8183823760009101908152919050565b600181811c9082168061363757607f821691505b602082108103613670577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126136d957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261371857600080fd5b83018035915067ffffffffffffffff82111561373357600080fd5b602001915036819003821315612f1857600080fd5b600082516136d9818460208701612fee565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261378f57600080fd5b830160208101925035905067ffffffffffffffff8111156137af57600080fd5b803603821315612f1857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561317957813561382a81612f74565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613817565b60208152813560208201526000602083013561387781612ec0565b67ffffffffffffffff8082166040850152613895604086018661375a565b925060a060608601526138ac60c0860184836137be565b9250506138bc606086018661375a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526138f28583856137be565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261392b57600080fd5b6020928801928301923591508382111561394457600080fd5b8160061b360383131561395657600080fd5b8685030160a0870152612bd4848284613807565b601f8211156109b7576000816000526020600020601f850160051c810160208610156139935750805b601f850160051c820191505b818110156117a75782815560010161399f565b67ffffffffffffffff8311156139ca576139ca6133c0565b6139de836139d88354613623565b8361396a565b6000601f841160018114613a3057600085156139fa5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561105a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613a7f5786850135825560209485019460019092019101613a5f565b5086821015613aba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b0681612f74565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613b6c57613b6c6133c0565b805483825580841015613bf95760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613bad57613bad613acc565b8086168614613bbe57613bbe613acc565b5060008360005260206000208360011b81018760011b820191505b80821015613bf4578282558284830155600282019150613bd9565b505050505b5060008181526020812083915b858110156117a757613c188383613afb565b6040929092019160029190910190600101613c06565b81358155600181016020830135613c4481612ec0565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613c8460408601866136e3565b93509150613c968383600287016139b2565b613ca360608601866136e3565b93509150613cb58383600387016139b2565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613cec57600080fd5b918401918235915080821115613d0157600080fd5b506020820191508060061b3603821315613d1a57600080fd5b61134b818360048601613b53565b815167ffffffffffffffff811115613d4257613d426133c0565b613d5681613d508454613623565b8461396a565b602080601f831160018114613da95760008415613d735750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556117a7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613df657888601518255948401946001909101908401613dd7565b5085821015613e3257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156109c9576109c9613acc565b67ffffffffffffffff83168152604060208201526000825160a06040840152613e8160e0840182613012565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613ebd8383613012565b92506040860151915080858403016080860152613eda8383613127565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613f188282613012565b9695505050505050565b600060208284031215613f3457600080fd5b5051919050565b600060208284031215613f4d57600080fd5b81516124f281612fc3565b818103818111156109c9576109c9613acc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -184,6 +189,28 @@ func (_PingPongDemo *PingPongDemoTransactorRaw) Transact(opts *bind.TransactOpts return _PingPongDemo.Contract.contract.Transact(opts, method, params...) } +func (_PingPongDemo *PingPongDemoCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "ACKMESSAGEMAGICBYTES") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { + return _PingPongDemo.Contract.ACKMESSAGEMAGICBYTES(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { + return _PingPongDemo.Contract.ACKMESSAGEMAGICBYTES(&_PingPongDemo.CallOpts) +} + func (_PingPongDemo *PingPongDemoCaller) GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "getCounterpartAddress") @@ -228,26 +255,48 @@ func (_PingPongDemo *PingPongDemoCallerSession) GetCounterpartChainSelector() (u return _PingPongDemo.Contract.GetCounterpartChainSelector(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCaller) GetFeeToken(opts *bind.CallOpts) (common.Address, error) { +func (_PingPongDemo *PingPongDemoCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "getFeeToken") + err := _PingPongDemo.contract.Call(opts, &out, "getMessageContents", messageId) if err != nil { - return *new(common.Address), err + return *new(ClientAny2EVMMessage), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(ClientAny2EVMMessage)).(*ClientAny2EVMMessage) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _PingPongDemo.Contract.GetMessageContents(&_PingPongDemo.CallOpts, messageId) +} + +func (_PingPongDemo *PingPongDemoCallerSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _PingPongDemo.Contract.GetMessageContents(&_PingPongDemo.CallOpts, messageId) +} + +func (_PingPongDemo *PingPongDemoCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "getMessageStatus", messageId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err } -func (_PingPongDemo *PingPongDemoSession) GetFeeToken() (common.Address, error) { - return _PingPongDemo.Contract.GetFeeToken(&_PingPongDemo.CallOpts) +func (_PingPongDemo *PingPongDemoSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _PingPongDemo.Contract.GetMessageStatus(&_PingPongDemo.CallOpts, messageId) } -func (_PingPongDemo *PingPongDemoCallerSession) GetFeeToken() (common.Address, error) { - return _PingPongDemo.Contract.GetFeeToken(&_PingPongDemo.CallOpts) +func (_PingPongDemo *PingPongDemoCallerSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _PingPongDemo.Contract.GetMessageStatus(&_PingPongDemo.CallOpts, messageId) } func (_PingPongDemo *PingPongDemoCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { @@ -272,6 +321,28 @@ func (_PingPongDemo *PingPongDemoCallerSession) GetRouter() (common.Address, err return _PingPongDemo.Contract.GetRouter(&_PingPongDemo.CallOpts) } +func (_PingPongDemo *PingPongDemoCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _PingPongDemo.Contract.IsApprovedSender(&_PingPongDemo.CallOpts, sourceChainSelector, senderAddr) +} + +func (_PingPongDemo *PingPongDemoCallerSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _PingPongDemo.Contract.IsApprovedSender(&_PingPongDemo.CallOpts, sourceChainSelector, senderAddr) +} + func (_PingPongDemo *PingPongDemoCaller) IsPaused(opts *bind.CallOpts) (bool, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "isPaused") @@ -316,26 +387,78 @@ func (_PingPongDemo *PingPongDemoCallerSession) Owner() (common.Address, error) return _PingPongDemo.Contract.Owner(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { +func (_PingPongDemo *PingPongDemoCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) { var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "supportsInterface", interfaceId) + err := _PingPongDemo.contract.Call(opts, &out, "s_chains", arg0) + outstruct := new(SChains) if err != nil { - return *new(bool), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + + return *outstruct, err + +} + +func (_PingPongDemo *PingPongDemoSession) SChains(arg0 uint64) (SChains, + + error) { + return _PingPongDemo.Contract.SChains(&_PingPongDemo.CallOpts, arg0) +} + +func (_PingPongDemo *PingPongDemoCallerSession) SChains(arg0 uint64) (SChains, + + error) { + return _PingPongDemo.Contract.SChains(&_PingPongDemo.CallOpts, arg0) +} + +func (_PingPongDemo *PingPongDemoCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "s_feeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) SFeeToken() (common.Address, error) { + return _PingPongDemo.Contract.SFeeToken(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) SFeeToken() (common.Address, error) { + return _PingPongDemo.Contract.SFeeToken(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "s_messageStatus", messageId) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) return out0, err } -func (_PingPongDemo *PingPongDemoSession) SupportsInterface(interfaceId [4]byte) (bool, error) { - return _PingPongDemo.Contract.SupportsInterface(&_PingPongDemo.CallOpts, interfaceId) +func (_PingPongDemo *PingPongDemoSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _PingPongDemo.Contract.SMessageStatus(&_PingPongDemo.CallOpts, messageId) } -func (_PingPongDemo *PingPongDemoCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { - return _PingPongDemo.Contract.SupportsInterface(&_PingPongDemo.CallOpts, interfaceId) +func (_PingPongDemo *PingPongDemoCallerSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _PingPongDemo.Contract.SMessageStatus(&_PingPongDemo.CallOpts, messageId) } func (_PingPongDemo *PingPongDemoCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -384,6 +507,78 @@ func (_PingPongDemo *PingPongDemoTransactorSession) CcipReceive(message ClientAn return _PingPongDemo.Contract.CcipReceive(&_PingPongDemo.TransactOpts, message) } +func (_PingPongDemo *PingPongDemoTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data, feeToken) +} + +func (_PingPongDemo *PingPongDemoSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.CcipSend(&_PingPongDemo.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.CcipSend(&_PingPongDemo.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +} + +func (_PingPongDemo *PingPongDemoTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "disableChain", chainSelector) +} + +func (_PingPongDemo *PingPongDemoSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.Contract.DisableChain(&_PingPongDemo.TransactOpts, chainSelector) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.Contract.DisableChain(&_PingPongDemo.TransactOpts, chainSelector) +} + +func (_PingPongDemo *PingPongDemoTransactor) EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "enableChain", chainSelector, recipient, _extraArgsBytes) +} + +func (_PingPongDemo *PingPongDemoSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.EnableChain(&_PingPongDemo.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.EnableChain(&_PingPongDemo.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_PingPongDemo *PingPongDemoTransactor) ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "modifyFeeToken", token) +} + +func (_PingPongDemo *PingPongDemoSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.ModifyFeeToken(&_PingPongDemo.TransactOpts, token) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.ModifyFeeToken(&_PingPongDemo.TransactOpts, token) +} + +func (_PingPongDemo *PingPongDemoTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "processMessage", message) +} + +func (_PingPongDemo *PingPongDemoSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _PingPongDemo.Contract.ProcessMessage(&_PingPongDemo.TransactOpts, message) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _PingPongDemo.Contract.ProcessMessage(&_PingPongDemo.TransactOpts, message) +} + +func (_PingPongDemo *PingPongDemoTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "retryFailedMessage", messageId) +} + +func (_PingPongDemo *PingPongDemoSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId) +} + func (_PingPongDemo *PingPongDemoTransactor) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "setCounterpart", counterpartChainSelector, counterpartAddress) } @@ -396,28 +591,28 @@ func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpart(counterpartCh return _PingPongDemo.Contract.SetCounterpart(&_PingPongDemo.TransactOpts, counterpartChainSelector, counterpartAddress) } -func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "setCounterpartAddress", addr) +func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartAddress(opts *bind.TransactOpts, counterpartAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "setCounterpartAddress", counterpartAddress) } -func (_PingPongDemo *PingPongDemoSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, addr) +func (_PingPongDemo *PingPongDemoSession) SetCounterpartAddress(counterpartAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, counterpartAddress) } -func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, addr) +func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartAddress(counterpartAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, counterpartAddress) } -func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "setCounterpartChainSelector", chainSelector) +func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartChainSelector(opts *bind.TransactOpts, counterpartChainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "setCounterpartChainSelector", counterpartChainSelector) } -func (_PingPongDemo *PingPongDemoSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, chainSelector) +func (_PingPongDemo *PingPongDemoSession) SetCounterpartChainSelector(counterpartChainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, counterpartChainSelector) } -func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, chainSelector) +func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartChainSelector(counterpartChainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, counterpartChainSelector) } func (_PingPongDemo *PingPongDemoTransactor) SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) { @@ -432,6 +627,18 @@ func (_PingPongDemo *PingPongDemoTransactorSession) SetPaused(pause bool) (*type return _PingPongDemo.Contract.SetPaused(&_PingPongDemo.TransactOpts, pause) } +func (_PingPongDemo *PingPongDemoTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "setSimRevert", simRevert) +} + +func (_PingPongDemo *PingPongDemoSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetSimRevert(&_PingPongDemo.TransactOpts, simRevert) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetSimRevert(&_PingPongDemo.TransactOpts, simRevert) +} + func (_PingPongDemo *PingPongDemoTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "startPingPong") } @@ -456,8 +663,68 @@ func (_PingPongDemo *PingPongDemoTransactorSession) TransferOwnership(to common. return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) } -type PingPongDemoOwnershipTransferRequestedIterator struct { - Event *PingPongDemoOwnershipTransferRequested +func (_PingPongDemo *PingPongDemoTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_PingPongDemo *PingPongDemoSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) +} + +func (_PingPongDemo *PingPongDemoTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "withdrawNativeToken", to, amount) +} + +func (_PingPongDemo *PingPongDemoSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _PingPongDemo.Contract.WithdrawNativeToken(&_PingPongDemo.TransactOpts, to, amount) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _PingPongDemo.Contract.WithdrawNativeToken(&_PingPongDemo.TransactOpts, to, amount) +} + +func (_PingPongDemo *PingPongDemoTransactor) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "withdrawTokens", token, to, amount) +} + +func (_PingPongDemo *PingPongDemoSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _PingPongDemo.Contract.WithdrawTokens(&_PingPongDemo.TransactOpts, token, to, amount) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _PingPongDemo.Contract.WithdrawTokens(&_PingPongDemo.TransactOpts, token, to, amount) +} + +func (_PingPongDemo *PingPongDemoTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _PingPongDemo.contract.RawTransact(opts, calldata) +} + +func (_PingPongDemo *PingPongDemoSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.Fallback(&_PingPongDemo.TransactOpts, calldata) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.Fallback(&_PingPongDemo.TransactOpts, calldata) +} + +func (_PingPongDemo *PingPongDemoTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PingPongDemo.contract.RawTransact(opts, nil) +} + +func (_PingPongDemo *PingPongDemoSession) Receive() (*types.Transaction, error) { + return _PingPongDemo.Contract.Receive(&_PingPongDemo.TransactOpts) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) Receive() (*types.Transaction, error) { + return _PingPongDemo.Contract.Receive(&_PingPongDemo.TransactOpts) +} + +type PingPongDemoFeeTokenModifiedIterator struct { + Event *PingPongDemoFeeTokenModified contract *bind.BoundContract event string @@ -468,7 +735,7 @@ type PingPongDemoOwnershipTransferRequestedIterator struct { fail error } -func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { +func (it *PingPongDemoFeeTokenModifiedIterator) Next() bool { if it.fail != nil { return false @@ -477,7 +744,7 @@ func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoOwnershipTransferRequested) + it.Event = new(PingPongDemoFeeTokenModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -492,7 +759,7 @@ func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoOwnershipTransferRequested) + it.Event = new(PingPongDemoFeeTokenModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -507,51 +774,51 @@ func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { } } -func (it *PingPongDemoOwnershipTransferRequestedIterator) Error() error { +func (it *PingPongDemoFeeTokenModifiedIterator) Error() error { return it.fail } -func (it *PingPongDemoOwnershipTransferRequestedIterator) Close() error { +func (it *PingPongDemoFeeTokenModifiedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoOwnershipTransferRequested struct { - From common.Address - To common.Address - Raw types.Log +type PingPongDemoFeeTokenModified struct { + OldToken common.Address + NewToken common.Address + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferRequestedIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenModifiedIterator, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) } - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) if err != nil { return nil, err } - return &PingPongDemoOwnershipTransferRequestedIterator{contract: _PingPongDemo.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil + return &PingPongDemoFeeTokenModifiedIterator{contract: _PingPongDemo.contract, event: "FeeTokenModified", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) } - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) if err != nil { return nil, err } @@ -561,8 +828,8 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferRequested(opts select { case log := <-logs: - event := new(PingPongDemoOwnershipTransferRequested) - if err := _PingPongDemo.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + event := new(PingPongDemoFeeTokenModified) + if err := _PingPongDemo.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { return err } event.Raw = log @@ -583,17 +850,17 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferRequested(opts }), nil } -func (_PingPongDemo *PingPongDemoFilterer) ParseOwnershipTransferRequested(log types.Log) (*PingPongDemoOwnershipTransferRequested, error) { - event := new(PingPongDemoOwnershipTransferRequested) - if err := _PingPongDemo.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { +func (_PingPongDemo *PingPongDemoFilterer) ParseFeeTokenModified(log types.Log) (*PingPongDemoFeeTokenModified, error) { + event := new(PingPongDemoFeeTokenModified) + if err := _PingPongDemo.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { return nil, err } event.Raw = log return event, nil } -type PingPongDemoOwnershipTransferredIterator struct { - Event *PingPongDemoOwnershipTransferred +type PingPongDemoMessageAckReceivedIterator struct { + Event *PingPongDemoMessageAckReceived contract *bind.BoundContract event string @@ -604,7 +871,7 @@ type PingPongDemoOwnershipTransferredIterator struct { fail error } -func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { +func (it *PingPongDemoMessageAckReceivedIterator) Next() bool { if it.fail != nil { return false @@ -613,7 +880,7 @@ func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoOwnershipTransferred) + it.Event = new(PingPongDemoMessageAckReceived) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -628,7 +895,7 @@ func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoOwnershipTransferred) + it.Event = new(PingPongDemoMessageAckReceived) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -643,51 +910,32 @@ func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { } } -func (it *PingPongDemoOwnershipTransferredIterator) Error() error { +func (it *PingPongDemoMessageAckReceivedIterator) Error() error { return it.fail } -func (it *PingPongDemoOwnershipTransferredIterator) Close() error { +func (it *PingPongDemoMessageAckReceivedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoOwnershipTransferred struct { - From common.Address - To common.Address +type PingPongDemoMessageAckReceived struct { + Arg0 [32]byte Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferredIterator, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*PingPongDemoMessageAckReceivedIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageAckReceived") if err != nil { return nil, err } - return &PingPongDemoOwnershipTransferredIterator{contract: _PingPongDemo.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil + return &PingPongDemoMessageAckReceivedIterator{contract: _PingPongDemo.contract, event: "MessageAckReceived", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferred, 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) - } +func (_PingPongDemo *PingPongDemoFilterer) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAckReceived) (event.Subscription, error) { - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "MessageAckReceived") if err != nil { return nil, err } @@ -697,8 +945,8 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferred(opts *bind. select { case log := <-logs: - event := new(PingPongDemoOwnershipTransferred) - if err := _PingPongDemo.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + event := new(PingPongDemoMessageAckReceived) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { return err } event.Raw = log @@ -719,17 +967,17 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferred(opts *bind. }), nil } -func (_PingPongDemo *PingPongDemoFilterer) ParseOwnershipTransferred(log types.Log) (*PingPongDemoOwnershipTransferred, error) { - event := new(PingPongDemoOwnershipTransferred) - if err := _PingPongDemo.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { +func (_PingPongDemo *PingPongDemoFilterer) ParseMessageAckReceived(log types.Log) (*PingPongDemoMessageAckReceived, error) { + event := new(PingPongDemoMessageAckReceived) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { return nil, err } event.Raw = log return event, nil } -type PingPongDemoPingIterator struct { - Event *PingPongDemoPing +type PingPongDemoMessageAckSentIterator struct { + Event *PingPongDemoMessageAckSent contract *bind.BoundContract event string @@ -740,7 +988,7 @@ type PingPongDemoPingIterator struct { fail error } -func (it *PingPongDemoPingIterator) Next() bool { +func (it *PingPongDemoMessageAckSentIterator) Next() bool { if it.fail != nil { return false @@ -749,7 +997,7 @@ func (it *PingPongDemoPingIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoPing) + it.Event = new(PingPongDemoMessageAckSent) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -764,7 +1012,7 @@ func (it *PingPongDemoPingIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoPing) + it.Event = new(PingPongDemoMessageAckSent) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -779,32 +1027,32 @@ func (it *PingPongDemoPingIterator) Next() bool { } } -func (it *PingPongDemoPingIterator) Error() error { +func (it *PingPongDemoMessageAckSentIterator) Error() error { return it.fail } -func (it *PingPongDemoPingIterator) Close() error { +func (it *PingPongDemoMessageAckSentIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoPing struct { - PingPongCount *big.Int - Raw types.Log +type PingPongDemoMessageAckSent struct { + IncomingMessageId [32]byte + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterPing(opts *bind.FilterOpts) (*PingPongDemoPingIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageAckSent(opts *bind.FilterOpts) (*PingPongDemoMessageAckSentIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "Ping") + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageAckSent") if err != nil { return nil, err } - return &PingPongDemoPingIterator{contract: _PingPongDemo.contract, event: "Ping", logs: logs, sub: sub}, nil + return &PingPongDemoMessageAckSentIterator{contract: _PingPongDemo.contract, event: "MessageAckSent", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchPing(opts *bind.WatchOpts, sink chan<- *PingPongDemoPing) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAckSent) (event.Subscription, error) { - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "Ping") + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "MessageAckSent") if err != nil { return nil, err } @@ -814,8 +1062,8 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchPing(opts *bind.WatchOpts, sink select { case log := <-logs: - event := new(PingPongDemoPing) - if err := _PingPongDemo.contract.UnpackLog(event, "Ping", log); err != nil { + event := new(PingPongDemoMessageAckSent) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageAckSent", log); err != nil { return err } event.Raw = log @@ -836,17 +1084,17 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchPing(opts *bind.WatchOpts, sink }), nil } -func (_PingPongDemo *PingPongDemoFilterer) ParsePing(log types.Log) (*PingPongDemoPing, error) { - event := new(PingPongDemoPing) - if err := _PingPongDemo.contract.UnpackLog(event, "Ping", log); err != nil { +func (_PingPongDemo *PingPongDemoFilterer) ParseMessageAckSent(log types.Log) (*PingPongDemoMessageAckSent, error) { + event := new(PingPongDemoMessageAckSent) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageAckSent", log); err != nil { return nil, err } event.Raw = log return event, nil } -type PingPongDemoPongIterator struct { - Event *PingPongDemoPong +type PingPongDemoMessageFailedIterator struct { + Event *PingPongDemoMessageFailed contract *bind.BoundContract event string @@ -857,7 +1105,7 @@ type PingPongDemoPongIterator struct { fail error } -func (it *PingPongDemoPongIterator) Next() bool { +func (it *PingPongDemoMessageFailedIterator) Next() bool { if it.fail != nil { return false @@ -866,7 +1114,7 @@ func (it *PingPongDemoPongIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoPong) + it.Event = new(PingPongDemoMessageFailed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -881,7 +1129,7 @@ func (it *PingPongDemoPongIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoPong) + it.Event = new(PingPongDemoMessageFailed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -896,21 +1144,928 @@ func (it *PingPongDemoPongIterator) Next() bool { } } -func (it *PingPongDemoPongIterator) Error() error { +func (it *PingPongDemoMessageFailedIterator) Error() error { return it.fail } -func (it *PingPongDemoPongIterator) Close() error { +func (it *PingPongDemoMessageFailedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoPong struct { - PingPongCount *big.Int - Raw types.Log +type PingPongDemoMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterPong(opts *bind.FilterOpts) (*PingPongDemoPongIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageFailedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return &PingPongDemoMessageFailedIterator{contract: _PingPongDemo.contract, event: "MessageFailed", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageFailed, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoMessageFailed) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageFailed", 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 (_PingPongDemo *PingPongDemoFilterer) ParseMessageFailed(log types.Log) (*PingPongDemoMessageFailed, error) { + event := new(PingPongDemoMessageFailed) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoMessageRecoveredIterator struct { + Event *PingPongDemoMessageRecovered + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoMessageRecoveredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoMessageRecovered) + 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(PingPongDemoMessageRecovered) + 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 *PingPongDemoMessageRecoveredIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoMessageRecoveredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoMessageRecovered struct { + MessageId [32]byte + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageRecoveredIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return &PingPongDemoMessageRecoveredIterator{contract: _PingPongDemo.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageRecovered, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoMessageRecovered) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageRecovered", 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 (_PingPongDemo *PingPongDemoFilterer) ParseMessageRecovered(log types.Log) (*PingPongDemoMessageRecovered, error) { + event := new(PingPongDemoMessageRecovered) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageRecovered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoMessageSentIterator struct { + Event *PingPongDemoMessageSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoMessageSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoMessageSent) + 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(PingPongDemoMessageSent) + 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 *PingPongDemoMessageSentIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoMessageSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoMessageSent struct { + IncomingMessageId [32]byte + ACKMessageId [32]byte + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*PingPongDemoMessageSentIterator, error) { + + var incomingMessageIdRule []interface{} + for _, incomingMessageIdItem := range incomingMessageId { + incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + } + var ACKMessageIdRule []interface{} + for _, ACKMessageIdItem := range ACKMessageId { + ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + if err != nil { + return nil, err + } + return &PingPongDemoMessageSentIterator{contract: _PingPongDemo.contract, event: "MessageSent", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) { + + var incomingMessageIdRule []interface{} + for _, incomingMessageIdItem := range incomingMessageId { + incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + } + var ACKMessageIdRule []interface{} + for _, ACKMessageIdItem := range ACKMessageId { + ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoMessageSent) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageSent", 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 (_PingPongDemo *PingPongDemoFilterer) ParseMessageSent(log types.Log) (*PingPongDemoMessageSent, error) { + event := new(PingPongDemoMessageSent) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoMessageSucceededIterator struct { + Event *PingPongDemoMessageSucceeded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoMessageSucceededIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoMessageSucceeded) + 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(PingPongDemoMessageSucceeded) + 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 *PingPongDemoMessageSucceededIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoMessageSucceededIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoMessageSucceeded struct { + MessageId [32]byte + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageSucceededIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return &PingPongDemoMessageSucceededIterator{contract: _PingPongDemo.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageSucceeded, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoMessageSucceeded) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageSucceeded", 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 (_PingPongDemo *PingPongDemoFilterer) ParseMessageSucceeded(log types.Log) (*PingPongDemoMessageSucceeded, error) { + event := new(PingPongDemoMessageSucceeded) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoOwnershipTransferRequestedIterator struct { + Event *PingPongDemoOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOwnershipTransferRequested) + 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(PingPongDemoOwnershipTransferRequested) + 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 *PingPongDemoOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferRequestedIterator, 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 := _PingPongDemo.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &PingPongDemoOwnershipTransferRequestedIterator{contract: _PingPongDemo.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferRequested, 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 := _PingPongDemo.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(PingPongDemoOwnershipTransferRequested) + if err := _PingPongDemo.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 (_PingPongDemo *PingPongDemoFilterer) ParseOwnershipTransferRequested(log types.Log) (*PingPongDemoOwnershipTransferRequested, error) { + event := new(PingPongDemoOwnershipTransferRequested) + if err := _PingPongDemo.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoOwnershipTransferredIterator struct { + Event *PingPongDemoOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOwnershipTransferred) + 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(PingPongDemoOwnershipTransferred) + 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 *PingPongDemoOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferredIterator, 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 := _PingPongDemo.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &PingPongDemoOwnershipTransferredIterator{contract: _PingPongDemo.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferred, 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 := _PingPongDemo.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(PingPongDemoOwnershipTransferred) + if err := _PingPongDemo.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 (_PingPongDemo *PingPongDemoFilterer) ParseOwnershipTransferred(log types.Log) (*PingPongDemoOwnershipTransferred, error) { + event := new(PingPongDemoOwnershipTransferred) + if err := _PingPongDemo.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoPingIterator struct { + Event *PingPongDemoPing + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoPingIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoPing) + 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(PingPongDemoPing) + 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 *PingPongDemoPingIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoPingIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoPing struct { + PingPongCount *big.Int + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterPing(opts *bind.FilterOpts) (*PingPongDemoPingIterator, error) { + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "Ping") + if err != nil { + return nil, err + } + return &PingPongDemoPingIterator{contract: _PingPongDemo.contract, event: "Ping", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchPing(opts *bind.WatchOpts, sink chan<- *PingPongDemoPing) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "Ping") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoPing) + if err := _PingPongDemo.contract.UnpackLog(event, "Ping", 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 (_PingPongDemo *PingPongDemoFilterer) ParsePing(log types.Log) (*PingPongDemoPing, error) { + event := new(PingPongDemoPing) + if err := _PingPongDemo.contract.UnpackLog(event, "Ping", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoPongIterator struct { + Event *PingPongDemoPong + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoPongIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoPong) + 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(PingPongDemoPong) + 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 *PingPongDemoPongIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoPongIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoPong struct { + PingPongCount *big.Int + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterPong(opts *bind.FilterOpts) (*PingPongDemoPongIterator, error) { logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "Pong") if err != nil { @@ -962,8 +2117,27 @@ func (_PingPongDemo *PingPongDemoFilterer) ParsePong(log types.Log) (*PingPongDe return event, nil } +type SChains struct { + Recipient []byte + ExtraArgsBytes []byte +} + func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { + case _PingPongDemo.abi.Events["FeeTokenModified"].ID: + return _PingPongDemo.ParseFeeTokenModified(log) + case _PingPongDemo.abi.Events["MessageAckReceived"].ID: + return _PingPongDemo.ParseMessageAckReceived(log) + case _PingPongDemo.abi.Events["MessageAckSent"].ID: + return _PingPongDemo.ParseMessageAckSent(log) + case _PingPongDemo.abi.Events["MessageFailed"].ID: + return _PingPongDemo.ParseMessageFailed(log) + case _PingPongDemo.abi.Events["MessageRecovered"].ID: + return _PingPongDemo.ParseMessageRecovered(log) + case _PingPongDemo.abi.Events["MessageSent"].ID: + return _PingPongDemo.ParseMessageSent(log) + case _PingPongDemo.abi.Events["MessageSucceeded"].ID: + return _PingPongDemo.ParseMessageSucceeded(log) case _PingPongDemo.abi.Events["OwnershipTransferRequested"].ID: return _PingPongDemo.ParseOwnershipTransferRequested(log) case _PingPongDemo.abi.Events["OwnershipTransferred"].ID: @@ -978,6 +2152,34 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, } } +func (PingPongDemoFeeTokenModified) Topic() common.Hash { + return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") +} + +func (PingPongDemoMessageAckReceived) Topic() common.Hash { + return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") +} + +func (PingPongDemoMessageAckSent) Topic() common.Hash { + return common.HexToHash("0x75944f95ba0be568cb30faeb0ef135cb73d07006939da29722d670a97f5c5b26") +} + +func (PingPongDemoMessageFailed) Topic() common.Hash { + return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") +} + +func (PingPongDemoMessageRecovered) Topic() common.Hash { + return common.HexToHash("0xef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad") +} + +func (PingPongDemoMessageSent) Topic() common.Hash { + return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") +} + +func (PingPongDemoMessageSucceeded) Topic() common.Hash { + return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +} + func (PingPongDemoOwnershipTransferRequested) Topic() common.Hash { return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") } @@ -999,19 +2201,31 @@ func (_PingPongDemo *PingPongDemo) Address() common.Address { } type PingPongDemoInterface interface { + ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) + GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) GetCounterpartChainSelector(opts *bind.CallOpts) (uint64, error) - GetFeeToken(opts *bind.CallOpts) (common.Address, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) + + GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) GetRouter(opts *bind.CallOpts) (common.Address, error) + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) + IsPaused(opts *bind.CallOpts) (bool, error) Owner(opts *bind.CallOpts) (common.Address, error) - SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) + + SFeeToken(opts *bind.CallOpts) (common.Address, error) + + SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) TypeAndVersion(opts *bind.CallOpts) (string, error) @@ -1019,18 +2233,84 @@ type PingPongDemoInterface interface { CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) + + DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + + EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + + ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) - SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) + SetCounterpartAddress(opts *bind.TransactOpts, counterpartAddress common.Address) (*types.Transaction, error) - SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + SetCounterpartChainSelector(opts *bind.TransactOpts, counterpartChainSelector uint64) (*types.Transaction, error) SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) + SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) + StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + + WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) + + WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) + + Receive(opts *bind.TransactOpts) (*types.Transaction, error) + + FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenModifiedIterator, error) + + WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + + ParseFeeTokenModified(log types.Log) (*PingPongDemoFeeTokenModified, error) + + FilterMessageAckReceived(opts *bind.FilterOpts) (*PingPongDemoMessageAckReceivedIterator, error) + + WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAckReceived) (event.Subscription, error) + + ParseMessageAckReceived(log types.Log) (*PingPongDemoMessageAckReceived, error) + + FilterMessageAckSent(opts *bind.FilterOpts) (*PingPongDemoMessageAckSentIterator, error) + + WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAckSent) (event.Subscription, error) + + ParseMessageAckSent(log types.Log) (*PingPongDemoMessageAckSent, error) + + FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageFailedIterator, error) + + WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageFailed, messageId [][32]byte) (event.Subscription, error) + + ParseMessageFailed(log types.Log) (*PingPongDemoMessageFailed, error) + + FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageRecoveredIterator, error) + + WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageRecovered, messageId [][32]byte) (event.Subscription, error) + + ParseMessageRecovered(log types.Log) (*PingPongDemoMessageRecovered, error) + + FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*PingPongDemoMessageSentIterator, error) + + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + + ParseMessageSent(log types.Log) (*PingPongDemoMessageSent, error) + + FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageSucceededIterator, error) + + WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageSucceeded, messageId [][32]byte) (event.Subscription, error) + + ParseMessageSucceeded(log types.Log) (*PingPongDemoMessageSucceeded, error) + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferRequestedIterator, error) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go index d6e2db6bf3..363268370b 100644 --- a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go +++ b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go @@ -43,9 +43,14 @@ type ClientEVMTokenAmount struct { Amount *big.Int } +type ICCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + var SelfFundedPingPongMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200182238038062001822833981016040819052620000349162000291565b828233806000846001600160a01b0381166200006b576040516335fdcccd60e21b8152600060048201526024015b60405180910390fd5b6001600160a01b039081166080528216620000c95760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f0000000000000000604482015260640162000062565b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000fc57620000fc81620001cd565b50506002805460ff60a01b1916905550600380546001600160a01b0319166001600160a01b0383811691821790925560405163095ea7b360e01b8152918416600483015260001960248301529063095ea7b3906044016020604051808303816000875af115801562000172573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001989190620002ea565b505050806002620001aa919062000315565b600360146101000a81548160ff021916908360ff16021790555050505062000347565b336001600160a01b03821603620002275760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000062565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b03811681146200028e57600080fd5b50565b600080600060608486031215620002a757600080fd5b8351620002b48162000278565b6020850151909350620002c78162000278565b604085015190925060ff81168114620002df57600080fd5b809150509250925092565b600060208284031215620002fd57600080fd5b815180151581146200030e57600080fd5b9392505050565b60ff81811683821602908116908181146200034057634e487b7160e01b600052601160045260246000fd5b5092915050565b6080516114aa62000378600039600081816102970152818161063f0152818161072c0152610c2201526114aa6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80638f491cba116100cd578063bee518a411610081578063e6c725f511610066578063e6c725f51461034d578063ef686d8e1461037d578063f2fde38b1461039057600080fd5b8063bee518a4146102f1578063ca709a251461032f57600080fd5b8063b0f479a1116100b2578063b0f479a114610295578063b187bd26146102bb578063b5a11011146102de57600080fd5b80638f491cba1461026f5780639d2aede51461028257600080fd5b80632874d8bf1161012457806379ba50971161010957806379ba50971461023657806385572ffb1461023e5780638da5cb5b1461025157600080fd5b80632874d8bf146101ef5780632b6e5d63146101f757600080fd5b806301ffc9a71461015657806316c38b3c1461017e578063181f5a77146101935780631892b906146101dc575b600080fd5b610169610164366004610e24565b6103a3565b60405190151581526020015b60405180910390f35b61019161018c366004610e6d565b61043c565b005b6101cf6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516101759190610ef3565b6101916101ea366004610f23565b61048e565b6101916104e9565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b610191610525565b61019161024c366004610f3e565b610627565b60005473ffffffffffffffffffffffffffffffffffffffff16610211565b61019161027d366004610f79565b6106ac565b610191610290366004610fb4565b61088b565b7f0000000000000000000000000000000000000000000000000000000000000000610211565b60025474010000000000000000000000000000000000000000900460ff16610169565b6101916102ec366004610fd1565b6108da565b60015474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff9091168152602001610175565b60035473ffffffffffffffffffffffffffffffffffffffff16610211565b60035474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b61019161038b366004611008565b61097c565b61019161039e366004610fb4565b610a04565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb00000000000000000000000000000000000000000000000000000000148061043657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610444610a15565b6002805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610496610a15565b6001805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6104f1610a15565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556105236001610a96565b565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610698576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016105a2565b6106a96106a482611230565b610cd9565b50565b60035474010000000000000000000000000000000000000000900460ff1615806106f2575060035474010000000000000000000000000000000000000000900460ff1681105b156106fa5750565b6003546001906107259074010000000000000000000000000000000000000000900460ff16836112dd565b116106a9577f00000000000000000000000000000000000000000000000000000000000000006001546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156107dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108009190611318565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561084757600080fd5b505af115801561085b573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a150565b610893610a15565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108e2610a15565b6001805467ffffffffffffffff90931674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909316929092179091556002805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055565b610984610a15565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b610a0c610a15565b6106a981610d2f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105a2565b80600116600103610ad9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1610b0d565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b610b16816106ac565b6040805160a0810190915260025473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001610b6e91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015610be857816020015b6040805180820190915260008082526020820152815260200190600190039081610bc15790505b50815260035473ffffffffffffffffffffffffffffffffffffffff16602080830191909152604080519182018152600082529091015290507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600160149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401610c91929190611335565b6020604051808303816000875af1158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd4919061144a565b505050565b60008160600151806020019051810190610cf3919061144a565b60025490915074010000000000000000000000000000000000000000900460ff16610d2b57610d2b610d26826001611463565b610a96565b5050565b3373ffffffffffffffffffffffffffffffffffffffff821603610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105a2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215610e3657600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e6657600080fd5b9392505050565b600060208284031215610e7f57600080fd5b81358015158114610e6657600080fd5b6000815180845260005b81811015610eb557602081850181015186830182015201610e99565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610e666020830184610e8f565b803567ffffffffffffffff81168114610f1e57600080fd5b919050565b600060208284031215610f3557600080fd5b610e6682610f06565b600060208284031215610f5057600080fd5b813567ffffffffffffffff811115610f6757600080fd5b820160a08185031215610e6657600080fd5b600060208284031215610f8b57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146106a957600080fd5b600060208284031215610fc657600080fd5b8135610e6681610f92565b60008060408385031215610fe457600080fd5b610fed83610f06565b91506020830135610ffd81610f92565b809150509250929050565b60006020828403121561101a57600080fd5b813560ff81168114610e6657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561107d5761107d61102b565b60405290565b60405160a0810167ffffffffffffffff8111828210171561107d5761107d61102b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156110ed576110ed61102b565b604052919050565b600082601f83011261110657600080fd5b813567ffffffffffffffff8111156111205761112061102b565b61115160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016110a6565b81815284602083860101111561116657600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261119457600080fd5b8135602067ffffffffffffffff8211156111b0576111b061102b565b6111be818360051b016110a6565b82815260069290921b840181019181810190868411156111dd57600080fd5b8286015b8481101561122557604081890312156111fa5760008081fd5b61120261105a565b813561120d81610f92565b815281850135858201528352918301916040016111e1565b509695505050505050565b600060a0823603121561124257600080fd5b61124a611083565b8235815261125a60208401610f06565b6020820152604083013567ffffffffffffffff8082111561127a57600080fd5b611286368387016110f5565b6040840152606085013591508082111561129f57600080fd5b6112ab368387016110f5565b606084015260808501359150808211156112c457600080fd5b506112d136828601611183565b60808301525092915050565b600082611313577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561132a57600080fd5b8151610e6681610f92565b6000604067ffffffffffffffff851683526020604081850152845160a0604086015261136460e0860182610e8f565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08087840301606088015261139f8383610e8f565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611400578451805173ffffffffffffffffffffffffffffffffffffffff168352860151868301529385019360019390930192908601906113c1565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a0152955061143c8187610e8f565b9a9950505050505050505050565b60006020828403121561145c57600080fd5b5051919050565b80820180821115610436577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMagicBytes\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACKMESSAGEMAGICBYTES\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162004c1438038062004c148339810160408190526200003491620005fa565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000172565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013a576200013a6001600160a01b038216836000196200021d565b5050505050508060026200014f919062000653565b6009601d6101000a81548160ff021916908360ff16021790555050505062000743565b336001600160a01b03821603620001cc5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200029b5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000273573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000299919062000685565b155b6200030f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200008a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003679185916200036c16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003bb906001600160a01b0385169084906200043d565b805190915015620003675780806020019051810190620003dc91906200069f565b620003675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b60606200044e848460008562000456565b949350505050565b606082471015620004b95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004d79190620006f0565b60006040518083038185875af1925050503d806000811462000516576040519150601f19603f3d011682016040523d82523d6000602084013e6200051b565b606091505b5090925090506200052f878383876200053a565b979650505050505050565b60608315620005ae578251600003620005a6576001600160a01b0385163b620005a65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b50816200044e565b6200044e8383815115620005c55781518083602001fd5b8060405162461bcd60e51b81526004016200008a91906200070e565b6001600160a01b0381168114620005f757600080fd5b50565b6000806000606084860312156200061057600080fd5b83516200061d81620005e1565b60208501519093506200063081620005e1565b604085015190925060ff811681146200064857600080fd5b809150509250925092565b60ff81811683821602908116908181146200067e57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200069857600080fd5b5051919050565b600060208284031215620006b257600080fd5b81518015158114620006c357600080fd5b9392505050565b60005b83811015620006e7578181015183820152602001620006cd565b50506000910152565b6000825162000704818460208701620006ca565b9190910192915050565b60208152600082518060208401526200072f816040850160208701620006ca565b601f01601f19169190910160400192915050565b60805161447d62000797600039600081816105c20152818161080c015281816108aa01528181611141015281816114b401528181611f6f015281816121420152818161235801526128bc015261447d6000f3fe6080604052600436106101ff5760003560e01c80638462a2b91161010e578063bee518a4116100a7578063e6c725f511610079578063effde24011610061578063effde2401461072d578063f2fde38b14610740578063ff2deec31461076057005b8063e6c725f5146106c7578063ef686d8e1461070d57005b8063bee518a41461063e578063cf6730f814610667578063d8469e4014610687578063e4ca8754146106a757005b80639d2aede5116100e05780639d2aede514610593578063b0f479a1146105b3578063b187bd26146105e6578063b5a110111461061e57005b80638462a2b91461050857806385572ffb146105285780638da5cb5b146105485780638f491cba1461057357005b80633a51b79e11610198578063536c6bfa1161016a5780635e35359e116101525780635e35359e146104a65780636939cd97146104c657806379ba5097146104f357005b8063536c6bfa146104585780635dc5ebdb1461047857005b80633a51b79e146103a157806341eade46146103ea5780635075a9d41461040a57806352f813c31461043857005b8063181f5a77116101d1578063181f5a77146102be5780631892b906146103145780632874d8bf146103345780632b6e5d631461034957005b806305bfe982146102085780630e958d6b1461024e57806311e85dff1461027e57806316c38b3c1461029e57005b3661020657005b005b34801561021457600080fd5b506102386102233660046132c1565b60086020526000908152604090205460ff1681565b60405161024591906132da565b60405180910390f35b34801561025a57600080fd5b5061026e61026936600461337a565b610792565b6040519015158152602001610245565b34801561028a57600080fd5b50610206610299366004613401565b6107dc565b3480156102aa57600080fd5b506102066102b936600461342c565b61096c565b3480156102ca57600080fd5b506103076040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161024591906134b7565b34801561032057600080fd5b5061020661032f3660046134ca565b6109c6565b34801561034057600080fd5b50610206610a09565b34801561035557600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610245565b3480156103ad57600080fd5b506103076040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103f657600080fd5b506102066104053660046134ca565b610a45565b34801561041657600080fd5b5061042a6104253660046132c1565b610a84565b604051908152602001610245565b34801561044457600080fd5b5061020661045336600461342c565b610a97565b34801561046457600080fd5b506102066104733660046134e7565b610ad0565b34801561048457600080fd5b506104986104933660046134ca565b610ae6565b604051610245929190613513565b3480156104b257600080fd5b506102066104c1366004613541565b610c12565b3480156104d257600080fd5b506104e66104e13660046132c1565b610c3b565b60405161024591906135df565b3480156104ff57600080fd5b50610206610e46565b34801561051457600080fd5b506102066105233660046136b8565b610f48565b34801561053457600080fd5b50610206610543366004613724565b611129565b34801561055457600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661037c565b34801561057f57600080fd5b5061020661058e3660046132c1565b611419565b34801561059f57600080fd5b506102066105ae366004613401565b6115fd565b3480156105bf57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b3480156105f257600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661026e565b34801561062a57600080fd5b5061020661063936600461375f565b6116b4565b34801561064a57600080fd5b5060095460405167ffffffffffffffff9091168152602001610245565b34801561067357600080fd5b50610206610682366004613724565b611824565b34801561069357600080fd5b506102066106a2366004613798565b6119f9565b3480156106b357600080fd5b506102066106c23660046132c1565b611a5b565b3480156106d357600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610245565b34801561071957600080fd5b5061020661072836600461381b565b611cd9565b61042a61073b366004613973565b611d6a565b34801561074c57600080fd5b5061020661075b366004613401565b612462565b34801561076c57600080fd5b5060075461037c90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020819052604080832090519101906107c09085908590613a91565b9081526040519081900360200190205460ff1690509392505050565b6107e4612473565b600754610100900473ffffffffffffffffffffffffffffffffffffffff1615610851576108517f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff169060006124f4565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff8516179094559290910416901561090e5761090e7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6124f4565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b610974612473565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109ce612473565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a11612473565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4360016126f4565b565b610a4d612473565b67ffffffffffffffff8116600090815260026020526040812090610a718282613273565b610a7f600183016000613273565b505050565b6000610a91600483612941565b92915050565b610a9f612473565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610ad8612473565b610ae28282612954565b5050565b600260205260009081526040902080548190610b0190613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613aa1565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b505050505090806001018054610b8f90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbb90613aa1565b8015610c085780601f10610bdd57610100808354040283529160200191610c08565b820191906000526020600020905b815481529060010190602001808311610beb57829003601f168201915b5050505050905082565b610c1a612473565b610a7f73ffffffffffffffffffffffffffffffffffffffff84168383612aae565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610caa90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd690613aa1565b8015610d235780601f10610cf857610100808354040283529160200191610d23565b820191906000526020600020905b815481529060010190602001808311610d0657829003601f168201915b50505050508152602001600382018054610d3c90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6890613aa1565b8015610db55780601f10610d8a57610100808354040283529160200191610db5565b820191906000526020600020905b815481529060010190602001808311610d9857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e385760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610de3565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ecc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f50612473565b60005b818110156110335760026000848484818110610f7157610f71613af4565b9050602002810190610f839190613b23565b610f919060208101906134ca565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610fc857610fc8613af4565b9050602002810190610fda9190613b23565b610fe8906020810190613b61565b604051610ff6929190613a91565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f53565b5060005b838110156111225760016002600087878581811061105757611057613af4565b90506020028101906110699190613b23565b6110779060208101906134ca565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106110ae576110ae613af4565b90506020028101906110c09190613b23565b6110ce906020810190613b61565b6040516110dc929190613a91565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611037565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461119a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ec3565b6111aa60408201602083016134ca565b6111b76040830183613b61565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260208190526040918290209151910193506112149250849150613bc6565b9081526040519081900360200190205460ff1661125f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ec391906134b7565b61126f60408401602085016134ca565b67ffffffffffffffff81166000908152600260205260409020805461129390613aa1565b90506000036112da576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610ec3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611316908790600401613cda565b600060405180830381600087803b15801561133057600080fd5b505af1925050508015611341575060015b6113e6573d80801561136f576040519150601f19603f3d011682016040523d82523d6000602084013e611374565b606091505b50611386853560015b60049190612b04565b508435600090815260036020526040902085906113a382826140ac565b50506040518535907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113d89084906134b7565b60405180910390a250611413565b6040518435907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b50505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061147157506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156114795750565b6009546001906114ad907d010000000000000000000000000000000000000000000000000000000000900460ff16836141a6565b116115fa577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157191906141e1565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115b857600080fd5b505af11580156115cc573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611605612473565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522090610ae290826141fe565b6116bc612473565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260208181526040928390208351918201949094526001939091019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261177791613bc6565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522090610a7f90826141fe565b33301461185d576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61186d60408201602083016134ca565b61187a6040830183613b61565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260208190526040918290209151910193506118d79250849150613bc6565b9081526040519081900360200190205460ff1661192257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ec391906134b7565b61193260408401602085016134ca565b67ffffffffffffffff81166000908152600260205260409020805461195690613aa1565b905060000361199d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610ec3565b60006119ac6060860186613b61565b8101906119b991906132c1565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611122576111226119f4826001614318565b6126f4565b611a01612473565b67ffffffffffffffff85166000908152600260205260409020611a25848683613e30565b5080156111225767ffffffffffffffff85166000908152600260205260409020600101611a53828483613e30565b505050505050565b611a63612473565b6001611a70600483612941565b14611aaa576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ec3565b611ab581600061137d565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611afd90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2990613aa1565b8015611b765780601f10611b4b57610100808354040283529160200191611b76565b820191906000526020600020905b815481529060010190602001808311611b5957829003601f168201915b50505050508152602001600382018054611b8f90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbb90613aa1565b8015611c085780601f10611bdd57610100808354040283529160200191611c08565b820191906000526020600020905b815481529060010190602001808311611beb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611c8b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611c36565b50505050815250509050611c9e81612b19565b611ca9600483612bbf565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611ce1612473565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b67ffffffffffffffff841660009081526002602052604081208054869190611d9190613aa1565b9050600003611dd8576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610ec3565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182208054829190611e0890613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3490613aa1565b8015611e815780601f10611e5657610100808354040283529160200191611e81565b820191906000526020600020905b815481529060010190602001808311611e6457829003601f168201915b505050505081526020018681526020018781526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600260008a67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054611ee890613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1490613aa1565b8015611f615780601f10611f3657610100808354040283529160200191611f61565b820191906000526020600020905b815481529060010190602001808311611f4457829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded89846040518363ffffffff1660e01b8152600401611fc892919061432b565b602060405180830381865afa158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200991906143f8565b90506000805b88518110156121ca5761207f33308b848151811061202f5761202f613af4565b6020026020010151602001518c858151811061204d5761204d613af4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612bcb909392919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff168982815181106120a8576120a8613af4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161480156120ec575073ffffffffffffffffffffffffffffffffffffffff871615155b8015612117575060075473ffffffffffffffffffffffffffffffffffffffff88811661010090920416145b1561213d57600191506121383330858c858151811061204d5761204d613af4565b6121c2565b6121c27f00000000000000000000000000000000000000000000000000000000000000008a838151811061217357612173613af4565b6020026020010151602001518b848151811061219157612191613af4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124f49092919063ffffffff16565b60010161200f565b50801580156121f8575060075473ffffffffffffffffffffffffffffffffffffffff87811661010090920416145b8015612219575073ffffffffffffffffffffffffffffffffffffffff861615155b156122e7576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa15801561228a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ae91906143f8565b1080156122bb5750333014155b156122e2576122e273ffffffffffffffffffffffffffffffffffffffff8716333085612bcb565b612341565b73ffffffffffffffffffffffffffffffffffffffff861615801561230a57508134105b15612341576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f99088161561238e576000612390565b835b8b866040518463ffffffff1660e01b81526004016123af92919061432b565b60206040518083038185885af11580156123cd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123f291906143f8565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a350505050949350505050565b61246a612473565b6115fa81612c29565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ec3565b80158061259457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561256e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259291906143f8565b155b612620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ec3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a7f9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612d1e565b80600116600103612737576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a161276b565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b61277481611419565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e081016040516020818303038152906040528152602001836040516020016127d891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561285257816020015b604080518082019091526000808252602082015281526020019060019003908161282b5790505b50815260075473ffffffffffffffffffffffffffffffffffffffff6101009091048116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f9916128fe9167ffffffffffffffff90911690859060040161432b565b6020604051808303816000875af115801561291d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7f91906143f8565b600061294d8383612e2a565b9392505050565b804710156129be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ec3565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612a18576040519150601f19603f3d011682016040523d82523d6000602084013e612a1d565b606091505b5050905080610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ec3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a7f9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612672565b6000612b11848484612eb4565b949350505050565b60005b816080015151811015610ae257600082608001518281518110612b4157612b41613af4565b6020026020010151602001519050600083608001518381518110612b6757612b67613af4565b6020026020010151600001519050612bb5612b9760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff83169084612aae565b5050600101612b1c565b600061294d8383612ed1565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526114139085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612672565b3373ffffffffffffffffffffffffffffffffffffffff821603612ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ec3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612d80826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612eee9092919063ffffffff16565b805190915015610a7f5780806020019051810190612d9e9190614411565b610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ec3565b600081815260028301602052604081205480151580612e4e5750612e4e8484612efd565b61294d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610ec3565b60008281526002840160205260408120829055612b118484612f09565b6000818152600283016020526040812081905561294d8383612f15565b6060612b118484600085612f21565b600061294d838361303a565b600061294d8383613052565b600061294d83836130a1565b606082471015612fb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ec3565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fdc9190613bc6565b60006040518083038185875af1925050503d8060008114613019576040519150601f19603f3d011682016040523d82523d6000602084013e61301e565b606091505b509150915061302f87838387613194565b979650505050505050565b6000818152600183016020526040812054151561294d565b600081815260018301602052604081205461309957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a91565b506000610a91565b6000818152600183016020526040812054801561318a5760006130c560018361442e565b85549091506000906130d99060019061442e565b905081811461313e5760008660000182815481106130f9576130f9613af4565b906000526020600020015490508087600001848154811061311c5761311c613af4565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061314f5761314f614441565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a91565b6000915050610a91565b6060831561322a5782516000036132235773ffffffffffffffffffffffffffffffffffffffff85163b613223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ec3565b5081612b11565b612b11838381511561323f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec391906134b7565b50805461327f90613aa1565b6000825580601f1061328f575050565b601f0160209004906000526020600020908101906115fa91905b808211156132bd57600081556001016132a9565b5090565b6000602082840312156132d357600080fd5b5035919050565b6020810160038310613315577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146115fa57600080fd5b60008083601f84011261334357600080fd5b50813567ffffffffffffffff81111561335b57600080fd5b60208301915083602082850101111561337357600080fd5b9250929050565b60008060006040848603121561338f57600080fd5b833561339a8161331b565b9250602084013567ffffffffffffffff8111156133b657600080fd5b6133c286828701613331565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146115fa57600080fd5b80356133fc816133cf565b919050565b60006020828403121561341357600080fd5b813561294d816133cf565b80151581146115fa57600080fd5b60006020828403121561343e57600080fd5b813561294d8161341e565b60005b8381101561346457818101518382015260200161344c565b50506000910152565b60008151808452613485816020860160208601613449565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061294d602083018461346d565b6000602082840312156134dc57600080fd5b813561294d8161331b565b600080604083850312156134fa57600080fd5b8235613505816133cf565b946020939093013593505050565b604081526000613526604083018561346d565b8281036020840152613538818561346d565b95945050505050565b60008060006060848603121561355657600080fd5b8335613561816133cf565b92506020840135613571816133cf565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156135d4578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613597565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261361960c084018261346d565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613655838361346d565b925060808601519150808584030160a0860152506135388282613582565b60008083601f84011261368557600080fd5b50813567ffffffffffffffff81111561369d57600080fd5b6020830191508360208260051b850101111561337357600080fd5b600080600080604085870312156136ce57600080fd5b843567ffffffffffffffff808211156136e657600080fd5b6136f288838901613673565b9096509450602087013591508082111561370b57600080fd5b5061371887828801613673565b95989497509550505050565b60006020828403121561373657600080fd5b813567ffffffffffffffff81111561374d57600080fd5b820160a0818503121561294d57600080fd5b6000806040838503121561377257600080fd5b823561377d8161331b565b9150602083013561378d816133cf565b809150509250929050565b6000806000806000606086880312156137b057600080fd5b85356137bb8161331b565b9450602086013567ffffffffffffffff808211156137d857600080fd5b6137e489838a01613331565b909650945060408801359150808211156137fd57600080fd5b5061380a88828901613331565b969995985093965092949392505050565b60006020828403121561382d57600080fd5b813560ff8116811461294d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156138905761389061383e565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138dd576138dd61383e565b604052919050565b600082601f8301126138f657600080fd5b813567ffffffffffffffff8111156139105761391061383e565b61394160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613896565b81815284602083860101111561395657600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561398957600080fd5b84356139948161331b565b935060208581013567ffffffffffffffff808211156139b257600080fd5b818801915088601f8301126139c657600080fd5b8135818111156139d8576139d861383e565b6139e6848260051b01613896565b81815260069190911b8301840190848101908b831115613a0557600080fd5b938501935b82851015613a51576040858d031215613a235760008081fd5b613a2b61386d565b8535613a36816133cf565b81528587013587820152825260409094019390850190613a0a565b975050506040880135925080831115613a6957600080fd5b5050613a77878288016138e5565b925050613a86606086016133f1565b905092959194509250565b8183823760009101908152919050565b600181811c90821680613ab557607f821691505b602082108103613aee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613b5757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b9657600080fd5b83018035915067ffffffffffffffff821115613bb157600080fd5b60200191503681900382131561337357600080fd5b60008251613b57818460208701613449565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c0d57600080fd5b830160208101925035905067ffffffffffffffff811115613c2d57600080fd5b80360382131561337357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156135d4578135613ca8816133cf565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613c95565b602081528135602082015260006020830135613cf58161331b565b67ffffffffffffffff8082166040850152613d136040860186613bd8565b925060a06060860152613d2a60c086018483613c3c565b925050613d3a6060860186613bd8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613d70858385613c3c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613da957600080fd5b60209288019283019235915083821115613dc257600080fd5b8160061b3603831315613dd457600080fd5b8685030160a087015261302f848284613c85565b601f821115610a7f576000816000526020600020601f850160051c81016020861015613e115750805b601f850160051c820191505b81811015611a5357828155600101613e1d565b67ffffffffffffffff831115613e4857613e4861383e565b613e5c83613e568354613aa1565b83613de8565b6000601f841160018114613eae5760008515613e785750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611122565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613efd5786850135825560209485019460019092019101613edd565b5086821015613f38577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613f84816133cf565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613fea57613fea61383e565b8054838255808410156140775760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461402b5761402b613f4a565b808616861461403c5761403c613f4a565b5060008360005260206000208360011b81018760011b820191505b80821015614072578282558284830155600282019150614057565b505050505b5060008181526020812083915b85811015611a53576140968383613f79565b6040929092019160029190910190600101614084565b813581556001810160208301356140c28161331b565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141026040860186613b61565b93509150614114838360028701613e30565b6141216060860186613b61565b93509150614133838360038701613e30565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261416a57600080fd5b91840191823591508082111561417f57600080fd5b506020820191508060061b360382131561419857600080fd5b611413818360048601613fd1565b6000826141dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156141f357600080fd5b815161294d816133cf565b815167ffffffffffffffff8111156142185761421861383e565b61422c816142268454613aa1565b84613de8565b602080601f83116001811461427f57600084156142495750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a53565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142cc578886015182559484019460019091019084016142ad565b508582101561430857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610a9157610a91613f4a565b67ffffffffffffffff83168152604060208201526000825160a0604084015261435760e084018261346d565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152614393838361346d565b925060408601519150808584030160808601526143b08383613582565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506143ee828261346d565b9695505050505050565b60006020828403121561440a57600080fd5b5051919050565b60006020828403121561442357600080fd5b815161294d8161341e565b81810381811115610a9157610a91613f4a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -184,6 +189,28 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorRaw) Transact(opts *bind. return _SelfFundedPingPong.Contract.contract.Transact(opts, method, params...) } +func (_SelfFundedPingPong *SelfFundedPingPongCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "ACKMESSAGEMAGICBYTES") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { + return _SelfFundedPingPong.Contract.ACKMESSAGEMAGICBYTES(&_SelfFundedPingPong.CallOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { + return _SelfFundedPingPong.Contract.ACKMESSAGEMAGICBYTES(&_SelfFundedPingPong.CallOpts) +} + func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetCountIncrBeforeFunding(opts *bind.CallOpts) (uint8, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "getCountIncrBeforeFunding") @@ -250,26 +277,48 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetCounterpartChainS return _SelfFundedPingPong.Contract.GetCounterpartChainSelector(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetFeeToken(opts *bind.CallOpts) (common.Address, error) { +func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "getFeeToken") + err := _SelfFundedPingPong.contract.Call(opts, &out, "getMessageContents", messageId) if err != nil { - return *new(common.Address), err + return *new(ClientAny2EVMMessage), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(ClientAny2EVMMessage)).(*ClientAny2EVMMessage) + + return out0, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _SelfFundedPingPong.Contract.GetMessageContents(&_SelfFundedPingPong.CallOpts, messageId) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _SelfFundedPingPong.Contract.GetMessageContents(&_SelfFundedPingPong.CallOpts, messageId) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "getMessageStatus", messageId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err } -func (_SelfFundedPingPong *SelfFundedPingPongSession) GetFeeToken() (common.Address, error) { - return _SelfFundedPingPong.Contract.GetFeeToken(&_SelfFundedPingPong.CallOpts) +func (_SelfFundedPingPong *SelfFundedPingPongSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _SelfFundedPingPong.Contract.GetMessageStatus(&_SelfFundedPingPong.CallOpts, messageId) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetFeeToken() (common.Address, error) { - return _SelfFundedPingPong.Contract.GetFeeToken(&_SelfFundedPingPong.CallOpts) +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _SelfFundedPingPong.Contract.GetMessageStatus(&_SelfFundedPingPong.CallOpts, messageId) } func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { @@ -294,6 +343,28 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetRouter() (common. return _SelfFundedPingPong.Contract.GetRouter(&_SelfFundedPingPong.CallOpts) } +func (_SelfFundedPingPong *SelfFundedPingPongCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _SelfFundedPingPong.Contract.IsApprovedSender(&_SelfFundedPingPong.CallOpts, sourceChainSelector, senderAddr) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _SelfFundedPingPong.Contract.IsApprovedSender(&_SelfFundedPingPong.CallOpts, sourceChainSelector, senderAddr) +} + func (_SelfFundedPingPong *SelfFundedPingPongCaller) IsPaused(opts *bind.CallOpts) (bool, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "isPaused") @@ -338,26 +409,78 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) Owner() (common.Addr return _SelfFundedPingPong.Contract.Owner(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { +func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) { var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "supportsInterface", interfaceId) + err := _SelfFundedPingPong.contract.Call(opts, &out, "s_chains", arg0) + outstruct := new(SChains) if err != nil { - return *new(bool), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + + return *outstruct, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SChains(arg0 uint64) (SChains, + + error) { + return _SelfFundedPingPong.Contract.SChains(&_SelfFundedPingPong.CallOpts, arg0) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SChains(arg0 uint64) (SChains, + + error) { + return _SelfFundedPingPong.Contract.SChains(&_SelfFundedPingPong.CallOpts, arg0) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "s_feeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SFeeToken() (common.Address, error) { + return _SelfFundedPingPong.Contract.SFeeToken(&_SelfFundedPingPong.CallOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SFeeToken() (common.Address, error) { + return _SelfFundedPingPong.Contract.SFeeToken(&_SelfFundedPingPong.CallOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "s_messageStatus", messageId) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) return out0, err } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SupportsInterface(interfaceId [4]byte) (bool, error) { - return _SelfFundedPingPong.Contract.SupportsInterface(&_SelfFundedPingPong.CallOpts, interfaceId) +func (_SelfFundedPingPong *SelfFundedPingPongSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _SelfFundedPingPong.Contract.SMessageStatus(&_SelfFundedPingPong.CallOpts, messageId) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { - return _SelfFundedPingPong.Contract.SupportsInterface(&_SelfFundedPingPong.CallOpts, interfaceId) +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _SelfFundedPingPong.Contract.SMessageStatus(&_SelfFundedPingPong.CallOpts, messageId) } func (_SelfFundedPingPong *SelfFundedPingPongCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -406,104 +529,1106 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) CcipReceive(mess return _SelfFundedPingPong.Contract.CcipReceive(&_SelfFundedPingPong.TransactOpts, message) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) FundPingPong(opts *bind.TransactOpts, pingPongCount *big.Int) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "fundPingPong", pingPongCount) -} +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data, feeToken) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.CcipSend(&_SelfFundedPingPong.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.CcipSend(&_SelfFundedPingPong.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "disableChain", chainSelector) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.DisableChain(&_SelfFundedPingPong.TransactOpts, chainSelector) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.DisableChain(&_SelfFundedPingPong.TransactOpts, chainSelector) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "enableChain", chainSelector, recipient, _extraArgsBytes) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.EnableChain(&_SelfFundedPingPong.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.EnableChain(&_SelfFundedPingPong.TransactOpts, chainSelector, recipient, _extraArgsBytes) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) FundPingPong(opts *bind.TransactOpts, pingPongCount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "fundPingPong", pingPongCount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) FundPingPong(pingPongCount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.FundPingPong(&_SelfFundedPingPong.TransactOpts, pingPongCount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) FundPingPong(pingPongCount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.FundPingPong(&_SelfFundedPingPong.TransactOpts, pingPongCount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "modifyFeeToken", token) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.ModifyFeeToken(&_SelfFundedPingPong.TransactOpts, token) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.ModifyFeeToken(&_SelfFundedPingPong.TransactOpts, token) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "processMessage", message) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.ProcessMessage(&_SelfFundedPingPong.TransactOpts, message) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.ProcessMessage(&_SelfFundedPingPong.TransactOpts, message) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "retryFailedMessage", messageId) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCountIncrBeforeFunding(opts *bind.TransactOpts, countIncrBeforeFunding uint8) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "setCountIncrBeforeFunding", countIncrBeforeFunding) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCountIncrBeforeFunding(countIncrBeforeFunding uint8) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetCountIncrBeforeFunding(&_SelfFundedPingPong.TransactOpts, countIncrBeforeFunding) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCountIncrBeforeFunding(countIncrBeforeFunding uint8) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetCountIncrBeforeFunding(&_SelfFundedPingPong.TransactOpts, countIncrBeforeFunding) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "setCounterpart", counterpartChainSelector, counterpartAddress) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCounterpart(counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetCounterpart(&_SelfFundedPingPong.TransactOpts, counterpartChainSelector, counterpartAddress) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpart(counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetCounterpart(&_SelfFundedPingPong.TransactOpts, counterpartChainSelector, counterpartAddress) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCounterpartAddress(opts *bind.TransactOpts, counterpartAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "setCounterpartAddress", counterpartAddress) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCounterpartAddress(counterpartAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetCounterpartAddress(&_SelfFundedPingPong.TransactOpts, counterpartAddress) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpartAddress(counterpartAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetCounterpartAddress(&_SelfFundedPingPong.TransactOpts, counterpartAddress) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCounterpartChainSelector(opts *bind.TransactOpts, counterpartChainSelector uint64) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "setCounterpartChainSelector", counterpartChainSelector) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCounterpartChainSelector(counterpartChainSelector uint64) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetCounterpartChainSelector(&_SelfFundedPingPong.TransactOpts, counterpartChainSelector) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpartChainSelector(counterpartChainSelector uint64) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetCounterpartChainSelector(&_SelfFundedPingPong.TransactOpts, counterpartChainSelector) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "setPaused", pause) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SetPaused(pause bool) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetPaused(&_SelfFundedPingPong.TransactOpts, pause) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetPaused(pause bool) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetPaused(&_SelfFundedPingPong.TransactOpts, pause) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "setSimRevert", simRevert) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetSimRevert(&_SelfFundedPingPong.TransactOpts, simRevert) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetSimRevert(&_SelfFundedPingPong.TransactOpts, simRevert) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "startPingPong") +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) StartPingPong() (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.StartPingPong(&_SelfFundedPingPong.TransactOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) StartPingPong() (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.StartPingPong(&_SelfFundedPingPong.TransactOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "transferOwnership", to) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.TransferOwnership(&_SelfFundedPingPong.TransactOpts, to) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.TransferOwnership(&_SelfFundedPingPong.TransactOpts, to) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "withdrawNativeToken", to, amount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.WithdrawNativeToken(&_SelfFundedPingPong.TransactOpts, to, amount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.WithdrawNativeToken(&_SelfFundedPingPong.TransactOpts, to, amount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "withdrawTokens", token, to, amount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.WithdrawTokens(&_SelfFundedPingPong.TransactOpts, token, to, amount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.WithdrawTokens(&_SelfFundedPingPong.TransactOpts, token, to, amount) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.RawTransact(opts, calldata) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.Fallback(&_SelfFundedPingPong.TransactOpts, calldata) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.Fallback(&_SelfFundedPingPong.TransactOpts, calldata) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.RawTransact(opts, nil) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) Receive() (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.Receive(&_SelfFundedPingPong.TransactOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) Receive() (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.Receive(&_SelfFundedPingPong.TransactOpts) +} + +type SelfFundedPingPongCountIncrBeforeFundingSetIterator struct { + Event *SelfFundedPingPongCountIncrBeforeFundingSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongCountIncrBeforeFundingSet) + 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(SelfFundedPingPongCountIncrBeforeFundingSet) + 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 *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongCountIncrBeforeFundingSet struct { + CountIncrBeforeFunding uint8 + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterCountIncrBeforeFundingSet(opts *bind.FilterOpts) (*SelfFundedPingPongCountIncrBeforeFundingSetIterator, error) { + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "CountIncrBeforeFundingSet") + if err != nil { + return nil, err + } + return &SelfFundedPingPongCountIncrBeforeFundingSetIterator{contract: _SelfFundedPingPong.contract, event: "CountIncrBeforeFundingSet", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchCountIncrBeforeFundingSet(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongCountIncrBeforeFundingSet) (event.Subscription, error) { + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "CountIncrBeforeFundingSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongCountIncrBeforeFundingSet) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "CountIncrBeforeFundingSet", 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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseCountIncrBeforeFundingSet(log types.Log) (*SelfFundedPingPongCountIncrBeforeFundingSet, error) { + event := new(SelfFundedPingPongCountIncrBeforeFundingSet) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "CountIncrBeforeFundingSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongFeeTokenModifiedIterator struct { + Event *SelfFundedPingPongFeeTokenModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongFeeTokenModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongFeeTokenModified) + 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(SelfFundedPingPongFeeTokenModified) + 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 *SelfFundedPingPongFeeTokenModifiedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongFeeTokenModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongFeeTokenModified struct { + OldToken common.Address + NewToken common.Address + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*SelfFundedPingPongFeeTokenModifiedIterator, error) { + + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) + } + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongFeeTokenModifiedIterator{contract: _SelfFundedPingPong.contract, event: "FeeTokenModified", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { + + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) + } + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongFeeTokenModified) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "FeeTokenModified", 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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseFeeTokenModified(log types.Log) (*SelfFundedPingPongFeeTokenModified, error) { + event := new(SelfFundedPingPongFeeTokenModified) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongFundedIterator struct { + Event *SelfFundedPingPongFunded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongFundedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongFunded) + 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(SelfFundedPingPongFunded) + 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 *SelfFundedPingPongFundedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongFundedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongFunded struct { + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterFunded(opts *bind.FilterOpts) (*SelfFundedPingPongFundedIterator, error) { + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "Funded") + if err != nil { + return nil, err + } + return &SelfFundedPingPongFundedIterator{contract: _SelfFundedPingPong.contract, event: "Funded", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFunded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFunded) (event.Subscription, error) { + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "Funded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongFunded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "Funded", 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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseFunded(log types.Log) (*SelfFundedPingPongFunded, error) { + event := new(SelfFundedPingPongFunded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "Funded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongMessageAckReceivedIterator struct { + Event *SelfFundedPingPongMessageAckReceived + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongMessageAckReceivedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongMessageAckReceived) + 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(SelfFundedPingPongMessageAckReceived) + 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 *SelfFundedPingPongMessageAckReceivedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongMessageAckReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongMessageAckReceived struct { + Arg0 [32]byte + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*SelfFundedPingPongMessageAckReceivedIterator, error) { + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageAckReceived") + if err != nil { + return nil, err + } + return &SelfFundedPingPongMessageAckReceivedIterator{contract: _SelfFundedPingPong.contract, event: "MessageAckReceived", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageAckReceived) (event.Subscription, error) { + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageAckReceived") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongMessageAckReceived) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageAckReceived", 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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseMessageAckReceived(log types.Log) (*SelfFundedPingPongMessageAckReceived, error) { + event := new(SelfFundedPingPongMessageAckReceived) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongMessageAckSentIterator struct { + Event *SelfFundedPingPongMessageAckSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongMessageAckSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongMessageAckSent) + 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(SelfFundedPingPongMessageAckSent) + 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 *SelfFundedPingPongMessageAckSentIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongMessageAckSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongMessageAckSent struct { + IncomingMessageId [32]byte + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageAckSent(opts *bind.FilterOpts) (*SelfFundedPingPongMessageAckSentIterator, error) { + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageAckSent") + if err != nil { + return nil, err + } + return &SelfFundedPingPongMessageAckSentIterator{contract: _SelfFundedPingPong.contract, event: "MessageAckSent", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageAckSent) (event.Subscription, error) { + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageAckSent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongMessageAckSent) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageAckSent", 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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseMessageAckSent(log types.Log) (*SelfFundedPingPongMessageAckSent, error) { + event := new(SelfFundedPingPongMessageAckSent) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageAckSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongMessageFailedIterator struct { + Event *SelfFundedPingPongMessageFailed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongMessageFailedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongMessageFailed) + 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(SelfFundedPingPongMessageFailed) + 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 *SelfFundedPingPongMessageFailedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongMessageFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageFailedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongMessageFailedIterator{contract: _SelfFundedPingPong.contract, event: "MessageFailed", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageFailed, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: -func (_SelfFundedPingPong *SelfFundedPingPongSession) FundPingPong(pingPongCount *big.Int) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.FundPingPong(&_SelfFundedPingPong.TransactOpts, pingPongCount) -} + event := new(SelfFundedPingPongMessageFailed) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageFailed", log); err != nil { + return err + } + event.Raw = log -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) FundPingPong(pingPongCount *big.Int) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.FundPingPong(&_SelfFundedPingPong.TransactOpts, pingPongCount) + 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 (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCountIncrBeforeFunding(opts *bind.TransactOpts, countIncrBeforeFunding uint8) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "setCountIncrBeforeFunding", countIncrBeforeFunding) +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseMessageFailed(log types.Log) (*SelfFundedPingPongMessageFailed, error) { + event := new(SelfFundedPingPongMessageFailed) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCountIncrBeforeFunding(countIncrBeforeFunding uint8) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCountIncrBeforeFunding(&_SelfFundedPingPong.TransactOpts, countIncrBeforeFunding) -} +type SelfFundedPingPongMessageRecoveredIterator struct { + Event *SelfFundedPingPongMessageRecovered -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCountIncrBeforeFunding(countIncrBeforeFunding uint8) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCountIncrBeforeFunding(&_SelfFundedPingPong.TransactOpts, countIncrBeforeFunding) -} + contract *bind.BoundContract + event string -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "setCounterpart", counterpartChainSelector, counterpartAddress) + logs chan types.Log + sub ethereum.Subscription + done bool + fail error } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCounterpart(counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpart(&_SelfFundedPingPong.TransactOpts, counterpartChainSelector, counterpartAddress) -} +func (it *SelfFundedPingPongMessageRecoveredIterator) Next() bool { -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpart(counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpart(&_SelfFundedPingPong.TransactOpts, counterpartChainSelector, counterpartAddress) -} + if it.fail != nil { + return false + } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "setCounterpartAddress", addr) -} + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongMessageRecovered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true -func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpartAddress(&_SelfFundedPingPong.TransactOpts, addr) -} + default: + return false + } + } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpartAddress(&_SelfFundedPingPong.TransactOpts, addr) -} + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongMessageRecovered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "setCounterpartChainSelector", chainSelector) + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpartChainSelector(&_SelfFundedPingPong.TransactOpts, chainSelector) +func (it *SelfFundedPingPongMessageRecoveredIterator) Error() error { + return it.fail } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpartChainSelector(&_SelfFundedPingPong.TransactOpts, chainSelector) +func (it *SelfFundedPingPongMessageRecoveredIterator) Close() error { + it.sub.Unsubscribe() + return nil } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "setPaused", pause) +type SelfFundedPingPongMessageRecovered struct { + MessageId [32]byte + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SetPaused(pause bool) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetPaused(&_SelfFundedPingPong.TransactOpts, pause) -} +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageRecoveredIterator, error) { -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetPaused(pause bool) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetPaused(&_SelfFundedPingPong.TransactOpts, pause) -} + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "startPingPong") + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongMessageRecoveredIterator{contract: _SelfFundedPingPong.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongSession) StartPingPong() (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.StartPingPong(&_SelfFundedPingPong.TransactOpts) -} +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageRecovered, messageId [][32]byte) (event.Subscription, error) { -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) StartPingPong() (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.StartPingPong(&_SelfFundedPingPong.TransactOpts) -} + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "transferOwnership", to) -} + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: -func (_SelfFundedPingPong *SelfFundedPingPongSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.TransferOwnership(&_SelfFundedPingPong.TransactOpts, to) + event := new(SelfFundedPingPongMessageRecovered) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageRecovered", 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 (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.TransferOwnership(&_SelfFundedPingPong.TransactOpts, to) +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseMessageRecovered(log types.Log) (*SelfFundedPingPongMessageRecovered, error) { + event := new(SelfFundedPingPongMessageRecovered) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageRecovered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil } -type SelfFundedPingPongCountIncrBeforeFundingSetIterator struct { - Event *SelfFundedPingPongCountIncrBeforeFundingSet +type SelfFundedPingPongMessageSentIterator struct { + Event *SelfFundedPingPongMessageSent contract *bind.BoundContract event string @@ -514,7 +1639,7 @@ type SelfFundedPingPongCountIncrBeforeFundingSetIterator struct { fail error } -func (it *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Next() bool { +func (it *SelfFundedPingPongMessageSentIterator) Next() bool { if it.fail != nil { return false @@ -523,7 +1648,7 @@ func (it *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongCountIncrBeforeFundingSet) + it.Event = new(SelfFundedPingPongMessageSent) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -538,7 +1663,7 @@ func (it *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongCountIncrBeforeFundingSet) + it.Event = new(SelfFundedPingPongMessageSent) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -553,32 +1678,51 @@ func (it *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Next() bool { } } -func (it *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Error() error { +func (it *SelfFundedPingPongMessageSentIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongCountIncrBeforeFundingSetIterator) Close() error { +func (it *SelfFundedPingPongMessageSentIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongCountIncrBeforeFundingSet struct { - CountIncrBeforeFunding uint8 - Raw types.Log +type SelfFundedPingPongMessageSent struct { + IncomingMessageId [32]byte + ACKMessageId [32]byte + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterCountIncrBeforeFundingSet(opts *bind.FilterOpts) (*SelfFundedPingPongCountIncrBeforeFundingSetIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*SelfFundedPingPongMessageSentIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "CountIncrBeforeFundingSet") + var incomingMessageIdRule []interface{} + for _, incomingMessageIdItem := range incomingMessageId { + incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + } + var ACKMessageIdRule []interface{} + for _, ACKMessageIdItem := range ACKMessageId { + ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) if err != nil { return nil, err } - return &SelfFundedPingPongCountIncrBeforeFundingSetIterator{contract: _SelfFundedPingPong.contract, event: "CountIncrBeforeFundingSet", logs: logs, sub: sub}, nil + return &SelfFundedPingPongMessageSentIterator{contract: _SelfFundedPingPong.contract, event: "MessageSent", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchCountIncrBeforeFundingSet(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongCountIncrBeforeFundingSet) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) { - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "CountIncrBeforeFundingSet") + var incomingMessageIdRule []interface{} + for _, incomingMessageIdItem := range incomingMessageId { + incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + } + var ACKMessageIdRule []interface{} + for _, ACKMessageIdItem := range ACKMessageId { + ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) if err != nil { return nil, err } @@ -588,8 +1732,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchCountIncrBeforeFundi select { case log := <-logs: - event := new(SelfFundedPingPongCountIncrBeforeFundingSet) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "CountIncrBeforeFundingSet", log); err != nil { + event := new(SelfFundedPingPongMessageSent) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageSent", log); err != nil { return err } event.Raw = log @@ -610,17 +1754,17 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchCountIncrBeforeFundi }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseCountIncrBeforeFundingSet(log types.Log) (*SelfFundedPingPongCountIncrBeforeFundingSet, error) { - event := new(SelfFundedPingPongCountIncrBeforeFundingSet) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "CountIncrBeforeFundingSet", log); err != nil { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseMessageSent(log types.Log) (*SelfFundedPingPongMessageSent, error) { + event := new(SelfFundedPingPongMessageSent) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageSent", log); err != nil { return nil, err } event.Raw = log return event, nil } -type SelfFundedPingPongFundedIterator struct { - Event *SelfFundedPingPongFunded +type SelfFundedPingPongMessageSucceededIterator struct { + Event *SelfFundedPingPongMessageSucceeded contract *bind.BoundContract event string @@ -631,7 +1775,7 @@ type SelfFundedPingPongFundedIterator struct { fail error } -func (it *SelfFundedPingPongFundedIterator) Next() bool { +func (it *SelfFundedPingPongMessageSucceededIterator) Next() bool { if it.fail != nil { return false @@ -640,7 +1784,7 @@ func (it *SelfFundedPingPongFundedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongFunded) + it.Event = new(SelfFundedPingPongMessageSucceeded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -655,7 +1799,7 @@ func (it *SelfFundedPingPongFundedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongFunded) + it.Event = new(SelfFundedPingPongMessageSucceeded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -670,31 +1814,42 @@ func (it *SelfFundedPingPongFundedIterator) Next() bool { } } -func (it *SelfFundedPingPongFundedIterator) Error() error { +func (it *SelfFundedPingPongMessageSucceededIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongFundedIterator) Close() error { +func (it *SelfFundedPingPongMessageSucceededIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongFunded struct { - Raw types.Log +type SelfFundedPingPongMessageSucceeded struct { + MessageId [32]byte + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterFunded(opts *bind.FilterOpts) (*SelfFundedPingPongFundedIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageSucceededIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "Funded") + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageSucceeded", messageIdRule) if err != nil { return nil, err } - return &SelfFundedPingPongFundedIterator{contract: _SelfFundedPingPong.contract, event: "Funded", logs: logs, sub: sub}, nil + return &SelfFundedPingPongMessageSucceededIterator{contract: _SelfFundedPingPong.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFunded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFunded) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSucceeded, messageId [][32]byte) (event.Subscription, error) { - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "Funded") + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageSucceeded", messageIdRule) if err != nil { return nil, err } @@ -704,8 +1859,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFunded(opts *bind.Wa select { case log := <-logs: - event := new(SelfFundedPingPongFunded) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "Funded", log); err != nil { + event := new(SelfFundedPingPongMessageSucceeded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { return err } event.Raw = log @@ -726,9 +1881,9 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFunded(opts *bind.Wa }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseFunded(log types.Log) (*SelfFundedPingPongFunded, error) { - event := new(SelfFundedPingPongFunded) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "Funded", log); err != nil { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseMessageSucceeded(log types.Log) (*SelfFundedPingPongMessageSucceeded, error) { + event := new(SelfFundedPingPongMessageSucceeded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { return nil, err } event.Raw = log @@ -1241,12 +2396,31 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePong(log types.Log) return event, nil } +type SChains struct { + Recipient []byte + ExtraArgsBytes []byte +} + func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _SelfFundedPingPong.abi.Events["CountIncrBeforeFundingSet"].ID: return _SelfFundedPingPong.ParseCountIncrBeforeFundingSet(log) + case _SelfFundedPingPong.abi.Events["FeeTokenModified"].ID: + return _SelfFundedPingPong.ParseFeeTokenModified(log) case _SelfFundedPingPong.abi.Events["Funded"].ID: return _SelfFundedPingPong.ParseFunded(log) + case _SelfFundedPingPong.abi.Events["MessageAckReceived"].ID: + return _SelfFundedPingPong.ParseMessageAckReceived(log) + case _SelfFundedPingPong.abi.Events["MessageAckSent"].ID: + return _SelfFundedPingPong.ParseMessageAckSent(log) + case _SelfFundedPingPong.abi.Events["MessageFailed"].ID: + return _SelfFundedPingPong.ParseMessageFailed(log) + case _SelfFundedPingPong.abi.Events["MessageRecovered"].ID: + return _SelfFundedPingPong.ParseMessageRecovered(log) + case _SelfFundedPingPong.abi.Events["MessageSent"].ID: + return _SelfFundedPingPong.ParseMessageSent(log) + case _SelfFundedPingPong.abi.Events["MessageSucceeded"].ID: + return _SelfFundedPingPong.ParseMessageSucceeded(log) case _SelfFundedPingPong.abi.Events["OwnershipTransferRequested"].ID: return _SelfFundedPingPong.ParseOwnershipTransferRequested(log) case _SelfFundedPingPong.abi.Events["OwnershipTransferred"].ID: @@ -1265,10 +2439,38 @@ func (SelfFundedPingPongCountIncrBeforeFundingSet) Topic() common.Hash { return common.HexToHash("0x4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf3") } +func (SelfFundedPingPongFeeTokenModified) Topic() common.Hash { + return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") +} + func (SelfFundedPingPongFunded) Topic() common.Hash { return common.HexToHash("0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c") } +func (SelfFundedPingPongMessageAckReceived) Topic() common.Hash { + return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") +} + +func (SelfFundedPingPongMessageAckSent) Topic() common.Hash { + return common.HexToHash("0x75944f95ba0be568cb30faeb0ef135cb73d07006939da29722d670a97f5c5b26") +} + +func (SelfFundedPingPongMessageFailed) Topic() common.Hash { + return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") +} + +func (SelfFundedPingPongMessageRecovered) Topic() common.Hash { + return common.HexToHash("0xef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad") +} + +func (SelfFundedPingPongMessageSent) Topic() common.Hash { + return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") +} + +func (SelfFundedPingPongMessageSucceeded) Topic() common.Hash { + return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +} + func (SelfFundedPingPongOwnershipTransferRequested) Topic() common.Hash { return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") } @@ -1290,21 +2492,33 @@ func (_SelfFundedPingPong *SelfFundedPingPong) Address() common.Address { } type SelfFundedPingPongInterface interface { + ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) + GetCountIncrBeforeFunding(opts *bind.CallOpts) (uint8, error) GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) GetCounterpartChainSelector(opts *bind.CallOpts) (uint64, error) - GetFeeToken(opts *bind.CallOpts) (common.Address, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) + + GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) GetRouter(opts *bind.CallOpts) (common.Address, error) + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) + IsPaused(opts *bind.CallOpts) (bool, error) Owner(opts *bind.CallOpts) (common.Address, error) - SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + + error) + + SFeeToken(opts *bind.CallOpts) (common.Address, error) + + SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) TypeAndVersion(opts *bind.CallOpts) (string, error) @@ -1312,34 +2526,100 @@ type SelfFundedPingPongInterface interface { CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) + + DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + + EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + FundPingPong(opts *bind.TransactOpts, pingPongCount *big.Int) (*types.Transaction, error) + ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + SetCountIncrBeforeFunding(opts *bind.TransactOpts, countIncrBeforeFunding uint8) (*types.Transaction, error) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) - SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) + SetCounterpartAddress(opts *bind.TransactOpts, counterpartAddress common.Address) (*types.Transaction, error) - SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + SetCounterpartChainSelector(opts *bind.TransactOpts, counterpartChainSelector uint64) (*types.Transaction, error) SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) + SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) + StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + + WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) + + WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) + + Receive(opts *bind.TransactOpts) (*types.Transaction, error) + FilterCountIncrBeforeFundingSet(opts *bind.FilterOpts) (*SelfFundedPingPongCountIncrBeforeFundingSetIterator, error) WatchCountIncrBeforeFundingSet(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongCountIncrBeforeFundingSet) (event.Subscription, error) ParseCountIncrBeforeFundingSet(log types.Log) (*SelfFundedPingPongCountIncrBeforeFundingSet, error) + FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*SelfFundedPingPongFeeTokenModifiedIterator, error) + + WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + + ParseFeeTokenModified(log types.Log) (*SelfFundedPingPongFeeTokenModified, error) + FilterFunded(opts *bind.FilterOpts) (*SelfFundedPingPongFundedIterator, error) WatchFunded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFunded) (event.Subscription, error) ParseFunded(log types.Log) (*SelfFundedPingPongFunded, error) + FilterMessageAckReceived(opts *bind.FilterOpts) (*SelfFundedPingPongMessageAckReceivedIterator, error) + + WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageAckReceived) (event.Subscription, error) + + ParseMessageAckReceived(log types.Log) (*SelfFundedPingPongMessageAckReceived, error) + + FilterMessageAckSent(opts *bind.FilterOpts) (*SelfFundedPingPongMessageAckSentIterator, error) + + WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageAckSent) (event.Subscription, error) + + ParseMessageAckSent(log types.Log) (*SelfFundedPingPongMessageAckSent, error) + + FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageFailedIterator, error) + + WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageFailed, messageId [][32]byte) (event.Subscription, error) + + ParseMessageFailed(log types.Log) (*SelfFundedPingPongMessageFailed, error) + + FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageRecoveredIterator, error) + + WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageRecovered, messageId [][32]byte) (event.Subscription, error) + + ParseMessageRecovered(log types.Log) (*SelfFundedPingPongMessageRecovered, error) + + FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*SelfFundedPingPongMessageSentIterator, error) + + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + + ParseMessageSent(log types.Log) (*SelfFundedPingPongMessageSent, error) + + FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageSucceededIterator, error) + + WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSucceeded, messageId [][32]byte) (event.Subscription, error) + + ParseMessageSucceeded(log types.Log) (*SelfFundedPingPongMessageSucceeded, error) + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SelfFundedPingPongOwnershipTransferRequestedIterator, error) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go index 57a05ae411..d8d85ea4ec 100644 --- a/core/gethwrappers/ccip/go_generate.go +++ b/core/gethwrappers/ccip/go_generate.go @@ -33,9 +33,14 @@ package ccip //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin MaybeRevertMessageReceiver maybe_revert_message_receiver //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin PingPongDemo ping_pong_demo //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin SelfFundedPingPong self_funded_ping_pong -//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 +// Audited Reference Contracts +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin CCIPReceiver ccipReceiver +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin CCIPClient ccipClient +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin CCIPSender ccipSender +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReceiverWithAck/CCIPReceiverWithAck.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithAck/CCIPReceiverWithAck.bin CCIPReceiverWithAck ccipReceiverWithAck + // Customer contracts //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 From 330b6a49f18be44b773cf8bb97054c220fb6b92a Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 28 Jun 2024 11:44:25 -0400 Subject: [PATCH 12/31] re-add messageHasher gethwrapper that accidentally got removed while resolving merge conflicts --- core/gethwrappers/ccip/go_generate.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go index 0517e1d811..6fc1fa83f6 100644 --- a/core/gethwrappers/ccip/go_generate.go +++ b/core/gethwrappers/ccip/go_generate.go @@ -33,10 +33,7 @@ package ccip //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin MaybeRevertMessageReceiver maybe_revert_message_receiver //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin PingPongDemo ping_pong_demo //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin SelfFundedPingPong self_funded_ping_pong -<<<<<<< HEAD -======= //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.abi ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.bin MessageHasher message_hasher ->>>>>>> ccip-develop //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 // Audited Reference Contracts From 690971f9aa81062b332297622d72ee1b00c28f59 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 28 Jun 2024 11:53:04 -0400 Subject: [PATCH 13/31] typo fix --- contracts/scripts/native_solc_compile_all_ccip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 71d68132fa..614a866672 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -58,7 +58,7 @@ compileContract ccip/applications/internal/PingPongDemo.sol compileContract ccip/applications/internal/SelfFundedPingPong.sol compileContract ccip/applications/external/CCIPClient.sol compileContract ccip/applications/external/CCIPReceiver.sol -compileContract ccip/applications/external/CCIPReceiverWithAck.sol +compileContract ccip/applications/external/CCIPReceiverWithACK.sol compileContract ccip/applications/external/CCIPSender.sol compileContract ccip/onRamp/EVM2EVMMultiOnRamp.sol compileContract ccip/onRamp/EVM2EVMOnRamp.sol From 534ec1a55ec45e43ec88703442633214b8073d2a Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 28 Jun 2024 12:02:30 -0400 Subject: [PATCH 14/31] updated gas snapshot --- contracts/gas-snapshots/ccip.gas-snapshot | 158 +++++++++++----------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 0ec937fe6c..2f2ab81c82 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,61 +34,61 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243568) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPCapabilityConfigurationSetup:test_getCapabilityConfiguration_Success() (gas: 9561) -CCIPCapabilityConfiguration_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70645) -CCIPCapabilityConfiguration_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 350565) -CCIPCapabilityConfiguration_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 471510) -CCIPCapabilityConfiguration_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 440232) -CCIPCapabilityConfiguration_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 37027) -CCIPCapabilityConfiguration_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 61043) -CCIPCapabilityConfiguration_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 60963) -CCIPCapabilityConfiguration_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11764) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8897) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 303038) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 49619) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 32253) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 367516) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 120877) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 156973) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 367292) -CCIPCapabilityConfiguration_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 157040) -CCIPCapabilityConfiguration_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9648) -CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_InitToRunning_Success() (gas: 1044370) -CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 27539) -CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 23083) -CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_RunningToStaging_Success() (gas: 1992245) -CCIPCapabilityConfiguration__updatePluginConfig:test__updatePluginConfig_StagingToRunning_Success() (gas: 2595825) -CCIPCapabilityConfiguration__updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9626) -CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1833893) -CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1055282) -CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1055313) -CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilityRegistryCanCall_Reverts() (gas: 9576) -CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16070) -CCIPCapabilityConfiguration_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9626) -CCIPCapabilityConfiguration_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 182909) -CCIPCapabilityConfiguration_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 342472) -CCIPCapabilityConfiguration_chainConfig:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 19116) -CCIPCapabilityConfiguration_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 266071) -CCIPCapabilityConfiguration_chainConfig:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14807) -CCIPCapabilityConfiguration_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9604) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 285383) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 282501) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 283422) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 283588) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 287815) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1068544) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 282309) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_P2PIdsLengthNotMatching_Reverts() (gas: 284277) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_Success() (gas: 289222) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() (gas: 285518) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1120660) -CCIPCapabilityConfiguration_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1119000) -CCIPCapabilityConfiguration_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9540) -CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 329842) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 345519) -CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 84023) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 240978) -CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 551652) +CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 329311) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 345011) +CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 83749) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 240447) +CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 551136) +CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) +CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) +CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357994) +CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 481619) +CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 447731) +CCIPConfig_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 37027) +CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 61043) +CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 60963) +CCIPConfig_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11764) +CCIPConfig_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8765) +CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 307840) +CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 49663) +CCIPConfig_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 32275) +CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 372425) +CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 120943) +CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 157105) +CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 372201) +CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 157172) +CCIPConfig_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9583) +CCIPConfig__updatePluginConfig:test__updatePluginConfig_InitToRunning_Success() (gas: 1051740) +CCIPConfig__updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 27539) +CCIPConfig__updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 23105) +CCIPConfig__updatePluginConfig:test__updatePluginConfig_RunningToStaging_Success() (gas: 2002384) +CCIPConfig__updatePluginConfig:test__updatePluginConfig_StagingToRunning_Success() (gas: 2608050) +CCIPConfig__updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9583) +CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1844033) +CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1062709) +CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1062740) +CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_Reverts() (gas: 9599) +CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16070) +CCIPConfig_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9583) +CCIPConfig_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 184703) +CCIPConfig_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 344332) +CCIPConfig_chainConfig:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20258) +CCIPConfig_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 267558) +CCIPConfig_chainConfig:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14829) +CCIPConfig_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9626) +CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 290206) +CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 287302) +CCIPConfig_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 288245) +CCIPConfig_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 288389) +CCIPConfig_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 293767) +CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1107053) +CCIPConfig_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 287109) +CCIPConfig_validateConfig:test__validateConfig_P2PIdsLengthNotMatching_Reverts() (gas: 289078) +CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 296533) +CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() (gas: 290321) +CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1160583) +CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1158919) +CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562) CCIPReceiverTest:test_HappyPath_Success() (gas: 191895) CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426665) CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430412) @@ -96,22 +96,22 @@ CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195900 CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422972) CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18786) CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 53078) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 329840) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 329309) CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435500) CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2559441) CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72524) -CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 81718) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 334315) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 223821) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 367519) -CommitStore_constructor:test_Constructor_Success() (gas: 3091440) -CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 75331) -CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28784) -CommitStore_report:test_InvalidInterval_Revert() (gas: 28724) -CommitStore_report:test_InvalidRootRevert() (gas: 27957) -CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 55480) -CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 61390) -CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 55478) +CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 81444) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 333670) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 223290) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 366120) +CommitStore_constructor:test_Constructor_Success() (gas: 3091326) +CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) +CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) +CommitStore_report:test_InvalidInterval_Revert() (gas: 28610) +CommitStore_report:test_InvalidRootRevert() (gas: 27843) +CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 55405) +CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 61201) +CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 55403) CommitStore_report:test_Paused_Revert() (gas: 21259) CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 86394) CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56313) @@ -132,7 +132,7 @@ CommitStore_verify:test_Blessed_Success() (gas: 96389) CommitStore_verify:test_NotBlessed_Success() (gas: 61374) CommitStore_verify:test_Paused_Revert() (gas: 18496) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106837) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1104821) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38297) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108423) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_revert_Revert() (gas: 116875) @@ -210,7 +210,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 170344) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 182073) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47177) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 405859) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1390005) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 232987) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 166040) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 180585) @@ -244,8 +244,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 199773) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28246) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 160817) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 497730) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2371243) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1481951) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3173301) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 201928) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 202502) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 651738) @@ -384,7 +384,7 @@ EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101458) EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165192) EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177948) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 402597) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1386758) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159863) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175094) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248764) @@ -416,14 +416,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131906) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 483813) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1468131) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186809) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26009) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 189003) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188464) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2027697) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2853408) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144106) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -681,10 +681,10 @@ OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51686) OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) -OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 381362) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 200924) +OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 380711) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 200530) PingPong_example_plumbing:test_Pausing_Success() (gas: 17898) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 224406) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 223875) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -832,7 +832,7 @@ Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25116) Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44724) Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 288024) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 449940) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 448398) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20226) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) From 631406c594030e7195e6e2ad49817501cdc899ac Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 28 Jun 2024 12:15:38 -0400 Subject: [PATCH 15/31] standardized the file naming, ACK's should be capitalized. Hopefully this fixes the CI Issues. --- core/gethwrappers/ccip/go_generate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go index 6fc1fa83f6..1c08d88c53 100644 --- a/core/gethwrappers/ccip/go_generate.go +++ b/core/gethwrappers/ccip/go_generate.go @@ -40,7 +40,7 @@ package ccip //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin CCIPReceiver ccipReceiver //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin CCIPClient ccipClient //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin CCIPSender ccipSender -//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReceiverWithAck/CCIPReceiverWithAck.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithAck/CCIPReceiverWithAck.bin CCIPReceiverWithAck ccipReceiverWithAck +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReceiverWithAck/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithAck/CCIPReceiverWithACK.bin CCIPReceiverWithACK ccipReceiverWithACK // Customer contracts //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 From e8f876b1b35702cf9baac3d2f2282a3c22585990 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 28 Jun 2024 12:26:16 -0400 Subject: [PATCH 16/31] another wrapper generation attempt --- .../src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol | 1 + core/gethwrappers/ccip/go_generate.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index a1384b2153..e13df50d7c 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import {IRouterClient} from "../../interfaces/IRouterClient.sol"; diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go index 1c08d88c53..3a71f2042a 100644 --- a/core/gethwrappers/ccip/go_generate.go +++ b/core/gethwrappers/ccip/go_generate.go @@ -40,7 +40,7 @@ package ccip //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin CCIPReceiver ccipReceiver //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin CCIPClient ccipClient //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin CCIPSender ccipSender -//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReceiverWithAck/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithAck/CCIPReceiverWithACK.bin CCIPReceiverWithACK ccipReceiverWithACK +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin CCIPReceiverWithACK ccipReceiverWithACK // Customer contracts //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 From 2a04bcfd026a08914bbfd819cf9b2031407aa3c1 Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 16:34:26 +0000 Subject: [PATCH 17/31] Update gethwrappers --- .../generated-wrapper-dependency-versions-do-not-edit.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 8b5f3055ff..f528d2e4ca 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,6 +5,10 @@ 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 fee3f82935ce7a26c65e12f19a472a4fccdae62755abdb42d8b0a01f0f06981a burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin c7efa00d2be62a97a814730c8e13aa70794ebfdd38a9f3b3c11554a5dfd70478 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin a0728e186af74968101135a58a483320ced9ab79b22b1b24ac6994254ee79097 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 512700dfaad414d21660055794dc57b5372315d646db1e3ecfde7418358c7ff4 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin c870a11de8fb202288487e388749c07abe14009ff28b14107df54d1d3f185fa8 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 4dc7ae5af9f63903e19cd29573dbb52aa80a64165954c20651d1d26945a2da9b +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin c72ec1121daa8203ec3abb9232b7b53639cd89ef95f239c91c057aa86c61b902 ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin ef9e1f61b288bc31dda1c4e9d0bb8885b7b0bf1fe35bf74af8b12568e7532010 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 @@ -23,11 +27,11 @@ mock_usdc_token_transmitter: ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmit mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin 518e19efa2ff52b0fefd8e597b05765317ee7638189bfe34ca43de2f6599faf4 multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 1588313bb5e781d181a825247d30828f59007700f36b4b9b00391592b06ff4b4 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 6df7723df89f849400f62c36c9bb34dd7f89fc4134b63d81f1804e8398605e10 price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 0b3e253684d7085aa11f9179b71453b9db9d11cabea41605d5b4ac4128f85bfb registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin cbe7698bfd811b485ac3856daf073a7bdebeefdf2583403ca4a19d5b7e2d4ae8 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 86e169636e5633854ed0b709c804066b615040bceba25aa5137450fbe6f76fa3 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin d33172da69255393b354f7dda79141287bb02bacd5260a57cc1f7bdbddfdd7b4 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin 48caf06855a2f60455364d384e5fb2e6ecdf0a9ce4c1fc706b54b9885df76695 From dab2069d5d09a7d016e82caf4816adb8e44b8eba Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 28 Jun 2024 13:40:14 -0400 Subject: [PATCH 18/31] add MIT licenses to example code --- contracts/src/v0.8/ccip/applications/external/CCIPClient.sol | 1 + contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol | 1 + contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol | 1 + 3 files changed, 3 insertions(+) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index ecd94b89af..b0b9fa1b56 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IRouterClient} from "../../interfaces/IRouterClient.sol"; diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 75dc5f3e42..68520f4247 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; diff --git a/contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol b/contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol index 8fa97788c3..d260894395 100644 --- a/contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface ICCIPClientBase { From d6f5cc3f69f8f39853b9897089135b31864686ba Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 28 Jun 2024 13:47:38 -0400 Subject: [PATCH 19/31] forgot a file --- .../src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index e13df50d7c..ec4188333b 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IRouterClient} from "../../interfaces/IRouterClient.sol"; From e391d176e1734b79902cafa3b8ab0622b3372af7 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 1 Jul 2024 14:19:43 -0400 Subject: [PATCH 20/31] fixes based on feedback from review. --- contracts/gas-snapshots/ccip.gas-snapshot | 62 +++++++-------- .../scripts/native_solc_compile_all_ccip | 2 - .../ccip/applications/external/CCIPClient.sol | 59 ++++++-------- .../applications/external/CCIPClientBase.sol | 51 ++++++------ .../applications/external/CCIPReceiver.sol | 14 ++-- .../external/CCIPReceiverWithACK.sol | 20 ++--- .../ccip/applications/external/CCIPSender.sol | 55 +++++-------- .../applications/internal/PingPongDemo.sol | 9 +-- .../v0.8/ccip/interfaces/ICCIPClientBase.sol | 16 ---- .../external/CCIPClientTest.t.sol | 78 ++++++++----------- .../external/CCIPReceiverTest.t.sol | 22 +++--- .../external/CCIPReceiverWithAckTest.t.sol | 20 ++--- .../external/CCIPSenderTest.t.sol | 24 +----- .../helpers/EtherSenderReceiverHelper.sol | 1 - 14 files changed, 178 insertions(+), 255 deletions(-) delete mode 100644 contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 2f2ab81c82..9629b6b8c3 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,11 +34,10 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243568) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 329311) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 345011) -CCIPClientTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 83749) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 240447) -CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 551136) +CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 331428) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 347276) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 241501) +CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 552173) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357994) @@ -89,21 +88,20 @@ CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1160583) CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1158919) CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562) -CCIPReceiverTest:test_HappyPath_Success() (gas: 191895) -CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 426665) -CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 430412) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 195900) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 422972) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18786) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 53078) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 329309) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() (gas: 435500) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2559441) -CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72524) -CCIPSenderTest:test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() (gas: 81444) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 333670) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 223290) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 366120) +CCIPReceiverTest:test_HappyPath_Success() (gas: 193605) +CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428748) +CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 432364) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205094) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425143) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18785) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 55238) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 331480) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437682) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2631077) +CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72646) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339182) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224256) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 367940) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -210,7 +208,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 170344) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 182073) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47177) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1390005) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1381192) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 232987) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 166040) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 180585) @@ -244,8 +242,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 199773) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28246) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 160817) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1481951) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3173301) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1473138) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3164486) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 201928) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 202502) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 651738) @@ -384,7 +382,7 @@ EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101458) EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165192) EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177948) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1386758) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1377945) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159863) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175094) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248764) @@ -416,14 +414,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131906) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1468131) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1459318) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186809) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26009) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 189003) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188464) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2853408) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2846394) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144106) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -682,9 +680,9 @@ OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 380711) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 200530) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17898) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 223875) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308219) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17766) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234273) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -831,9 +829,9 @@ Router_routeMessage:test_ManualExec_Success() (gas: 35381) Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25116) Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44724) Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 288024) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 448398) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20226) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 290332) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 452301) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20203) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12629) diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 614a866672..8638a7ee93 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -80,8 +80,6 @@ compileContract ccip/tokenAdminRegistry/TokenAdminRegistry.sol compileContract ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol compileContract ccip/capability/CCIPConfig.sol - - # Test helpers compileContract ccip/test/helpers/BurnMintERC677Helper.sol compileContract ccip/test/helpers/CommitStoreHelper.sol diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index b0b9fa1b56..2e8c30b7da 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -9,71 +9,56 @@ import {CCIPReceiverWithACK} from "./CCIPReceiverWithACK.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"; +/// @notice CCIPReceiver and CCIPSender cannot be simultaneously imported due to similar parents so CCIPSender functionality has been duplicated contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; error InvalidConfig(); error CannotAcknowledgeUnsentMessage(bytes32); - /// @notice You can't import CCIPReceiver and Sender due to similar parents so functionality of CCIPSender is duplicated here constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} function typeAndVersion() external pure virtual override returns (string memory) { - return "CCIPReceiverWithACK 1.0.0-dev"; + return "CCIPClient 1.0.0-dev"; } function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, - bytes memory data, - address feeToken + bytes memory data ) public payable validChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: s_chains[destChainSelector].recipient, + receiver: s_chainConfigs[destChainSelector].recipient, data: data, tokenAmounts: tokenAmounts, - extraArgs: s_chains[destChainSelector].extraArgsBytes, - feeToken: feeToken + extraArgs: s_chainConfigs[destChainSelector].extraArgsBytes, + feeToken: address(s_feeToken) }); - uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); - - bool sendingFeeTokenNormally; - for (uint256 i = 0; i < tokenAmounts.length; ++i) { // Transfer the tokens to pay for tokens in tokenAmounts IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); - // If they are sending the feeToken through, and its the same as the ack fee token, and also paying in it, then you don't need to approve - // it at all cause its already set as type(uint).max. You can't use safeIncreaseAllowance() either cause it will overflow the token allowance - if (tokenAmounts[i].token == feeToken && feeToken != address(0) && feeToken == address(s_feeToken)) { - sendingFeeTokenNormally = true; - IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), fee); - } - // If they're not sending the fee token, then go ahead and approve - else { - IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); + // Do not approve the tokens if it is the feeToken, otherwise the approval amount may overflow + if (tokenAmounts[i].token != address(s_feeToken)) { + IERC20(tokenAmounts[i].token).safeIncreaseAllowance(i_ccipRouter, tokenAmounts[i].amount); } } - // Since the fee token was already set in the ReceiverWithACK parent, we don't need to approve it to spend, only to ensure we have enough - // funds for the transfer - if (!sendingFeeTokenNormally && feeToken == address(s_feeToken) && feeToken != address(0)) { - // Support pre-funding the contract with fee token by checking that not enough exists to pay the fee already - // msg.sender checks that the function was not called in a _sendACK() call or as a result of processMessage(), which would require pre-funding the contract - if (IERC20(feeToken).balanceOf(address(this)) < fee && msg.sender != address(this)) { - IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); - } - } else if (feeToken == address(0) && msg.value < fee) { - revert IRouterClient.InsufficientFeeTokenAmount(); + uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); + + // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken + if (address(s_feeToken) != address(0)) { + IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } - messageId = - IRouterClient(i_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); + messageId = IRouterClient(i_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( + destChainSelector, message + ); s_messageStatus[messageId] = CCIPReceiverWithACK.MessageStatus.SENT; - // Since the message was outgoing, and not ACK, use bytes32(0) to reflect this + // Since the message was outgoing, and not ACK, reflect this with bytes32(0) emit MessageSent(messageId, bytes32(0)); return messageId; @@ -90,11 +75,11 @@ contract CCIPClient is CCIPReceiverWithACK { // If the message was outgoing, then send an ack response. _sendAck(message); } else if (payload.messageType == MessageType.ACK) { - // Decode message into the magic-bytes and the messageId to ensure the message is encoded correctly - (bytes memory magicBytes, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); + // Decode message into the message-heacder and the messageId to ensure the message is encoded correctly + (bytes memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); - // Ensure Ack Message contains proper magic-bytes - if (keccak256(magicBytes) != keccak256(ACKMESSAGEMAGICBYTES)) revert InvalidMagicBytes(); + // Ensure Ack Message contains proper message header + if (keccak256(messageHeader) != keccak256(ACK_MESSAGE_HEADER)) revert InvalidAckMessageHeader(); // Make sure the ACK message was originally sent by this contract if (s_messageStatus[messageId] != MessageStatus.SENT) revert CannotAcknowledgeUnsentMessage(messageId); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 68520f4247..3eebdf65c1 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -8,27 +8,31 @@ import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; import {Address} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; -import {ICCIPClientBase} from "../../interfaces/ICCIPClientBase.sol"; - -abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVersion { +abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { using SafeERC20 for IERC20; using Address for address; address internal immutable i_ccipRouter; error ZeroAddressNotAllowed(); + error InvalidRouter(address router); + error InvalidChain(uint64 chainSelector); + error InvalidSender(bytes sender); + error InvalidRecipient(bytes recipient); + + struct approvedSenderUpdate { + uint64 destChainSelector; + bytes sender; + } - struct ChainInfo { + struct ChainConfig { + bool isDisabled; bytes recipient; bytes extraArgsBytes; mapping(bytes => bool) approvedSender; } - mapping(uint64 => ChainInfo) public s_chains; - - // mapping(uint64 => mapping(bytes sender => bool)) public s_approvedSenders; - // mapping(uint64 => bytes) public s_chains; - // mapping(uint64 => bytes) public s_extraArgsBytes; + mapping(uint64 => ChainConfig) public s_chainConfigs; constructor(address router) { if (router == address(0)) revert ZeroAddressNotAllowed(); @@ -58,25 +62,23 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVer approvedSenderUpdate[] calldata removes ) external onlyOwner { for (uint256 i = 0; i < removes.length; ++i) { - // delete s_approvedSenders[removes[i].destChainSelector][removes[i].sender]; - delete s_chains[removes[i].destChainSelector].approvedSender[removes[i].sender]; + delete s_chainConfigs[removes[i].destChainSelector].approvedSender[removes[i].sender]; } for (uint256 i = 0; i < adds.length; ++i) { - // s_approvedSenders[adds[i].destChainSelector][adds[i].sender] = true; - s_chains[adds[i].destChainSelector].approvedSender[adds[i].sender] = true; + s_chainConfigs[adds[i].destChainSelector].approvedSender[adds[i].sender] = true; } } function isApprovedSender(uint64 sourceChainSelector, bytes calldata senderAddr) external view returns (bool) { - return s_chains[sourceChainSelector].approvedSender[senderAddr]; + return s_chainConfigs[sourceChainSelector].approvedSender[senderAddr]; } // ================================================================ // │ Fee Token Management │ // =============================================================== - fallback() external payable {} + fallback() external {} receive() external payable {} function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { @@ -96,24 +98,29 @@ abstract contract CCIPClientBase is ICCIPClientBase, OwnerIsCreator, ITypeAndVer bytes calldata recipient, bytes calldata _extraArgsBytes ) external onlyOwner { - s_chains[chainSelector].recipient = recipient; + ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; + + currentConfig.recipient = recipient; + + if (_extraArgsBytes.length != 0) currentConfig.extraArgsBytes = _extraArgsBytes; - if (_extraArgsBytes.length != 0) s_chains[chainSelector].extraArgsBytes = _extraArgsBytes; + // If config was previously disabled, then re-enable it; + if (currentConfig.isDisabled) currentConfig.isDisabled = false; } function disableChain(uint64 chainSelector) external onlyOwner { - delete s_chains[chainSelector]; - // delete s_extraArgsBytes[chainSelector]; + s_chainConfigs[chainSelector].isDisabled = true; } modifier validChain(uint64 chainSelector) { - if (s_chains[chainSelector].recipient.length == 0) revert InvalidChain(chainSelector); + // Must be storage and not memory because the struct contains a nested mapping + ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; + if (currentConfig.recipient.length == 0 || currentConfig.isDisabled) revert InvalidChain(chainSelector); _; } modifier validSender(uint64 chainSelector, bytes memory sender) { - // if (!s_approvedSenders[chainSelector][sender]) revert InvalidSender(sender); - if (!s_chains[chainSelector].approvedSender[sender]) revert InvalidSender(sender); + if (!s_chainConfigs[chainSelector].approvedSender[sender]) revert InvalidSender(sender); _; } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index e5ab31862b..5bbc1ca308 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -90,36 +90,38 @@ contract CCIPReceiver is CCIPClientBase { // ================================================================ // │ Failed Message Processing | - // ================================================================ + // ================== ============================================== /// @notice This function is callable by the owner when a message has failed /// to unblock the tokens that are associated with that message. /// @dev This function is only callable by the owner. - function retryFailedMessage(bytes32 messageId) external onlyOwner { + function retryFailedMessage(bytes32 messageId, address forwardingAddress) external onlyOwner { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); // Set the error code to 0 to disallow reentry and retry the same failed message // multiple times. s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); - // Do stuff to retry message, potentially just releasing the associated tokens + // Allow developer to implement arbitrary functionality on retried messages, such as just releasing the associated tokens Client.Any2EVMMessage memory message = s_messageContents[messageId]; // Let the user override the implementation, since different workflow may be desired for retrying a merssage - _retryFailedMessage(message); + _retryFailedMessage(message, abi.encode(forwardingAddress)); s_failedMessages.remove(messageId); // If retry succeeds, remove from set of failed messages. emit MessageRecovered(messageId); } - function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual { + function _retryFailedMessage(Client.Any2EVMMessage memory message, bytes memory retryData) internal virtual { + (address forwardingAddress) = abi.decode(retryData, (address)); + // Owner rescues tokens sent with a failed message for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { uint256 amount = message.destTokenAmounts[i].amount; address token = message.destTokenAmounts[i].token; - IERC20(token).safeTransfer(owner(), amount); + IERC20(token).safeTransfer(forwardingAddress, amount); } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index ec4188333b..d10445c26c 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -17,7 +17,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { // Current feeToken IERC20 public s_feeToken; - bytes public constant ACKMESSAGEMAGICBYTES = "MESSAGE_ACKNOWLEDGED_"; + bytes public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; // mapping(bytes32 messageId => bool ackReceived) public s_messageAckReceived; mapping(bytes32 messageId => MessageStatus status) public s_messageStatus; @@ -26,7 +26,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { event MessageSent(bytes32 indexed incomingMessageId, bytes32 indexed ACKMessageId); event MessageAckReceived(bytes32); - error InvalidMagicBytes(); + error InvalidAckMessageHeader(); error MessageAlreadyAcknowledged(bytes32 messageId); event FeeTokenModified(address indexed oldToken, address indexed newToken); @@ -53,7 +53,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { // If fee token is in LINK, then approve router to transfer if (address(feeToken) != address(0)) { - feeToken.safeApprove(router, type(uint256).max); + feeToken.safeIncreaseAllowance(router, type(uint256).max); } } @@ -72,7 +72,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { // Approve the router to spend the new fee token if (token != address(0)) { - s_feeToken.safeApprove(getRouter(), type(uint256).max); + s_feeToken.safeIncreaseAllowance(getRouter(), type(uint256).max); } emit FeeTokenModified(oldFeeToken, token); @@ -115,11 +115,11 @@ contract CCIPReceiverWithACK is CCIPReceiver { // If the message was outgoing, then send an ack response. _sendAck(message); } else if (payload.messageType == MessageType.ACK) { - // Decode message into the magic-bytes and the messageId to ensure the message is encoded correctly - (bytes memory magicBytes, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); + // Decode message into the message header and the messageId to ensure the message is encoded correctly + (bytes memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); - // Ensure Ack Message contains proper magic-bytes - if (keccak256(magicBytes) != keccak256(ACKMESSAGEMAGICBYTES)) revert InvalidMagicBytes(); + // Ensure Ack Message contains proper message header + if (keccak256(messageHeader) != keccak256(ACK_MESSAGE_HEADER)) revert InvalidAckMessageHeader(); // Make sure the ACK message has not already been acknowledged if (s_messageStatus[messageId] == MessageStatus.ACKNOWLEDGED) revert MessageAlreadyAcknowledged(messageId); @@ -137,9 +137,9 @@ contract CCIPReceiverWithACK is CCIPReceiver { Client.EVM2AnyMessage memory outgoingMessage = Client.EVM2AnyMessage({ receiver: incomingMessage.sender, - data: abi.encode(ACKMESSAGEMAGICBYTES, incomingMessage.messageId), + data: abi.encode(ACK_MESSAGE_HEADER, incomingMessage.messageId), tokenAmounts: tokenAmounts, - extraArgs: s_chains[incomingMessage.sourceChainSelector].extraArgsBytes, //s_extraArgsBytes[incomingMessage.sourceChainSelector], + extraArgs: s_chainConfigs[incomingMessage.sourceChainSelector].extraArgsBytes, feeToken: address(s_feeToken) }); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index 77c95654bb..acb9e3fa22 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -9,19 +9,19 @@ import {CCIPClientBase} from "./CCIPClientBase.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"; -// @notice Example of a client which supports EVM/non-EVM chains -// @dev If chain specific logic is required for different chain families (e.g. particular -// decoding the bytes sender for authorization checks), it may be required to point to a helper -// authorization contract unless all chain families are known up front. -// @dev If contract does not implement IAny2EVMMessageReceiver and IERC165, -// and tokens are sent to it, ccipReceive will not be called but tokens will be transferred. -// @dev If the client is upgradeable you have significantly more flexibility and -// can avoid storage based options like the below contract uses. However it's -// worth carefully considering how the trust assumptions of your client dapp will -// change if you introduce upgradeability. An immutable dapp building on top of CCIP -// like the example below will inherit the trust properties of CCIP (i.e. the oracle network). -// @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting -// new chain family receivers (e.g. a solana encoded receiver address) without upgrading. +/// @notice Example of a client which supports EVM/non-EVM chains +/// @dev If chain specific logic is required for different chain families (e.g. particular +/// decoding the bytes sender for authorization checks), it may be required to point to a helper +/// authorization contract unless all chain families are known up front. +/// @dev If contract does not implement IAny2EVMMessageReceiver and IERC165, +/// and tokens are sent to it, ccipReceive will not be called but tokens will be transferred. +/// @dev If the client is upgradeable you have significantly more flexibility and +/// can avoid storage based options like the below contract uses. However it's +/// worth carefully considering how the trust assumptions of your client dapp will +/// change if you introduce upgradeability. An immutable dapp building on top of CCIP +/// like the example below will inherit the trust properties of CCIP (i.e. the oracle network). +/// @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting +/// new chain family receivers (e.g. a solana encoded receiver address) without upgrading. contract CCIPSender is CCIPClientBase { using SafeERC20 for IERC20; @@ -44,39 +44,24 @@ contract CCIPSender is CCIPClientBase { address feeToken ) public payable validChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: s_chains[destChainSelector].recipient, + receiver: s_chainConfigs[destChainSelector].recipient, data: data, tokenAmounts: tokenAmounts, feeToken: feeToken, - extraArgs: s_chains[destChainSelector].extraArgsBytes + extraArgs: s_chainConfigs[destChainSelector].extraArgsBytes }); - uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); - - // TODO: Decide whether workflow should assume contract is funded with tokens to send already for (uint256 i = 0; i < tokenAmounts.length; ++i) { // Transfer the tokens to pay for tokens in tokenAmounts IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); - - // If they're not sending the fee token, then go ahead and approve - if (tokenAmounts[i].token != feeToken) { - IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount); - } - // If they are sending the feeToken through, and also paying in it, then approve the router for both tokenAmount and the fee() - else if (tokenAmounts[i].token == feeToken && feeToken != address(0)) { - IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), fee); - IERC20(tokenAmounts[i].token).safeApprove(i_ccipRouter, tokenAmounts[i].amount + fee); - } + IERC20(tokenAmounts[i].token).safeIncreaseAllowance(i_ccipRouter, tokenAmounts[i].amount); } - // If the user is paying in the fee token, and is NOT sending it through the bridge, then allowance() should be zero - // and we can send just transferFrom the sender and approve the router. This is because we only approve the router - // for the amount of tokens needed for this transaction, one at a time. - if (feeToken != address(0) && IERC20(feeToken).allowance(address(this), i_ccipRouter) == 0) { + uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); + + if (feeToken != address(0)) { IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); - IERC20(feeToken).safeApprove(i_ccipRouter, fee); - } else if (feeToken == address(0) && msg.value < fee) { - revert IRouterClient.InsufficientFeeTokenAmount(); + IERC20(feeToken).safeIncreaseAllowance(i_ccipRouter, fee); } messageId = diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 5bb7914d93..059fd4cd4e 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -49,8 +49,7 @@ contract PingPongDemo is CCIPClient { ccipSend({ destChainSelector: s_counterpartChainSelector, // destChaio tokenAmounts: new Client.EVMTokenAmount[](0), - data: data, - feeToken: address(s_feeToken) + data: data }); } @@ -82,10 +81,10 @@ contract PingPongDemo is CCIPClient { // Approve the counterpart contract under validSender // s_approvedSenders[counterpartChainSelector][abi.encode(counterpartAddress)] = true; - s_chains[counterpartChainSelector].approvedSender[abi.encode(counterpartAddress)] = true; + s_chainConfigs[counterpartChainSelector].approvedSender[abi.encode(counterpartAddress)] = true; // Approve the counterpart Chain selector under validChain - s_chains[counterpartChainSelector].recipient = abi.encode(counterpartAddress); + s_chainConfigs[counterpartChainSelector].recipient = abi.encode(counterpartAddress); } function setCounterpartChainSelector(uint64 counterpartChainSelector) external onlyOwner { @@ -95,7 +94,7 @@ contract PingPongDemo is CCIPClient { function setCounterpartAddress(address counterpartAddress) external onlyOwner { s_counterpartAddress = counterpartAddress; - s_chains[s_counterpartChainSelector].recipient = abi.encode(counterpartAddress); + s_chainConfigs[s_counterpartChainSelector].recipient = abi.encode(counterpartAddress); } function setPaused(bool pause) external onlyOwner { diff --git a/contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol b/contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol deleted file mode 100644 index d260894395..0000000000 --- a/contracts/src/v0.8/ccip/interfaces/ICCIPClientBase.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface ICCIPClientBase { - error InvalidRouter(address router); - error InvalidChain(uint64 chainSelector); - error InvalidSender(bytes sender); - error InvalidRecipient(bytes recipient); - - struct approvedSenderUpdate { - uint64 destChainSelector; - bytes sender; - } - - function getRouter() external view returns (address); -} diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol index f15a8e001a..6b0c619cea 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol @@ -2,8 +2,9 @@ pragma solidity ^0.8.0; import {CCIPClient} from "../../../applications/external/CCIPClient.sol"; + import {CCIPReceiverWithACK} from "../../../applications/external/CCIPClient.sol"; -import {ICCIPClientBase} from "../../../interfaces/ICCIPClientBase.sol"; +import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; import {IRouterClient} from "../../../interfaces/IRouterClient.sol"; import {Client} from "../../../libraries/Client.sol"; @@ -28,13 +29,11 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { s_sender = new CCIPClient(address(s_sourceRouter), IERC20(s_sourceFeeToken)); s_sender.enableChain(destChainSelector, abi.encode(address(s_sender)), ""); - ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate({ - destChainSelector: destChainSelector, - sender: abi.encode(address(s_sender)) - }); + CCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new CCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = + CCIPClientBase.approvedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_sender))}); - s_sender.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); + s_sender.updateApprovedSenders(senderUpdates, new CCIPClientBase.approvedSenderUpdate[](0)); } function test_ccipReceiveAndSendAck() public { @@ -57,7 +56,7 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { Client.EVM2AnyMessage memory ackMessage = Client.EVM2AnyMessage({ receiver: abi.encode(address(s_sender)), - data: abi.encode(s_sender.ACKMESSAGEMAGICBYTES(), messageId), + data: abi.encode(s_sender.ACK_MESSAGE_HEADER(), messageId), tokenAmounts: destTokenAmounts, feeToken: s_sourceFeeToken, extraArgs: "" @@ -102,12 +101,8 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); - s_sender.ccipSend({ - destChainSelector: DEST_CHAIN_SELECTOR, - tokenAmounts: destTokenAmounts, - data: "", - feeToken: address(s_sourceFeeToken) - }); + s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); + // feeToken: address(s_sourceFeeToken) // Assert that tokens were transfered for bridging + fees assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); @@ -122,19 +117,16 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { // Make sure we give the receiver contract enough tokens like CCIP would. IERC20(token).approve(address(s_sender), type(uint256).max); - bytes32 messageId = s_sender.ccipSend({ - destChainSelector: DEST_CHAIN_SELECTOR, - tokenAmounts: destTokenAmounts, - data: "", - feeToken: address(s_sourceFeeToken) - }); + bytes32 messageId = + s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); + // feeToken: address(s_sourceFeeToken) // The receiver contract will revert if the router is not the sender. vm.startPrank(address(s_sourceRouter)); CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ version: "", - data: abi.encode(s_sender.ACKMESSAGEMAGICBYTES(), messageId), + data: abi.encode(s_sender.ACK_MESSAGE_HEADER(), messageId), messageType: CCIPReceiverWithACK.MessageType.ACK }); @@ -158,27 +150,27 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { ); } - function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); + // function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { + // Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(address(s_sender)), - data: "FAKE_DATA", - tokenAmounts: destTokenAmounts, - feeToken: address(0), - extraArgs: "" - }); + // Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + // receiver: abi.encode(address(s_sender)), + // data: "FAKE_DATA", + // tokenAmounts: destTokenAmounts, + // feeToken: address(0), + // extraArgs: "" + // }); - uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); + // uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); - vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); - s_sender.ccipSend{value: feeTokenAmount / 2}({ - destChainSelector: DEST_CHAIN_SELECTOR, - tokenAmounts: destTokenAmounts, - data: "", - feeToken: address(0) - }); - } + // vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); + // s_sender.ccipSend{value: feeTokenAmount / 2}({ + // destChainSelector: DEST_CHAIN_SELECTOR, + // tokenAmounts: destTokenAmounts, + // data: "", + // feeToken: address(0) + // }); + // } function test_send_tokens_that_are_not_feeToken() public { address token = s_sourceTokens[1]; @@ -204,12 +196,8 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); - s_sender.ccipSend({ - destChainSelector: DEST_CHAIN_SELECTOR, - tokenAmounts: destTokenAmounts, - data: "", - feeToken: address(s_sourceFeeToken) - }); + s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); + // feeToken: address(s_sourceFeeToken) // Assert that tokens were transfered for bridging + fees assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index 95037f3359..c16715537d 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; import {CCIPReceiver} from "../../../applications/external/CCIPReceiver.sol"; -import {ICCIPClientBase} from "../../../interfaces/ICCIPClientBase.sol"; import {Client} from "../../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; @@ -23,13 +23,13 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { s_receiver = new CCIPReceiver(address(s_destRouter)); s_receiver.enableChain(sourceChainSelector, abi.encode(address(1)), ""); - ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate({ + CCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new CCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = CCIPClientBase.approvedSenderUpdate({ destChainSelector: sourceChainSelector, sender: abi.encode(address(s_receiver)) }); - s_receiver.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); + s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.approvedSenderUpdate[](0)); } function test_Recovery_with_intentional_revert() public { @@ -71,7 +71,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageRecovered(messageId); - s_receiver.retryFailedMessage(messageId); + s_receiver.retryFailedMessage(messageId, OWNER); // Assert the tokens have successfully been rescued from the contract. assertEq( @@ -97,7 +97,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageFailed( - messageId, abi.encodeWithSelector(bytes4(ICCIPClientBase.InvalidSender.selector), abi.encode(address(1))) + messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(1))) ); s_receiver.ccipReceive( @@ -177,7 +177,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { // The receiver contract will revert if the router is not the sender. vm.startPrank(address(s_destRouter)); - vm.expectRevert(abi.encodeWithSelector(ICCIPClientBase.InvalidChain.selector, sourceChainSelector)); + vm.expectRevert(abi.encodeWithSelector(CCIPClientBase.InvalidChain.selector, sourceChainSelector)); s_receiver.ccipReceive( Client.Any2EVMMessage({ @@ -191,13 +191,13 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { } function test_removeSender_from_approvedList_and_revert() public { - ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate({ + CCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new CCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = CCIPClientBase.approvedSenderUpdate({ destChainSelector: sourceChainSelector, sender: abi.encode(address(s_receiver)) }); - s_receiver.updateApprovedSenders(new ICCIPClientBase.approvedSenderUpdate[](0), senderUpdates); + s_receiver.updateApprovedSenders(new CCIPClientBase.approvedSenderUpdate[](0), senderUpdates); // assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); assertFalse(s_receiver.isApprovedSender(sourceChainSelector, abi.encode(address(s_receiver)))); @@ -216,7 +216,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageFailed( - messageId, abi.encodeWithSelector(bytes4(ICCIPClientBase.InvalidSender.selector), abi.encode(address(s_receiver))) + messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(s_receiver))) ); s_receiver.ccipReceive( diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol index a18ffee47c..989d07fef1 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; import {CCIPReceiverWithACK} from "../../../applications/external/CCIPReceiverWithACK.sol"; -import {ICCIPClientBase} from "../../../interfaces/ICCIPClientBase.sol"; import {Client} from "../../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; @@ -26,13 +26,13 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { s_receiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); s_receiver.enableChain(destChainSelector, abi.encode(address(s_receiver)), ""); - ICCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new ICCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = ICCIPClientBase.approvedSenderUpdate({ + CCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new CCIPClientBase.approvedSenderUpdate[](1); + senderUpdates[0] = CCIPClientBase.approvedSenderUpdate({ destChainSelector: destChainSelector, sender: abi.encode(address(s_receiver)) }); - s_receiver.updateApprovedSenders(senderUpdates, new ICCIPClientBase.approvedSenderUpdate[](0)); + s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.approvedSenderUpdate[](0)); } function test_ccipReceive_and_respond_with_ack() public { @@ -55,7 +55,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { Client.EVM2AnyMessage memory ackMessage = Client.EVM2AnyMessage({ receiver: abi.encode(address(s_receiver)), - data: abi.encode(s_receiver.ACKMESSAGEMAGICBYTES(), messageId), + data: abi.encode(s_receiver.ACK_MESSAGE_HEADER(), messageId), tokenAmounts: destTokenAmounts, feeToken: s_sourceFeeToken, extraArgs: "" @@ -91,7 +91,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ version: "", - data: abi.encode(s_receiver.ACKMESSAGEMAGICBYTES(), messageId), + data: abi.encode(s_receiver.ACK_MESSAGE_HEADER(), messageId), messageType: CCIPReceiverWithACK.MessageType.ACK }); @@ -115,23 +115,23 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { ); } - function test_ccipReceiver_ack_with_invalidMagicBytes_REVERT() public { + function test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() public { bytes32 messageId = keccak256("messageId"); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); // The receiver contract will revert if the router is not the sender. vm.startPrank(address(s_sourceRouter)); - // Payload with incorrect magic bytes should revert + // Payload with incorrect ack message header should revert CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ version: "", data: abi.encode("RANDOM_BYTES", messageId), messageType: CCIPReceiverWithACK.MessageType.ACK }); - // Expect the processing to revert from invalid magic bytes + // Expect the processing to revert from invalid Ack Message Header vm.expectEmit(); - emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(CCIPReceiverWithACK.InvalidMagicBytes.selector))); + emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(CCIPReceiverWithACK.InvalidAckMessageHeader.selector))); s_receiver.ccipReceive( Client.Any2EVMMessage({ diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol index 6f7b1c57a6..5dda0bf18f 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; import {CCIPSender} from "../../../applications/external/CCIPSender.sol"; -import {ICCIPClientBase} from "../../../interfaces/ICCIPClientBase.sol"; import {Client} from "../../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; @@ -116,26 +116,4 @@ contract CCIPSenderTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); assertEq(OWNER.balance, nativeFeeTokenBalanceBefore - feeTokenAmount); } - - function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { - Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); - - Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - receiver: abi.encode(address(s_sender)), - data: "FAKE_DATA", - tokenAmounts: destTokenAmounts, - feeToken: address(0), - extraArgs: "" - }); - - uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); - - vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); - s_sender.ccipSend{value: feeTokenAmount / 2}({ - destChainSelector: DEST_CHAIN_SELECTOR, - tokenAmounts: destTokenAmounts, - data: "", - feeToken: address(0) - }); - } } diff --git a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol index 7ccf748c6b..ab9f74d16d 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol @@ -26,7 +26,6 @@ contract EtherSenderReceiverHelper is CCIPSender { IWrappedNative public immutable i_weth; - // TODO: Untangle the constructor mess from trying to be both of those at the same time constructor(address router) CCIPSender(router) { i_weth = IWrappedNative(CCIPRouter(router).getWrappedNative()); IERC20(i_weth).safeApprove(router, type(uint256).max); From 938b6d86222cfa1385e2f4909c52bbaba6e876b5 Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 18:27:09 +0000 Subject: [PATCH 21/31] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 88 ++++++++++--------- .../generated/ccipReceiver/ccipReceiver.go | 60 +++++++------ .../ccip/generated/ccipSender/ccipSender.go | 46 +++++----- .../ping_pong_demo/ping_pong_demo.go | 88 ++++++++++--------- .../self_funded_ping_pong.go | 88 ++++++++++--------- ...rapper-dependency-versions-do-not-edit.txt | 12 +-- 6 files changed, 196 insertions(+), 186 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 44de16fc5c..9f3508f4b9 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -30,6 +30,11 @@ var ( _ = abi.ConvertType ) +type CCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -43,14 +48,9 @@ type ClientEVMTokenAmount struct { Amount *big.Int } -type ICCIPClientBaseapprovedSenderUpdate struct { - DestChainSelector uint64 - Sender []byte -} - var CCIPClientMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMagicBytes\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACKMESSAGEMAGICBYTES\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162004558380380620045588339810160408190526200003491620005c8565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000140565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013657620001366001600160a01b03821683600019620001eb565b50505050620006c5565b336001600160a01b038216036200019a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002695750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000241573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000267919062000607565b155b620002dd5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003359185916200033a16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000389906001600160a01b0385169084906200040b565b805190915015620003355780806020019051810190620003aa919062000621565b620003355760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b60606200041c848460008562000424565b949350505050565b606082471015620004875760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b03168587604051620004a5919062000672565b60006040518083038185875af1925050503d8060008114620004e4576040519150601f19603f3d011682016040523d82523d6000602084013e620004e9565b606091505b509092509050620004fd8783838762000508565b979650505050505050565b606083156200057c57825160000362000574576001600160a01b0385163b620005745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b50816200041c565b6200041c8383815115620005935781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000690565b6001600160a01b0381168114620005c557600080fd5b50565b60008060408385031215620005dc57600080fd5b8251620005e981620005af565b6020840151909250620005fc81620005af565b809150509250929050565b6000602082840312156200061a57600080fd5b5051919050565b6000602082840312156200063457600080fd5b815180151581146200064557600080fd5b9392505050565b60005b83811015620006695781810151838201526020016200064f565b50506000910152565b60008251620006868184602087016200064c565b9190910192915050565b6020815260008251806020840152620006b18160408501602087016200064c565b601f01601f19169190910160400192915050565b608051613e3f620007196000396000818161045c015281816105bf0152818161065d01528181610e1b015281816117f5015281816119c801528181611bde0152818161235b01526124270152613e3f6000f3fe60806040526004361061016c5760003560e01c80636939cd97116100ca578063cf6730f811610079578063effde24011610056578063effde240146104e0578063f2fde38b146104f3578063ff2deec31461051357005b8063cf6730f814610480578063d8469e40146104a0578063e4ca8754146104c057005b806385572ffb116100a757806385572ffb146103e15780638da5cb5b14610401578063b0f479a11461044d57005b80636939cd971461037f57806379ba5097146103ac5780638462a2b9146103c157005b806341eade4611610126578063536c6bfa11610103578063536c6bfa146103115780635dc5ebdb146103315780635e35359e1461035f57005b806341eade46146102a35780635075a9d4146102c357806352f813c3146102f157005b806311e85dff1161015457806311e85dff146101eb578063181f5a771461020b5780633a51b79e1461025a57005b806305bfe982146101755780630e958d6b146101bb57005b3661017357005b005b34801561018157600080fd5b506101a5610190366004612cb5565b60086020526000908152604090205460ff1681565b6040516101b29190612cfd565b60405180910390f35b3480156101c757600080fd5b506101db6101d6366004612d9d565b610545565b60405190151581526020016101b2565b3480156101f757600080fd5b50610173610206366004612e24565b61058f565b34801561021757600080fd5b5060408051808201909152601d81527f4343495052656365697665725769746841434b20312e302e302d64657600000060208201525b6040516101b29190612eaf565b34801561026657600080fd5b5061024d6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156102af57600080fd5b506101736102be366004612ec2565b61071f565b3480156102cf57600080fd5b506102e36102de366004612cb5565b61075e565b6040519081526020016101b2565b3480156102fd57600080fd5b5061017361030c366004612eed565b610771565b34801561031d57600080fd5b5061017361032c366004612f0a565b6107aa565b34801561033d57600080fd5b5061035161034c366004612ec2565b6107c0565b6040516101b2929190612f36565b34801561036b57600080fd5b5061017361037a366004612f64565b6108ec565b34801561038b57600080fd5b5061039f61039a366004612cb5565b610915565b6040516101b29190613002565b3480156103b857600080fd5b50610173610b20565b3480156103cd57600080fd5b506101736103dc3660046130db565b610c22565b3480156103ed57600080fd5b506101736103fc366004613147565b610e03565b34801561040d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b2565b34801561045957600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610428565b34801561048c57600080fd5b5061017361049b366004613147565b6110f3565b3480156104ac57600080fd5b506101736104bb366004613182565b611310565b3480156104cc57600080fd5b506101736104db366004612cb5565b611372565b6102e36104ee36600461336b565b6115f0565b3480156104ff57600080fd5b5061017361050e366004612e24565b611ce8565b34801561051f57600080fd5b5060075461042890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020819052604080832090519101906105739085908590613489565b9081526040519081900360200190205460ff1690509392505050565b610597611cfc565b600754610100900473ffffffffffffffffffffffffffffffffffffffff1615610604576106047f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000611d7f565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff851617909455929091041690156106c1576106c17f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611d7f565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b610727611cfc565b67ffffffffffffffff811660009081526002602052604081209061074b8282612c67565b610759600183016000612c67565b505050565b600061076b600483611f7f565b92915050565b610779611cfc565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6107b2611cfc565b6107bc8282611f92565b5050565b6002602052600090815260409020805481906107db90613499565b80601f016020809104026020016040519081016040528092919081815260200182805461080790613499565b80156108545780601f1061082957610100808354040283529160200191610854565b820191906000526020600020905b81548152906001019060200180831161083757829003601f168201915b50505050509080600101805461086990613499565b80601f016020809104026020016040519081016040528092919081815260200182805461089590613499565b80156108e25780601f106108b7576101008083540402835291602001916108e2565b820191906000526020600020905b8154815290600101906020018083116108c557829003601f168201915b5050505050905082565b6108f4611cfc565b61075973ffffffffffffffffffffffffffffffffffffffff841683836120ec565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161098490613499565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090613499565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b50505050508152602001600382018054610a1690613499565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4290613499565b8015610a8f5780601f10610a6457610100808354040283529160200191610a8f565b820191906000526020600020905b815481529060010190602001808311610a7257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b125760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610abd565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c2a611cfc565b60005b81811015610d0d5760026000848484818110610c4b57610c4b6134ec565b9050602002810190610c5d919061351b565b610c6b906020810190612ec2565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610ca257610ca26134ec565b9050602002810190610cb4919061351b565b610cc2906020810190613559565b604051610cd0929190613489565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c2d565b5060005b83811015610dfc57600160026000878785818110610d3157610d316134ec565b9050602002810190610d43919061351b565b610d51906020810190612ec2565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610d8857610d886134ec565b9050602002810190610d9a919061351b565b610da8906020810190613559565b604051610db6929190613489565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d11565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e74576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b9d565b610e846040820160208301612ec2565b610e916040830183613559565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020819052604091829020915191019350610eee92508491506135be565b9081526040519081900360200190205460ff16610f3957806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b9d9190612eaf565b610f496040840160208501612ec2565b67ffffffffffffffff811660009081526002602052604090208054610f6d90613499565b9050600003610fb4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610b9d565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610ff09087906004016136d2565b600060405180830381600087803b15801561100a57600080fd5b505af192505050801561101b575060015b6110c0573d808015611049576040519150601f19603f3d011682016040523d82523d6000602084013e61104e565b606091505b50611060853560015b60049190612142565b5084356000908152600360205260409020859061107d8282613aa4565b50506040518535907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906110b2908490612eaf565b60405180910390a2506110ed565b6040518435907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b50505050565b33301461112c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061113b6060830183613559565b8101906111489190613b9e565b905060008160400151600181111561116257611162612cce565b03611170576107bc82612157565b60018160400151600181111561118857611188612cce565b036107bc5760008082602001518060200190518101906111a89190613c4a565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611240576040517f9f0b03b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561126557611265612cce565b1461129f576040517f3ec8770000000000000000000000000000000000000000000000000000000000815260048101829052602401610b9d565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b611318611cfc565b67ffffffffffffffff8516600090815260026020526040902061133c848683613828565b508015610dfc5767ffffffffffffffff8516600090815260026020526040902060010161136a828483613828565b505050505050565b61137a611cfc565b6001611387600483611f7f565b146113c1576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b9d565b6113cc816000611057565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161141490613499565b80601f016020809104026020016040519081016040528092919081815260200182805461144090613499565b801561148d5780601f106114625761010080835404028352916020019161148d565b820191906000526020600020905b81548152906001019060200180831161147057829003601f168201915b505050505081526020016003820180546114a690613499565b80601f01602080910402602001604051908101604052809291908181526020018280546114d290613499565b801561151f5780601f106114f45761010080835404028352916020019161151f565b820191906000526020600020905b81548152906001019060200180831161150257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156115a25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161154d565b505050508152505090506115b58161250d565b6115c06004836125b3565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff84166000908152600260205260408120805486919061161790613499565b905060000361165e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610b9d565b6040805160a08101825267ffffffffffffffff881660009081526002602052918220805482919061168e90613499565b80601f01602080910402602001604051908101604052809291908181526020018280546116ba90613499565b80156117075780601f106116dc57610100808354040283529160200191611707565b820191906000526020600020905b8154815290600101906020018083116116ea57829003601f168201915b505050505081526020018681526020018781526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600260008a67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101805461176e90613499565b80601f016020809104026020016040519081016040528092919081815260200182805461179a90613499565b80156117e75780601f106117bc576101008083540402835291602001916117e7565b820191906000526020600020905b8154815290600101906020018083116117ca57829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded89846040518363ffffffff1660e01b815260040161184e929190613ccb565b602060405180830381865afa15801561186b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188f9190613d98565b90506000805b8851811015611a505761190533308b84815181106118b5576118b56134ec565b6020026020010151602001518c85815181106118d3576118d36134ec565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125bf909392919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff1689828151811061192e5761192e6134ec565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16148015611972575073ffffffffffffffffffffffffffffffffffffffff871615155b801561199d575060075473ffffffffffffffffffffffffffffffffffffffff88811661010090920416145b156119c357600191506119be3330858c85815181106118d3576118d36134ec565b611a48565b611a487f00000000000000000000000000000000000000000000000000000000000000008a83815181106119f9576119f96134ec565b6020026020010151602001518b8481518110611a1757611a176134ec565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611d7f9092919063ffffffff16565b600101611895565b5080158015611a7e575060075473ffffffffffffffffffffffffffffffffffffffff87811661010090920416145b8015611a9f575073ffffffffffffffffffffffffffffffffffffffff861615155b15611b6d576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b349190613d98565b108015611b415750333014155b15611b6857611b6873ffffffffffffffffffffffffffffffffffffffff87163330856125bf565b611bc7565b73ffffffffffffffffffffffffffffffffffffffff8616158015611b9057508134105b15611bc7576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615611c14576000611c16565b835b8b866040518463ffffffff1660e01b8152600401611c35929190613ccb565b60206040518083038185885af1158015611c53573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611c789190613d98565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a350505050949350505050565b611cf0611cfc565b611cf98161261d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b9d565b565b801580611e1f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1d9190613d98565b155b611eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b9d565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107599084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612712565b6000611f8b838361281e565b9392505050565b80471015611ffc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b9d565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612056576040519150601f19603f3d011682016040523d82523d6000602084013e61205b565b606091505b5050905080610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b9d565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107599084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611efd565b600061214f8484846128a8565b949350505050565b6040805160008082526020820190925281612194565b604080518082019091526000808252602082015281526020019060019003908161216d5790505b50905060006040518060a001604052808480604001906121b49190613559565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926122359288359101613db1565b6040516020818303038152906040528152602001838152602001600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600260008660200160208101906122a49190612ec2565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546122d490613499565b80601f016020809104026020016040519081016040528092919081815260200182805461230090613499565b801561234d5780601f106123225761010080835404028352916020019161234d565b820191906000526020600020905b81548152906001019060200180831161233057829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906123a89190612ec2565b846040518363ffffffff1660e01b81526004016123c6929190613ccb565b602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124079190613d98565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615612462576000612464565b835b6124746040890160208a01612ec2565b866040518463ffffffff1660e01b8152600401612492929190613ccb565b60206040518083038185885af11580156124b0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124d59190613d98565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60005b8160800151518110156107bc57600082608001518281518110612535576125356134ec565b602002602001015160200151905060008360800151838151811061255b5761255b6134ec565b60200260200101516000015190506125a961258b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff831690846120ec565b5050600101612510565b6000611f8b83836128c5565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526110ed9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611efd565b3373ffffffffffffffffffffffffffffffffffffffff82160361269c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b9d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612774826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166128e29092919063ffffffff16565b80519091501561075957808060200190518101906127929190613dd3565b610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b9d565b600081815260028301602052604081205480151580612842575061284284846128f1565b611f8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b9d565b6000828152600284016020526040812082905561214f84846128fd565b60008181526002830160205260408120819055611f8b8383612909565b606061214f8484600085612915565b6000611f8b8383612a2e565b6000611f8b8383612a46565b6000611f8b8383612a95565b6060824710156129a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b9d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516129d091906135be565b60006040518083038185875af1925050503d8060008114612a0d576040519150601f19603f3d011682016040523d82523d6000602084013e612a12565b606091505b5091509150612a2387838387612b88565b979650505050505050565b60008181526001830160205260408120541515611f8b565b6000818152600183016020526040812054612a8d5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561076b565b50600061076b565b60008181526001830160205260408120548015612b7e576000612ab9600183613df0565b8554909150600090612acd90600190613df0565b9050818114612b32576000866000018281548110612aed57612aed6134ec565b9060005260206000200154905080876000018481548110612b1057612b106134ec565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612b4357612b43613e03565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061076b565b600091505061076b565b60608315612c1e578251600003612c175773ffffffffffffffffffffffffffffffffffffffff85163b612c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b9d565b508161214f565b61214f8383815115612c335781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d9190612eaf565b508054612c7390613499565b6000825580601f10612c83575050565b601f016020900490600052602060002090810190611cf991905b80821115612cb15760008155600101612c9d565b5090565b600060208284031215612cc757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612d38577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611cf957600080fd5b60008083601f840112612d6657600080fd5b50813567ffffffffffffffff811115612d7e57600080fd5b602083019150836020828501011115612d9657600080fd5b9250929050565b600080600060408486031215612db257600080fd5b8335612dbd81612d3e565b9250602084013567ffffffffffffffff811115612dd957600080fd5b612de586828701612d54565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611cf957600080fd5b8035612e1f81612df2565b919050565b600060208284031215612e3657600080fd5b8135611f8b81612df2565b60005b83811015612e5c578181015183820152602001612e44565b50506000910152565b60008151808452612e7d816020860160208601612e41565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f8b6020830184612e65565b600060208284031215612ed457600080fd5b8135611f8b81612d3e565b8015158114611cf957600080fd5b600060208284031215612eff57600080fd5b8135611f8b81612edf565b60008060408385031215612f1d57600080fd5b8235612f2881612df2565b946020939093013593505050565b604081526000612f496040830185612e65565b8281036020840152612f5b8185612e65565b95945050505050565b600080600060608486031215612f7957600080fd5b8335612f8481612df2565b92506020840135612f9481612df2565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612ff7578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612fba565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261303c60c0840182612e65565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130788383612e65565b925060808601519150808584030160a086015250612f5b8282612fa5565b60008083601f8401126130a857600080fd5b50813567ffffffffffffffff8111156130c057600080fd5b6020830191508360208260051b8501011115612d9657600080fd5b600080600080604085870312156130f157600080fd5b843567ffffffffffffffff8082111561310957600080fd5b61311588838901613096565b9096509450602087013591508082111561312e57600080fd5b5061313b87828801613096565b95989497509550505050565b60006020828403121561315957600080fd5b813567ffffffffffffffff81111561317057600080fd5b820160a08185031215611f8b57600080fd5b60008060008060006060868803121561319a57600080fd5b85356131a581612d3e565b9450602086013567ffffffffffffffff808211156131c257600080fd5b6131ce89838a01612d54565b909650945060408801359150808211156131e757600080fd5b506131f488828901612d54565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561325757613257613205565b60405290565b6040516060810167ffffffffffffffff8111828210171561325757613257613205565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132c7576132c7613205565b604052919050565b600067ffffffffffffffff8211156132e9576132e9613205565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261332657600080fd5b8135613339613334826132cf565b613280565b81815284602083860101111561334e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561338157600080fd5b843561338c81612d3e565b935060208581013567ffffffffffffffff808211156133aa57600080fd5b818801915088601f8301126133be57600080fd5b8135818111156133d0576133d0613205565b6133de848260051b01613280565b81815260069190911b8301840190848101908b8311156133fd57600080fd5b938501935b82851015613449576040858d03121561341b5760008081fd5b613423613234565b853561342e81612df2565b81528587013587820152825260409094019390850190613402565b97505050604088013592508083111561346157600080fd5b505061346f87828801613315565b92505061347e60608601612e14565b905092959194509250565b8183823760009101908152919050565b600181811c908216806134ad57607f821691505b6020821081036134e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261354f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261358e57600080fd5b83018035915067ffffffffffffffff8211156135a957600080fd5b602001915036819003821315612d9657600080fd5b6000825161354f818460208701612e41565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261360557600080fd5b830160208101925035905067ffffffffffffffff81111561362557600080fd5b803603821315612d9657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612ff75781356136a081612df2565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161368d565b6020815281356020820152600060208301356136ed81612d3e565b67ffffffffffffffff808216604085015261370b60408601866135d0565b925060a0606086015261372260c086018483613634565b92505061373260608601866135d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613768858385613634565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126137a157600080fd5b602092880192830192359150838211156137ba57600080fd5b8160061b36038313156137cc57600080fd5b8685030160a0870152612a2384828461367d565b601f821115610759576000816000526020600020601f850160051c810160208610156138095750805b601f850160051c820191505b8181101561136a57828155600101613815565b67ffffffffffffffff83111561384057613840613205565b6138548361384e8354613499565b836137e0565b6000601f8411600181146138a657600085156138705750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610dfc565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156138f557868501358255602094850194600190920191016138d5565b5086821015613930577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561397c81612df2565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156139e2576139e2613205565b805483825580841015613a6f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a2357613a23613942565b8086168614613a3457613a34613942565b5060008360005260206000208360011b81018760011b820191505b80821015613a6a578282558284830155600282019150613a4f565b505050505b5060008181526020812083915b8581101561136a57613a8e8383613971565b6040929092019160029190910190600101613a7c565b81358155600181016020830135613aba81612d3e565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613afa6040860186613559565b93509150613b0c838360028701613828565b613b196060860186613559565b93509150613b2b838360038701613828565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613b6257600080fd5b918401918235915080821115613b7757600080fd5b506020820191508060061b3603821315613b9057600080fd5b6110ed8183600486016139c9565b600060208284031215613bb057600080fd5b813567ffffffffffffffff80821115613bc857600080fd5b9083019060608286031215613bdc57600080fd5b613be461325d565b823582811115613bf357600080fd5b613bff87828601613315565b825250602083013582811115613c1457600080fd5b613c2087828601613315565b6020830152506040830135925060028310613c3a57600080fd5b6040810192909252509392505050565b60008060408385031215613c5d57600080fd5b825167ffffffffffffffff811115613c7457600080fd5b8301601f81018513613c8557600080fd5b8051613c93613334826132cf565b818152866020838501011115613ca857600080fd5b613cb9826020830160208601612e41565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613cf760e0840182612e65565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613d338383612e65565b92506040860151915080858403016080860152613d508383612fa5565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613d8e8282612e65565b9695505050505050565b600060208284031215613daa57600080fd5b5051919050565b604081526000613dc46040830185612e65565b90508260208301529392505050565b600060208284031215613de557600080fd5b8151611f8b81612edf565b8181038181111561076b5761076b613942565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"forwardingAddress\",\"type\":\"address\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b506040516200457238038062004572833981016040819052620000349162000564565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000140565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013657620001366001600160a01b03821683600019620001eb565b5050505062000689565b336001600160a01b038216036200019a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002639190620005a3565b6200026f9190620005bd565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002cb91869190620002d116565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000320906001600160a01b038516908490620003a7565b805190915015620003a25780806020019051810190620003419190620005e5565b620003a25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b88484600085620003c0565b949350505050565b606082471015620004235760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b0316858760405162000441919062000636565b60006040518083038185875af1925050503d806000811462000480576040519150601f19603f3d011682016040523d82523d6000602084013e62000485565b606091505b5090925090506200049987838387620004a4565b979650505050505050565b606083156200051857825160000362000510576001600160a01b0385163b620005105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b8565b620003b883838151156200052f5781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000654565b6001600160a01b03811681146200056157600080fd5b50565b600080604083850312156200057857600080fd5b825162000585816200054b565b602084015190925062000598816200054b565b809150509250929050565b600060208284031215620005b657600080fd5b5051919050565b80820180821115620005df57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f857600080fd5b815180151581146200060957600080fd5b9392505050565b60005b838110156200062d57818101518382015260200162000613565b50506000910152565b600082516200064a81846020870162000610565b9190910192915050565b60208152600082518060208401526200067581604085016020870162000610565b601f01601f19169190910160400192915050565b608051613e95620006dd600039600081816104a1015281816105e501528181610683015281816111130152818161198f01528181611a5801528181611b3a0152818161246a01526125360152613e956000f3fe6080604052600436106101845760003560e01c80636939cd97116100d6578063b0f479a11161007f578063e89b448511610059578063e89b448514610505578063f2fde38b14610518578063ff2deec3146105385761018b565b8063b0f479a114610492578063cf6730f8146104c5578063d8469e40146104e55761018b565b80638462a2b9116100b05780638462a2b91461040657806385572ffb146104265780638da5cb5b146104465761018b565b80636939cd971461037b5780636fef519e146103a857806379ba5097146103f15761018b565b8063369f7f661161013857806352f813c31161011257806352f813c31461031b578063536c6bfa1461033b5780635e35359e1461035b5761018b565b8063369f7f66146102ad57806341eade46146102cd5780635075a9d4146102ed5761018b565b806311e85dff1161016957806311e85dff1461020f578063181f5a771461022f57806335f170ef1461027e5761018b565b806305bfe982146101995780630e958d6b146101df5761018b565b3661018b57005b34801561019757600080fd5b005b3480156101a557600080fd5b506101c96101b4366004612cc4565b60086020526000908152604090205460ff1681565b6040516101d69190612d0c565b60405180910390f35b3480156101eb57600080fd5b506101ff6101fa366004612dac565b61056a565b60405190151581526020016101d6565b34801561021b57600080fd5b5061019761022a366004612e23565b6105b5565b34801561023b57600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101d69190612eae565b34801561028a57600080fd5b5061029e610299366004612ec1565b610745565b6040516101d693929190612ede565b3480156102b957600080fd5b506101976102c8366004612f15565b61087c565b3480156102d957600080fd5b506101976102e8366004612ec1565b610b37565b3480156102f957600080fd5b5061030d610308366004612cc4565b610b82565b6040519081526020016101d6565b34801561032757600080fd5b50610197610336366004612f53565b610b95565b34801561034757600080fd5b50610197610356366004612f70565b610bce565b34801561036757600080fd5b50610197610376366004612f9c565b610be4565b34801561038757600080fd5b5061039b610396366004612cc4565b610c12565b6040516101d6919061303a565b3480156103b457600080fd5b506102716040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103fd57600080fd5b50610197610e1d565b34801561041257600080fd5b5061019761042136600461311c565b610f1a565b34801561043257600080fd5b50610197610441366004613188565b6110fb565b34801561045257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d6565b34801561049e57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061046d565b3480156104d157600080fd5b506101976104e0366004613188565b6113f6565b3480156104f157600080fd5b506101976105003660046131c3565b611613565b61030d6105133660046133ac565b611694565b34801561052457600080fd5b50610197610533366004612e23565b611c48565b34801561054457600080fd5b5060075461046d90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061059990859085906134b9565b9081526040519081900360200190205460ff1690509392505050565b6105bd611c5c565b600754610100900473ffffffffffffffffffffffffffffffffffffffff161561062a5761062a7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000611cdf565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff851617909455929091041690156106e7576106e77f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611edf565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff909216929161076b906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610797906134c9565b80156107e45780601f106107b9576101008083540402835291602001916107e4565b820191906000526020600020905b8154815290600101906020018083116107c757829003601f168201915b5050505050908060020180546107f9906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610825906134c9565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b5050505050905083565b610884611c5c565b6001610891600484611fe3565b146108d0576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108e08260005b60049190611ff6565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610928906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610954906134c9565b80156109a15780601f10610976576101008083540402835291602001916109a1565b820191906000526020600020905b81548152906001019060200180831161098457829003601f168201915b505050505081526020016003820180546109ba906134c9565b80601f01602080910402602001604051908101604052809291908181526020018280546109e6906134c9565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610ab65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a61565b505050915250506040805173ffffffffffffffffffffffffffffffffffffffff85166020820152919250610afb9183910160405160208183030381529060405261200b565b610b066004846120aa565b5060405183907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a2505050565b610b3f611c5c565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610b8f600483611fe3565b92915050565b610b9d611c5c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610bd6611c5c565b610be082826120b6565b5050565b610bec611c5c565b610c0d73ffffffffffffffffffffffffffffffffffffffff84168383612210565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c81906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad906134c9565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b50505050508152602001600382018054610d13906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3f906134c9565b8015610d8c5780601f10610d6157610100808354040283529160200191610d8c565b820191906000526020600020905b815481529060010190602001808311610d6f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e0f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dba565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108c7565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f22611c5c565b60005b818110156110055760026000848484818110610f4357610f4361351c565b9050602002810190610f55919061354b565b610f63906020810190612ec1565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9a57610f9a61351c565b9050602002810190610fac919061354b565b610fba906020810190613589565b604051610fc89291906134b9565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f25565b5060005b838110156110f4576001600260008787858181106110295761102961351c565b905060200281019061103b919061354b565b611049906020810190612ec1565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106110805761108061351c565b9050602002810190611092919061354b565b6110a0906020810190613589565b6040516110ae9291906134b9565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611009565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116c576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108c7565b61117c6040820160208301612ec1565b6111896040830183613589565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e792508491506135ee565b9081526040519081900360200190205460ff1661123257806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108c79190612eae565b6112426040840160208501612ec1565b67ffffffffffffffff8116600090815260026020526040902060018101805461126a906134c9565b159050806112795750805460ff165b156112bc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108c7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112f8908890600401613702565b600060405180830381600087803b15801561131257600080fd5b505af1925050508015611323575060015b6113c3573d808015611351576040519150601f19603f3d011682016040523d82523d6000602084013e611356565b606091505b50611363863560016108d7565b508535600090815260036020526040902086906113808282613ad4565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b5908490612eae565b60405180910390a2506110f4565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b33301461142f576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061143e6060830183613589565b81019061144b9190613bce565b905060008160400151600181111561146557611465612cdd565b0361147357610be082612266565b60018160400151600181111561148b5761148b612cdd565b03610be05760008082602001518060200190518101906114ab9190613c7a565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611543576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156857611568612cdd565b146115a2576040517f3ec87700000000000000000000000000000000000000000000000000000000008152600481018290526024016108c7565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161b611c5c565b67ffffffffffffffff8516600090815260026020526040902060018101611643858783613858565b50811561165b5760028101611659838583613858565b505b805460ff161561168c5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b67ffffffffffffffff83166000908152600260205260408120600181018054869291906116c0906134c9565b159050806116cf5750805460ff165b15611712576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108c7565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611745906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054611771906134c9565b80156117be5780601f10611793576101008083540402835291602001916117be565b820191906000526020600020905b8154815290600101906020018083116117a157829003601f168201915b5050509183525050602080820188905260408083018a9052600754610100900473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611822906134c9565b80601f016020809104026020016040519081016040528092919081815260200182805461184e906134c9565b801561189b5780601f106118705761010080835404028352916020019161189b565b820191906000526020600020905b81548152906001019060200180831161187e57829003601f168201915b5050505050815250905060005b8651811015611a175761191833308984815181106118c8576118c861351c565b6020026020010151602001518a85815181106118e6576118e661351c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661261c909392919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168782815181106119635761196361351c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611a0f57611a0f7f00000000000000000000000000000000000000000000000000000000000000008883815181106119c0576119c061351c565b6020026020010151602001518984815181106119de576119de61351c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611edf9092919063ffffffff16565b6001016118a8565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611a8f908b908690600401613cfb565b602060405180830381865afa158015611aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad09190613dbe565b600754909150610100900473ffffffffffffffffffffffffffffffffffffffff1615611b2057600754611b2090610100900473ffffffffffffffffffffffffffffffffffffffff1633308461261c565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615611b75576000611b77565b825b8a856040518463ffffffff1660e01b8152600401611b96929190613cfb565b60206040518083038185885af1158015611bb4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bd99190613dbe565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611c50611c5c565b611c598161267a565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108c7565b565b801580611d7f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7d9190613dbe565b155b611e0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108c7565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c0d9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261276f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015611f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7a9190613dbe565b611f849190613dd7565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611fdd9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611e5d565b50505050565b6000611fef838361287b565b9392505050565b6000612003848484612905565b949350505050565b6000818060200190518101906120219190613dea565b905060005b836080015151811015611fdd5760008460800151828151811061204b5761204b61351c565b60200260200101516020015190506000856080015183815181106120715761207161351c565b60209081029190910101515190506120a073ffffffffffffffffffffffffffffffffffffffff82168584612210565b5050600101612026565b6000611fef8383612922565b80471015612120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108c7565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461217a576040519150601f19603f3d011682016040523d82523d6000602084013e61217f565b606091505b5050905080610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108c7565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c0d9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611e5d565b60408051600080825260208201909252816122a3565b604080518082019091526000808252602082015281526020019060019003908161227c5790505b50905060006040518060a001604052808480604001906122c39190613589565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926123449288359101613e07565b6040516020818303038152906040528152602001838152602001600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600260008660200160208101906123b39190612ec1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020180546123e3906134c9565b80601f016020809104026020016040519081016040528092919081815260200182805461240f906134c9565b801561245c5780601f106124315761010080835404028352916020019161245c565b820191906000526020600020905b81548152906001019060200180831161243f57829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906124b79190612ec1565b846040518363ffffffff1660e01b81526004016124d5929190613cfb565b602060405180830381865afa1580156124f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125169190613dbe565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615612571576000612573565b835b6125836040890160208a01612ec1565b866040518463ffffffff1660e01b81526004016125a1929190613cfb565b60206040518083038185885af11580156125bf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125e49190613dbe565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611fdd9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611e5d565b3373ffffffffffffffffffffffffffffffffffffffff8216036126f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108c7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006127d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661293f9092919063ffffffff16565b805190915015610c0d57808060200190518101906127ef9190613e29565b610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108c7565b60008181526002830160205260408120548015158061289f575061289f848461294e565b611fef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016108c7565b60008281526002840160205260408120829055612003848461295a565b60008181526002830160205260408120819055611fef8383612966565b60606120038484600085612972565b6000611fef8383612a8b565b6000611fef8383612aa3565b6000611fef8383612af2565b606082471015612a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108c7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612a2d91906135ee565b60006040518083038185875af1925050503d8060008114612a6a576040519150601f19603f3d011682016040523d82523d6000602084013e612a6f565b606091505b5091509150612a8087838387612be5565b979650505050505050565b60008181526001830160205260408120541515611fef565b6000818152600183016020526040812054612aea57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b8f565b506000610b8f565b60008181526001830160205260408120548015612bdb576000612b16600183613e46565b8554909150600090612b2a90600190613e46565b9050818114612b8f576000866000018281548110612b4a57612b4a61351c565b9060005260206000200154905080876000018481548110612b6d57612b6d61351c565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ba057612ba0613e59565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b8f565b6000915050610b8f565b60608315612c7b578251600003612c745773ffffffffffffffffffffffffffffffffffffffff85163b612c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108c7565b5081612003565b6120038383815115612c905781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c79190612eae565b600060208284031215612cd657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612d47577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611c5957600080fd5b60008083601f840112612d7557600080fd5b50813567ffffffffffffffff811115612d8d57600080fd5b602083019150836020828501011115612da557600080fd5b9250929050565b600080600060408486031215612dc157600080fd5b8335612dcc81612d4d565b9250602084013567ffffffffffffffff811115612de857600080fd5b612df486828701612d63565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611c5957600080fd5b600060208284031215612e3557600080fd5b8135611fef81612e01565b60005b83811015612e5b578181015183820152602001612e43565b50506000910152565b60008151808452612e7c816020860160208601612e40565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fef6020830184612e64565b600060208284031215612ed357600080fd5b8135611fef81612d4d565b8315158152606060208201526000612ef96060830185612e64565b8281036040840152612f0b8185612e64565b9695505050505050565b60008060408385031215612f2857600080fd5b823591506020830135612f3a81612e01565b809150509250929050565b8015158114611c5957600080fd5b600060208284031215612f6557600080fd5b8135611fef81612f45565b60008060408385031215612f8357600080fd5b8235612f8e81612e01565b946020939093013593505050565b600080600060608486031215612fb157600080fd5b8335612fbc81612e01565b92506020840135612fcc81612e01565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561302f578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612ff2565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261307460c0840182612e64565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130b08383612e64565b925060808601519150808584030160a0860152506130ce8282612fdd565b95945050505050565b60008083601f8401126130e957600080fd5b50813567ffffffffffffffff81111561310157600080fd5b6020830191508360208260051b8501011115612da557600080fd5b6000806000806040858703121561313257600080fd5b843567ffffffffffffffff8082111561314a57600080fd5b613156888389016130d7565b9096509450602087013591508082111561316f57600080fd5b5061317c878288016130d7565b95989497509550505050565b60006020828403121561319a57600080fd5b813567ffffffffffffffff8111156131b157600080fd5b820160a08185031215611fef57600080fd5b6000806000806000606086880312156131db57600080fd5b85356131e681612d4d565b9450602086013567ffffffffffffffff8082111561320357600080fd5b61320f89838a01612d63565b9096509450604088013591508082111561322857600080fd5b5061323588828901612d63565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561329857613298613246565b60405290565b6040516060810167ffffffffffffffff8111828210171561329857613298613246565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561330857613308613246565b604052919050565b600067ffffffffffffffff82111561332a5761332a613246565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261336757600080fd5b813561337a61337582613310565b6132c1565b81815284602083860101111561338f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156133c157600080fd5b83356133cc81612d4d565b925060208481013567ffffffffffffffff808211156133ea57600080fd5b818701915087601f8301126133fe57600080fd5b81358181111561341057613410613246565b61341e848260051b016132c1565b81815260069190911b8301840190848101908a83111561343d57600080fd5b938501935b82851015613489576040858c03121561345b5760008081fd5b613463613275565b853561346e81612e01565b81528587013587820152825260409094019390850190613442565b9650505060408701359250808311156134a157600080fd5b50506134af86828701613356565b9150509250925092565b8183823760009101908152919050565b600181811c908216806134dd57607f821691505b602082108103613516577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261357f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135be57600080fd5b83018035915067ffffffffffffffff8211156135d957600080fd5b602001915036819003821315612da557600080fd5b6000825161357f818460208701612e40565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261363557600080fd5b830160208101925035905067ffffffffffffffff81111561365557600080fd5b803603821315612da557600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561302f5781356136d081612e01565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016136bd565b60208152813560208201526000602083013561371d81612d4d565b67ffffffffffffffff808216604085015261373b6040860186613600565b925060a0606086015261375260c086018483613664565b9250506137626060860186613600565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613798858385613664565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126137d157600080fd5b602092880192830192359150838211156137ea57600080fd5b8160061b36038313156137fc57600080fd5b8685030160a0870152612a808482846136ad565b601f821115610c0d576000816000526020600020601f850160051c810160208610156138395750805b601f850160051c820191505b8181101561168c57828155600101613845565b67ffffffffffffffff83111561387057613870613246565b6138848361387e83546134c9565b83613810565b6000601f8411600181146138d657600085156138a05750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f4565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139255786850135825560209485019460019092019101613905565b5086821015613960577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139ac81612e01565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a1257613a12613246565b805483825580841015613a9f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a5357613a53613972565b8086168614613a6457613a64613972565b5060008360005260206000208360011b81018760011b820191505b80821015613a9a578282558284830155600282019150613a7f565b505050505b5060008181526020812083915b8581101561168c57613abe83836139a1565b6040929092019160029190910190600101613aac565b81358155600181016020830135613aea81612d4d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b2a6040860186613589565b93509150613b3c838360028701613858565b613b496060860186613589565b93509150613b5b838360038701613858565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613b9257600080fd5b918401918235915080821115613ba757600080fd5b506020820191508060061b3603821315613bc057600080fd5b611fdd8183600486016139f9565b600060208284031215613be057600080fd5b813567ffffffffffffffff80821115613bf857600080fd5b9083019060608286031215613c0c57600080fd5b613c1461329e565b823582811115613c2357600080fd5b613c2f87828601613356565b825250602083013582811115613c4457600080fd5b613c5087828601613356565b6020830152506040830135925060028310613c6a57600080fd5b6040810192909252509392505050565b60008060408385031215613c8d57600080fd5b825167ffffffffffffffff811115613ca457600080fd5b8301601f81018513613cb557600080fd5b8051613cc361337582613310565b818152866020838501011115613cd857600080fd5b613ce9826020830160208601612e40565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d2760e0840182612e64565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613d638383612e64565b92506040860151915080858403016080860152613d808383612fdd565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f0b8282612e64565b600060208284031215613dd057600080fd5b5051919050565b80820180821115610b8f57610b8f613972565b600060208284031215613dfc57600080fd5b8151611fef81612e01565b604081526000613e1a6040830185612e64565b90508260208301529392505050565b600060208284031215613e3b57600080fd5b8151611fef81612f45565b81810381811115610b8f57610b8f613972565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -189,9 +189,9 @@ func (_CCIPClient *CCIPClientTransactorRaw) Transact(opts *bind.TransactOpts, me return _CCIPClient.Contract.contract.Transact(opts, method, params...) } -func (_CCIPClient *CCIPClientCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) { +func (_CCIPClient *CCIPClientCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) { var out []interface{} - err := _CCIPClient.contract.Call(opts, &out, "ACKMESSAGEMAGICBYTES") + err := _CCIPClient.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { return *new([]byte), err @@ -203,12 +203,12 @@ func (_CCIPClient *CCIPClientCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ( } -func (_CCIPClient *CCIPClientSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { - return _CCIPClient.Contract.ACKMESSAGEMAGICBYTES(&_CCIPClient.CallOpts) +func (_CCIPClient *CCIPClientSession) ACKMESSAGEHEADER() ([]byte, error) { + return _CCIPClient.Contract.ACKMESSAGEHEADER(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientCallerSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { - return _CCIPClient.Contract.ACKMESSAGEMAGICBYTES(&_CCIPClient.CallOpts) +func (_CCIPClient *CCIPClientCallerSession) ACKMESSAGEHEADER() ([]byte, error) { + return _CCIPClient.Contract.ACKMESSAGEHEADER(&_CCIPClient.CallOpts) } func (_CCIPClient *CCIPClientCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { @@ -321,34 +321,35 @@ func (_CCIPClient *CCIPClientCallerSession) Owner() (common.Address, error) { return _CCIPClient.Contract.Owner(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, +func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPClient.contract.Call(opts, &out, "s_chains", arg0) + err := _CCIPClient.contract.Call(opts, &out, "s_chainConfigs", arg0) - outstruct := new(SChains) + outstruct := new(SChainConfigs) if err != nil { return *outstruct, err } - outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) - outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) return *outstruct, err } -func (_CCIPClient *CCIPClientSession) SChains(arg0 uint64) (SChains, +func (_CCIPClient *CCIPClientSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _CCIPClient.Contract.SChains(&_CCIPClient.CallOpts, arg0) + return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, arg0) } -func (_CCIPClient *CCIPClientCallerSession) SChains(arg0 uint64) (SChains, +func (_CCIPClient *CCIPClientCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _CCIPClient.Contract.SChains(&_CCIPClient.CallOpts, arg0) + return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, arg0) } func (_CCIPClient *CCIPClientCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -441,16 +442,16 @@ func (_CCIPClient *CCIPClientTransactorSession) CcipReceive(message ClientAny2EV return _CCIPClient.Contract.CcipReceive(&_CCIPClient.TransactOpts, message) } -func (_CCIPClient *CCIPClientTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data, feeToken) +func (_CCIPClient *CCIPClientTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data) } -func (_CCIPClient *CCIPClientSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.CcipSend(&_CCIPClient.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +func (_CCIPClient *CCIPClientSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _CCIPClient.Contract.CcipSend(&_CCIPClient.TransactOpts, destChainSelector, tokenAmounts, data) } -func (_CCIPClient *CCIPClientTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.CcipSend(&_CCIPClient.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +func (_CCIPClient *CCIPClientTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _CCIPClient.Contract.CcipSend(&_CCIPClient.TransactOpts, destChainSelector, tokenAmounts, data) } func (_CCIPClient *CCIPClientTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { @@ -501,16 +502,16 @@ func (_CCIPClient *CCIPClientTransactorSession) ProcessMessage(message ClientAny return _CCIPClient.Contract.ProcessMessage(&_CCIPClient.TransactOpts, message) } -func (_CCIPClient *CCIPClientTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "retryFailedMessage", messageId) +func (_CCIPClient *CCIPClientTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "retryFailedMessage", messageId, forwardingAddress) } -func (_CCIPClient *CCIPClientSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId) +func (_CCIPClient *CCIPClientSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId, forwardingAddress) } -func (_CCIPClient *CCIPClientTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId) +func (_CCIPClient *CCIPClientTransactorSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId, forwardingAddress) } func (_CCIPClient *CCIPClientTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { @@ -537,15 +538,15 @@ func (_CCIPClient *CCIPClientTransactorSession) TransferOwnership(to common.Addr return _CCIPClient.Contract.TransferOwnership(&_CCIPClient.TransactOpts, to) } -func (_CCIPClient *CCIPClientTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPClient *CCIPClientTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_CCIPClient *CCIPClientSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPClient *CCIPClientSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) } -func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) } @@ -1757,7 +1758,8 @@ func (_CCIPClient *CCIPClientFilterer) ParseOwnershipTransferred(log types.Log) return event, nil } -type SChains struct { +type SChainConfigs struct { + IsDisabled bool Recipient []byte ExtraArgsBytes []byte } @@ -1829,7 +1831,7 @@ func (_CCIPClient *CCIPClient) Address() common.Address { } type CCIPClientInterface interface { - ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) + ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) @@ -1841,7 +1843,7 @@ type CCIPClientInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) @@ -1855,7 +1857,7 @@ type CCIPClientInterface interface { CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) @@ -1865,13 +1867,13 @@ type CCIPClientInterface interface { ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go index d37361a365..b196d2ec3f 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -30,6 +30,11 @@ var ( _ = abi.ConvertType ) +type CCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -43,14 +48,9 @@ type ClientEVMTokenAmount struct { Amount *big.Int } -type ICCIPClientBaseapprovedSenderUpdate struct { - DestChainSelector uint64 - Sender []byte -} - var CCIPReceiverMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620029e6380380620029e68339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b6080516127e9620001fd6000396000818161035e0152610b4801526127e96000f3fe60806040526004361061011b5760003560e01c806379ba50971161009c578063b0f479a11161006e578063d8469e4011610056578063d8469e40146103a2578063e4ca8754146103c2578063f2fde38b146103e257005b8063b0f479a11461034f578063cf6730f81461038257005b806379ba5097146102ae5780638462a2b9146102c357806385572ffb146102e35780638da5cb5b1461030357005b806352f813c3116100ed5780635dc5ebdb116100d55780635dc5ebdb146102335780635e35359e146102615780636939cd971461028157005b806352f813c3146101f3578063536c6bfa1461021357005b80630e958d6b14610124578063181f5a771461015957806341eade46146101a55780635075a9d4146101c557005b3661012257005b005b34801561013057600080fd5b5061014461013f366004611bc1565b610402565b60405190151581526020015b60405180910390f35b34801561016557600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101509190611c84565b3480156101b157600080fd5b506101226101c0366004611c97565b61044c565b3480156101d157600080fd5b506101e56101e0366004611cb4565b61048b565b604051908152602001610150565b3480156101ff57600080fd5b5061012261020e366004611cdb565b61049e565b34801561021f57600080fd5b5061012261022e366004611d1a565b6104d7565b34801561023f57600080fd5b5061025361024e366004611c97565b6104ed565b604051610150929190611d46565b34801561026d57600080fd5b5061012261027c366004611d74565b610619565b34801561028d57600080fd5b506102a161029c366004611cb4565b610642565b6040516101509190611db5565b3480156102ba57600080fd5b5061012261084d565b3480156102cf57600080fd5b506101226102de366004611ee1565b61094f565b3480156102ef57600080fd5b506101226102fe366004611f4d565b610b30565b34801561030f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610150565b34801561035b57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061032a565b34801561038e57600080fd5b5061012261039d366004611f4d565b610d57565b3480156103ae57600080fd5b506101226103bd366004611f88565b610e92565b3480156103ce57600080fd5b506101226103dd366004611cb4565b610ef4565b3480156103ee57600080fd5b506101226103fd36600461200b565b611172565b67ffffffffffffffff8316600090815260026020819052604080832090519101906104309085908590612028565b9081526040519081900360200190205460ff1690509392505050565b610454611186565b67ffffffffffffffff81166000908152600260205260408120906104788282611b14565b610486600183016000611b14565b505050565b6000610498600483611209565b92915050565b6104a6611186565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6104df611186565b6104e9828261121c565b5050565b60026020526000908152604090208054819061050890612038565b80601f016020809104026020016040519081016040528092919081815260200182805461053490612038565b80156105815780601f1061055657610100808354040283529160200191610581565b820191906000526020600020905b81548152906001019060200180831161056457829003601f168201915b50505050509080600101805461059690612038565b80601f01602080910402602001604051908101604052809291908181526020018280546105c290612038565b801561060f5780601f106105e45761010080835404028352916020019161060f565b820191906000526020600020905b8154815290600101906020018083116105f257829003601f168201915b5050505050905082565b610621611186565b61048673ffffffffffffffffffffffffffffffffffffffff84168383611376565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106b190612038565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90612038565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b5050505050815260200160038201805461074390612038565b80601f016020809104026020016040519081016040528092919081815260200182805461076f90612038565b80156107bc5780601f10610791576101008083540402835291602001916107bc565b820191906000526020600020905b81548152906001019060200180831161079f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561083f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107ea565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146108d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610957611186565b60005b81811015610a3a57600260008484848181106109785761097861208b565b905060200281019061098a91906120ba565b610998906020810190611c97565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106109cf576109cf61208b565b90506020028101906109e191906120ba565b6109ef9060208101906120f8565b6040516109fd929190612028565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560010161095a565b5060005b83811015610b2957600160026000878785818110610a5e57610a5e61208b565b9050602002810190610a7091906120ba565b610a7e906020810190611c97565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610ab557610ab561208b565b9050602002810190610ac791906120ba565b610ad59060208101906120f8565b604051610ae3929190612028565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610a3e565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610ba1576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108ca565b610bb16040820160208301611c97565b67ffffffffffffffff811660009081526002602052604090208054610bd590612038565b9050600003610c1c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108ca565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610c5890859060040161226a565b600060405180830381600087803b158015610c7257600080fd5b505af1925050508015610c83575060015b610d27573d808015610cb1576040519150601f19603f3d011682016040523d82523d6000602084013e610cb6565b606091505b50610cc8833560015b60049190611403565b50823560009081526003602052604090208390610ce5828261266b565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610d1a908490611c84565b60405180910390a2505050565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b333014610d90576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da06040820160208301611c97565b610dad60408301836120f8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020819052604091829020915191019350610e0a925084915061276b565b9081526040519081900360200190205460ff16610e5557806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108ca9190611c84565b60075460ff1615610486576040517f79f79e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9a611186565b67ffffffffffffffff85166000908152600260205260409020610ebe8486836123ef565b508015610b295767ffffffffffffffff85166000908152600260205260409020600101610eec8284836123ef565b505050505050565b610efc611186565b6001610f09600483611209565b14610f43576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016108ca565b610f4e816000610cbf565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610f9690612038565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc290612038565b801561100f5780601f10610fe45761010080835404028352916020019161100f565b820191906000526020600020905b815481529060010190602001808311610ff257829003601f168201915b5050505050815260200160038201805461102890612038565b80601f016020809104026020016040519081016040528092919081815260200182805461105490612038565b80156110a15780601f10611076576101008083540402835291602001916110a1565b820191906000526020600020905b81548152906001019060200180831161108457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156111245760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016110cf565b5050505081525050905061113781611418565b6111426004836114be565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b61117a611186565b611183816114ca565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108ca565b565b600061121583836115bf565b9392505050565b80471015611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108ca565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146112e0576040519150601f19603f3d011682016040523d82523d6000602084013e6112e5565b606091505b5050905080610486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108ca565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610486908490611649565b6000611410848484611755565b949350505050565b60005b8160800151518110156104e9576000826080015182815181106114405761144061208b565b60200260200101516020015190506000836080015183815181106114665761146661208b565b60200260200101516000015190506114b461149660005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff83169084611376565b505060010161141b565b60006112158383611772565b3373ffffffffffffffffffffffffffffffffffffffff821603611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108ca565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054801515806115e357506115e3848461178f565b611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016108ca565b60006116ab826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661179b9092919063ffffffff16565b80519091501561048657808060200190518101906116c9919061277d565b610486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108ca565b6000828152600284016020526040812082905561141084846117aa565b6000818152600283016020526040812081905561121583836117b6565b600061121583836117c2565b606061141084846000856117da565b600061121583836118f3565b60006112158383611942565b60008181526001830160205260408120541515611215565b60608247101561186c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108ca565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611895919061276b565b60006040518083038185875af1925050503d80600081146118d2576040519150601f19603f3d011682016040523d82523d6000602084013e6118d7565b606091505b50915091506118e887838387611a35565b979650505050505050565b600081815260018301602052604081205461193a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610498565b506000610498565b60008181526001830160205260408120548015611a2b57600061196660018361279a565b855490915060009061197a9060019061279a565b90508181146119df57600086600001828154811061199a5761199a61208b565b90600052602060002001549050808760000184815481106119bd576119bd61208b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806119f0576119f06127ad565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610498565b6000915050610498565b60608315611acb578251600003611ac45773ffffffffffffffffffffffffffffffffffffffff85163b611ac4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108ca565b5081611410565b6114108383815115611ae05781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca9190611c84565b508054611b2090612038565b6000825580601f10611b30575050565b601f01602090049060005260206000209081019061118391905b80821115611b5e5760008155600101611b4a565b5090565b67ffffffffffffffff8116811461118357600080fd5b60008083601f840112611b8a57600080fd5b50813567ffffffffffffffff811115611ba257600080fd5b602083019150836020828501011115611bba57600080fd5b9250929050565b600080600060408486031215611bd657600080fd5b8335611be181611b62565b9250602084013567ffffffffffffffff811115611bfd57600080fd5b611c0986828701611b78565b9497909650939450505050565b60005b83811015611c31578181015183820152602001611c19565b50506000910152565b60008151808452611c52816020860160208601611c16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112156020830184611c3a565b600060208284031215611ca957600080fd5b813561121581611b62565b600060208284031215611cc657600080fd5b5035919050565b801515811461118357600080fd5b600060208284031215611ced57600080fd5b813561121581611ccd565b73ffffffffffffffffffffffffffffffffffffffff8116811461118357600080fd5b60008060408385031215611d2d57600080fd5b8235611d3881611cf8565b946020939093013593505050565b604081526000611d596040830185611c3a565b8281036020840152611d6b8185611c3a565b95945050505050565b600080600060608486031215611d8957600080fd5b8335611d9481611cf8565b92506020840135611da481611cf8565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611df360c0860183611c3a565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611e2f8483611c3a565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611e90578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611e51565b50979650505050505050565b60008083601f840112611eae57600080fd5b50813567ffffffffffffffff811115611ec657600080fd5b6020830191508360208260051b8501011115611bba57600080fd5b60008060008060408587031215611ef757600080fd5b843567ffffffffffffffff80821115611f0f57600080fd5b611f1b88838901611e9c565b90965094506020870135915080821115611f3457600080fd5b50611f4187828801611e9c565b95989497509550505050565b600060208284031215611f5f57600080fd5b813567ffffffffffffffff811115611f7657600080fd5b820160a0818503121561121557600080fd5b600080600080600060608688031215611fa057600080fd5b8535611fab81611b62565b9450602086013567ffffffffffffffff80821115611fc857600080fd5b611fd489838a01611b78565b90965094506040880135915080821115611fed57600080fd5b50611ffa88828901611b78565b969995985093965092949392505050565b60006020828403121561201d57600080fd5b813561121581611cf8565b8183823760009101908152919050565b600181811c9082168061204c57607f821691505b602082108103612085577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126120ee57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261212d57600080fd5b83018035915067ffffffffffffffff82111561214857600080fd5b602001915036819003821315611bba57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261219257600080fd5b830160208101925035905067ffffffffffffffff8111156121b257600080fd5b803603821315611bba57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561225f57813561222d81611cf8565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161221a565b509495945050505050565b60208152813560208201526000602083013561228581611b62565b67ffffffffffffffff80821660408501526122a3604086018661215d565b925060a060608601526122ba60c0860184836121c1565b9250506122ca606086018661215d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123008583856121c1565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261233957600080fd5b6020928801928301923591508382111561235257600080fd5b8160061b360383131561236457600080fd5b8685030160a08701526118e884828461220a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610486576000816000526020600020601f850160051c810160208610156123d05750805b601f850160051c820191505b81811015610eec578281556001016123dc565b67ffffffffffffffff83111561240757612407612378565b61241b836124158354612038565b836123a7565b6000601f84116001811461246d57600085156124375750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610b29565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156124bc578685013582556020948501946001909201910161249c565b50868210156124f7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561254381611cf8565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156125a9576125a9612378565b8054838255808410156126365760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146125ea576125ea612509565b80861686146125fb576125fb612509565b5060008360005260206000208360011b81018760011b820191505b80821015612631578282558284830155600282019150612616565b505050505b5060008181526020812083915b85811015610eec576126558383612538565b6040929092019160029190910190600101612643565b8135815560018101602083013561268181611b62565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556126c160408601866120f8565b935091506126d38383600287016123ef565b6126e060608601866120f8565b935091506126f28383600387016123ef565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261272957600080fd5b91840191823591508082111561273e57600080fd5b506020820191508060061b360382131561275757600080fd5b612765818360048601612590565b50505050565b600082516120ee818460208701611c16565b60006020828403121561278f57600080fd5b815161121581611ccd565b8181038181111561049857610498612509565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"forwardingAddress\",\"type\":\"address\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002a8738038062002a878339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b60805161288a620001fd6000396000818161039d0152610e3a015261288a6000f3fe60806040526004361061012d5760003560e01c80636939cd97116100a55780638da5cb5b11610074578063cf6730f811610059578063cf6730f8146103c1578063d8469e40146103e1578063f2fde38b1461040157610134565b80638da5cb5b14610342578063b0f479a11461038e57610134565b80636939cd97146102c057806379ba5097146102ed5780638462a2b91461030257806385572ffb1461032257610134565b806341eade46116100fc57806352f813c3116100e157806352f813c314610260578063536c6bfa146102805780635e35359e146102a057610134565b806341eade46146102125780635075a9d41461023257610134565b80630e958d6b14610142578063181f5a771461017757806335f170ef146101c3578063369f7f66146101f257610134565b3661013457005b34801561014057600080fd5b005b34801561014e57600080fd5b5061016261015d366004611c12565b610421565b60405190151581526020015b60405180910390f35b34801561018357600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d646576000000000000000000006020820152905161016e9190611cd5565b3480156101cf57600080fd5b506101e36101de366004611ce8565b61046c565b60405161016e93929190611d05565b3480156101fe57600080fd5b5061014061020d366004611d5e565b6105a3565b34801561021e57600080fd5b5061014061022d366004611ce8565b61085e565b34801561023e57600080fd5b5061025261024d366004611d8e565b6108a9565b60405190815260200161016e565b34801561026c57600080fd5b5061014061027b366004611db5565b6108bc565b34801561028c57600080fd5b5061014061029b366004611dd2565b6108f5565b3480156102ac57600080fd5b506101406102bb366004611dfe565b61090b565b3480156102cc57600080fd5b506102e06102db366004611d8e565b610939565b60405161016e9190611e3f565b3480156102f957600080fd5b50610140610b44565b34801561030e57600080fd5b5061014061031d366004611f6b565b610c41565b34801561032e57600080fd5b5061014061033d366004611fd7565b610e22565b34801561034e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016e565b34801561039a57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610369565b3480156103cd57600080fd5b506101406103dc366004611fd7565b611055565b3480156103ed57600080fd5b506101406103fc366004612012565b611191565b34801561040d57600080fd5b5061014061041c366004612095565b611212565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061045090859085906120b2565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff9092169291610492906120c2565b80601f01602080910402602001604051908101604052809291908181526020018280546104be906120c2565b801561050b5780601f106104e05761010080835404028352916020019161050b565b820191906000526020600020905b8154815290600101906020018083116104ee57829003601f168201915b505050505090806002018054610520906120c2565b80601f016020809104026020016040519081016040528092919081815260200182805461054c906120c2565b80156105995780601f1061056e57610100808354040283529160200191610599565b820191906000526020600020905b81548152906001019060200180831161057c57829003601f168201915b5050505050905083565b6105ab611226565b60016105b86004846112a9565b146105f7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6106078260005b600491906112bc565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161064f906120c2565b80601f016020809104026020016040519081016040528092919081815260200182805461067b906120c2565b80156106c85780601f1061069d576101008083540402835291602001916106c8565b820191906000526020600020905b8154815290600101906020018083116106ab57829003601f168201915b505050505081526020016003820180546106e1906120c2565b80601f016020809104026020016040519081016040528092919081815260200182805461070d906120c2565b801561075a5780601f1061072f5761010080835404028352916020019161075a565b820191906000526020600020905b81548152906001019060200180831161073d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107dd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610788565b505050915250506040805173ffffffffffffffffffffffffffffffffffffffff85166020820152919250610822918391016040516020818303038152906040526112d1565b61082d600484611376565b5060405183907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a2505050565b610866611226565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006108b66004836112a9565b92915050565b6108c4611226565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6108fd611226565b6109078282611382565b5050565b610913611226565b61093473ffffffffffffffffffffffffffffffffffffffff841683836114dc565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109a8906120c2565b80601f01602080910402602001604051908101604052809291908181526020018280546109d4906120c2565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b50505050508152602001600382018054610a3a906120c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a66906120c2565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b365760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ae1565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016105ee565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c49611226565b60005b81811015610d2c5760026000848484818110610c6a57610c6a612115565b9050602002810190610c7c9190612144565b610c8a906020810190611ce8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610cc157610cc1612115565b9050602002810190610cd39190612144565b610ce1906020810190612182565b604051610cef9291906120b2565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c4c565b5060005b83811015610e1b57600160026000878785818110610d5057610d50612115565b9050602002810190610d629190612144565b610d70906020810190611ce8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610da757610da7612115565b9050602002810190610db99190612144565b610dc7906020810190612182565b604051610dd59291906120b2565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d30565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e93576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016105ee565b610ea36040820160208301611ce8565b67ffffffffffffffff81166000908152600260205260409020600181018054610ecb906120c2565b15905080610eda5750805460ff165b15610f1d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016105ee565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f599086906004016122f4565b600060405180830381600087803b158015610f7357600080fd5b505af1925050508015610f84575060015b611024573d808015610fb2576040519150601f19603f3d011682016040523d82523d6000602084013e610fb7565b606091505b50610fc4843560016105fe565b50833560009081526003602052604090208490610fe182826126f5565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611016908490611cd5565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b33301461108e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61109e6040820160208301611ce8565b6110ab6040830183612182565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061110992508491506127ef565b9081526040519081900360200190205460ff1661115457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016105ee9190611cd5565b60075460ff1615610934576040517f79f79e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611199611226565b67ffffffffffffffff85166000908152600260205260409020600181016111c1858783612479565b5081156111d957600281016111d7838583612479565b505b805460ff161561120a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b61121a611226565b61122381611569565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105ee565b565b60006112b5838361165e565b9392505050565b60006112c98484846116e8565b949350505050565b6000818060200190518101906112e79190612801565b905060005b8360800151518110156113705760008460800151828151811061131157611311612115565b602002602001015160200151905060008560800151838151811061133757611337612115565b602090810291909101015151905061136673ffffffffffffffffffffffffffffffffffffffff821685846114dc565b50506001016112ec565b50505050565b60006112b58383611705565b804710156113ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016105ee565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611446576040519150601f19603f3d011682016040523d82523d6000602084013e61144b565b606091505b5050905080610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016105ee565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610934908490611722565b3373ffffffffffffffffffffffffffffffffffffffff8216036115e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105ee565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054801515806116825750611682848461182e565b6112b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016105ee565b600082815260028401602052604081208290556112c9848461183a565b600081815260028301602052604081208190556112b58383611846565b6000611784826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166118529092919063ffffffff16565b80519091501561093457808060200190518101906117a2919061281e565b610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016105ee565b60006112b58383611861565b60006112b58383611879565b60006112b583836118c8565b60606112c984846000856119bb565b600081815260018301602052604081205415156112b5565b60008181526001830160205260408120546118c0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b6565b5060006108b6565b600081815260018301602052604081205480156119b15760006118ec60018361283b565b85549091506000906119009060019061283b565b905081811461196557600086600001828154811061192057611920612115565b906000526020600020015490508087600001848154811061194357611943612115565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806119765761197661284e565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108b6565b60009150506108b6565b606082471015611a4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016105ee565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611a7691906127ef565b60006040518083038185875af1925050503d8060008114611ab3576040519150601f19603f3d011682016040523d82523d6000602084013e611ab8565b606091505b5091509150611ac987838387611ad4565b979650505050505050565b60608315611b6a578251600003611b635773ffffffffffffffffffffffffffffffffffffffff85163b611b63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105ee565b50816112c9565b6112c98383815115611b7f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ee9190611cd5565b67ffffffffffffffff8116811461122357600080fd5b60008083601f840112611bdb57600080fd5b50813567ffffffffffffffff811115611bf357600080fd5b602083019150836020828501011115611c0b57600080fd5b9250929050565b600080600060408486031215611c2757600080fd5b8335611c3281611bb3565b9250602084013567ffffffffffffffff811115611c4e57600080fd5b611c5a86828701611bc9565b9497909650939450505050565b60005b83811015611c82578181015183820152602001611c6a565b50506000910152565b60008151808452611ca3816020860160208601611c67565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112b56020830184611c8b565b600060208284031215611cfa57600080fd5b81356112b581611bb3565b8315158152606060208201526000611d206060830185611c8b565b8281036040840152611d328185611c8b565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461122357600080fd5b60008060408385031215611d7157600080fd5b823591506020830135611d8381611d3c565b809150509250929050565b600060208284031215611da057600080fd5b5035919050565b801515811461122357600080fd5b600060208284031215611dc757600080fd5b81356112b581611da7565b60008060408385031215611de557600080fd5b8235611df081611d3c565b946020939093013593505050565b600080600060608486031215611e1357600080fd5b8335611e1e81611d3c565b92506020840135611e2e81611d3c565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611e7d60c0860183611c8b565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611eb98483611c8b565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f1a578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611edb565b50979650505050505050565b60008083601f840112611f3857600080fd5b50813567ffffffffffffffff811115611f5057600080fd5b6020830191508360208260051b8501011115611c0b57600080fd5b60008060008060408587031215611f8157600080fd5b843567ffffffffffffffff80821115611f9957600080fd5b611fa588838901611f26565b90965094506020870135915080821115611fbe57600080fd5b50611fcb87828801611f26565b95989497509550505050565b600060208284031215611fe957600080fd5b813567ffffffffffffffff81111561200057600080fd5b820160a081850312156112b557600080fd5b60008060008060006060868803121561202a57600080fd5b853561203581611bb3565b9450602086013567ffffffffffffffff8082111561205257600080fd5b61205e89838a01611bc9565b9096509450604088013591508082111561207757600080fd5b5061208488828901611bc9565b969995985093965092949392505050565b6000602082840312156120a757600080fd5b81356112b581611d3c565b8183823760009101908152919050565b600181811c908216806120d657607f821691505b60208210810361210f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261217857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121b757600080fd5b83018035915067ffffffffffffffff8211156121d257600080fd5b602001915036819003821315611c0b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261221c57600080fd5b830160208101925035905067ffffffffffffffff81111561223c57600080fd5b803603821315611c0b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156122e95781356122b781611d3c565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016122a4565b509495945050505050565b60208152813560208201526000602083013561230f81611bb3565b67ffffffffffffffff808216604085015261232d60408601866121e7565b925060a0606086015261234460c08601848361224b565b92505061235460608601866121e7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261238a85838561224b565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126123c357600080fd5b602092880192830192359150838211156123dc57600080fd5b8160061b36038313156123ee57600080fd5b8685030160a0870152611ac9848284612294565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610934576000816000526020600020601f850160051c8101602086101561245a5750805b601f850160051c820191505b8181101561120a57828155600101612466565b67ffffffffffffffff83111561249157612491612402565b6124a58361249f83546120c2565b83612431565b6000601f8411600181146124f757600085156124c15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e1b565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125465786850135825560209485019460019092019101612526565b5086821015612581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356125cd81611d3c565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561263357612633612402565b8054838255808410156126c05760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461267457612674612593565b808616861461268557612685612593565b5060008360005260206000208360011b81018760011b820191505b808210156126bb5782825582848301556002820191506126a0565b505050505b5060008181526020812083915b8581101561120a576126df83836125c2565b60409290920191600291909101906001016126cd565b8135815560018101602083013561270b81611bb3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561274b6040860186612182565b9350915061275d838360028701612479565b61276a6060860186612182565b9350915061277c838360038701612479565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126127b357600080fd5b9184019182359150808211156127c857600080fd5b506020820191508060061b36038213156127e157600080fd5b61137081836004860161261a565b60008251612178818460208701611c67565b60006020828403121561281357600080fd5b81516112b581611d3c565b60006020828403121561283057600080fd5b81516112b581611da7565b818103818111156108b6576108b6612593565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -299,34 +299,35 @@ func (_CCIPReceiver *CCIPReceiverCallerSession) Owner() (common.Address, error) return _CCIPReceiver.Contract.Owner(&_CCIPReceiver.CallOpts) } -func (_CCIPReceiver *CCIPReceiverCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, +func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPReceiver.contract.Call(opts, &out, "s_chains", arg0) + err := _CCIPReceiver.contract.Call(opts, &out, "s_chainConfigs", arg0) - outstruct := new(SChains) + outstruct := new(SChainConfigs) if err != nil { return *outstruct, err } - outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) - outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) return *outstruct, err } -func (_CCIPReceiver *CCIPReceiverSession) SChains(arg0 uint64) (SChains, +func (_CCIPReceiver *CCIPReceiverSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _CCIPReceiver.Contract.SChains(&_CCIPReceiver.CallOpts, arg0) + return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, arg0) } -func (_CCIPReceiver *CCIPReceiverCallerSession) SChains(arg0 uint64) (SChains, +func (_CCIPReceiver *CCIPReceiverCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _CCIPReceiver.Contract.SChains(&_CCIPReceiver.CallOpts, arg0) + return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, arg0) } func (_CCIPReceiver *CCIPReceiverCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -411,16 +412,16 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) ProcessMessage(message Clien return _CCIPReceiver.Contract.ProcessMessage(&_CCIPReceiver.TransactOpts, message) } -func (_CCIPReceiver *CCIPReceiverTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { - return _CCIPReceiver.contract.Transact(opts, "retryFailedMessage", messageId) +func (_CCIPReceiver *CCIPReceiverTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "retryFailedMessage", messageId, forwardingAddress) } -func (_CCIPReceiver *CCIPReceiverSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId) +func (_CCIPReceiver *CCIPReceiverSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId, forwardingAddress) } -func (_CCIPReceiver *CCIPReceiverTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId) +func (_CCIPReceiver *CCIPReceiverTransactorSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId, forwardingAddress) } func (_CCIPReceiver *CCIPReceiverTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { @@ -447,15 +448,15 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) TransferOwnership(to common. return _CCIPReceiver.Contract.TransferOwnership(&_CCIPReceiver.TransactOpts, to) } -func (_CCIPReceiver *CCIPReceiverTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPReceiver *CCIPReceiverTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPReceiver.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_CCIPReceiver *CCIPReceiverSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPReceiver *CCIPReceiverSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPReceiver.Contract.UpdateApprovedSenders(&_CCIPReceiver.TransactOpts, adds, removes) } -func (_CCIPReceiver *CCIPReceiverTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPReceiver *CCIPReceiverTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPReceiver.Contract.UpdateApprovedSenders(&_CCIPReceiver.TransactOpts, adds, removes) } @@ -1161,7 +1162,8 @@ func (_CCIPReceiver *CCIPReceiverFilterer) ParseOwnershipTransferred(log types.L return event, nil } -type SChains struct { +type SChainConfigs struct { + IsDisabled bool Recipient []byte ExtraArgsBytes []byte } @@ -1219,7 +1221,7 @@ type CCIPReceiverInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) @@ -1235,13 +1237,13 @@ type CCIPReceiverInterface interface { ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index 8a680436d9..25afce9f30 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -30,19 +30,19 @@ var ( _ = abi.ConvertType ) +type CCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + type ClientEVMTokenAmount struct { Token common.Address Amount *big.Int } -type ICCIPClientBaseapprovedSenderUpdate struct { - DestChainSelector uint64 - Sender []byte -} - var CCIPSenderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002467380380620024678339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051612247620002206000396000818161027201528181610ab901528181610c2601528181610d4401528181610e0801528181610ec00152610f5b01526122476000f3fe6080604052600436106100ca5760003560e01c806379ba509711610079578063b0f479a111610056578063b0f479a114610263578063d8469e4014610296578063effde240146102b6578063f2fde38b146102d757005b806379ba5097146101e25780638462a2b9146101f75780638da5cb5b1461021757005b8063536c6bfa116100a7578063536c6bfa146101745780635dc5ebdb146101945780635e35359e146101c257005b80630e958d6b146100d3578063181f5a771461010857806341eade461461015457005b366100d157005b005b3480156100df57600080fd5b506100f36100ee3660046119ac565b6102f7565b60405190151581526020015b60405180910390f35b34801561011457600080fd5b50604080518082018252601481527f4343495053656e64657220312e302e302d646576000000000000000000000000602082015290516100ff9190611a6d565b34801561016057600080fd5b506100d161016f366004611a87565b610341565b34801561018057600080fd5b506100d161018f366004611ac4565b610380565b3480156101a057600080fd5b506101b46101af366004611a87565b610396565b6040516100ff929190611af0565b3480156101ce57600080fd5b506100d16101dd366004611b29565b6104c2565b3480156101ee57600080fd5b506100d16104eb565b34801561020357600080fd5b506100d1610212366004611baf565b6105ed565b34801561022357600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ff565b34801561026f57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061023e565b3480156102a257600080fd5b506100d16102b1366004611c1b565b6107ce565b6102c96102c4366004611c9c565b610830565b6040519081526020016100ff565b3480156102e357600080fd5b506100d16102f2366004611d5d565b61103d565b67ffffffffffffffff8316600090815260026020819052604080832090519101906103259085908590611d7a565b9081526040519081900360200190205460ff1690509392505050565b610349611051565b67ffffffffffffffff811660009081526002602052604081209061036d82826118f8565b61037b6001830160006118f8565b505050565b610388611051565b61039282826110d4565b5050565b6002602052600090815260409020805481906103b190611d8a565b80601f01602080910402602001604051908101604052809291908181526020018280546103dd90611d8a565b801561042a5780601f106103ff5761010080835404028352916020019161042a565b820191906000526020600020905b81548152906001019060200180831161040d57829003601f168201915b50505050509080600101805461043f90611d8a565b80601f016020809104026020016040519081016040528092919081815260200182805461046b90611d8a565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905082565b6104ca611051565b61037b73ffffffffffffffffffffffffffffffffffffffff8416838361122e565b60015473ffffffffffffffffffffffffffffffffffffffff163314610571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6105f5611051565b60005b818110156106d8576002600084848481811061061657610616611ddd565b90506020028101906106289190611e0c565b610636906020810190611a87565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061066d5761066d611ddd565b905060200281019061067f9190611e0c565b61068d906020810190611e4a565b60405161069b929190611d7a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556001016105f8565b5060005b838110156107c7576001600260008787858181106106fc576106fc611ddd565b905060200281019061070e9190611e0c565b61071c906020810190611a87565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061075357610753611ddd565b90506020028101906107659190611e0c565b610773906020810190611e4a565b604051610781929190611d7a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790556001016106dc565b5050505050565b6107d6611051565b67ffffffffffffffff851660009081526002602052604090206107fa848683611f26565b5080156107c75767ffffffffffffffff85166000908152600260205260409020600101610828828483611f26565b505050505050565b67ffffffffffffffff86166000908152600260205260408120805488919061085790611d8a565b905060000361089e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610568565b6040805160a08101825267ffffffffffffffff8a166000908152600260205291822080548291906108ce90611d8a565b80601f01602080910402602001604051908101604052809291908181526020018280546108fa90611d8a565b80156109475780601f1061091c57610100808354040283529160200191610947565b820191906000526020600020905b81548152906001019060200180831161092a57829003601f168201915b5050505050815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208d8102820181019092528c815293810193928d92508c9182919085015b828210156109d7576109c860408302860136819003810190612040565b815260200190600101906109ab565b505050505081526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600260008c67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610a3290611d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e90611d8a565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8b846040518363ffffffff1660e01b8152600401610b12929190612098565b602060405180830381865afa158015610b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5391906121ad565b905060005b88811015610da457610bc733308c8c85818110610b7757610b77611ddd565b905060400201602001358d8d86818110610b9357610b93611ddd565b610ba99260206040909202019081019150611d5d565b73ffffffffffffffffffffffffffffffffffffffff16929190611302565b8573ffffffffffffffffffffffffffffffffffffffff168a8a83818110610bf057610bf0611ddd565b610c069260206040909202019081019150611d5d565b73ffffffffffffffffffffffffffffffffffffffff1614610cab57610ca67f00000000000000000000000000000000000000000000000000000000000000008b8b84818110610c5757610c57611ddd565b905060400201602001358c8c85818110610c7357610c73611ddd565b610c899260206040909202019081019150611d5d565b73ffffffffffffffffffffffffffffffffffffffff169190611366565b610d9c565b8573ffffffffffffffffffffffffffffffffffffffff168a8a83818110610cd457610cd4611ddd565b610cea9260206040909202019081019150611d5d565b73ffffffffffffffffffffffffffffffffffffffff16148015610d22575073ffffffffffffffffffffffffffffffffffffffff861615155b15610d9c57610d3f3330848d8d86818110610b9357610b93611ddd565b610d9c7f0000000000000000000000000000000000000000000000000000000000000000838c8c85818110610d7657610d76611ddd565b90506040020160200135610d8a91906121c6565b8c8c85818110610c7357610c73611ddd565b600101610b58565b5073ffffffffffffffffffffffffffffffffffffffff851615801590610e7d57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116602483015286169063dd62ed3e90604401602060405180830381865afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7b91906121ad565b155b15610eea57610ea473ffffffffffffffffffffffffffffffffffffffff8616333084611302565b610ee573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000083611366565b610f44565b73ffffffffffffffffffffffffffffffffffffffff8516158015610f0d57508034105b15610f44576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990871615610f91576000610f93565b825b8c856040518463ffffffff1660e01b8152600401610fb2929190612098565b60206040518083038185885af1158015610fd0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ff591906121ad565b93507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8460405161102891815260200190565b60405180910390a15050509695505050505050565b611045611051565b61104e816114e8565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610568565b565b8047101561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610568565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611198576040519150601f19603f3d011682016040523d82523d6000602084013e61119d565b606091505b505090508061037b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610568565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261037b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526115dd565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526113609085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611280565b50505050565b80158061140657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140491906121ad565b155b611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610568565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261037b9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611280565b3373ffffffffffffffffffffffffffffffffffffffff821603611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610568565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061163f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166116e99092919063ffffffff16565b80519091501561037b578080602001905181019061165d9190612206565b61037b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610568565b60606116f88484600085611700565b949350505050565b606082471015611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610568565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516117bb9190612228565b60006040518083038185875af1925050503d80600081146117f8576040519150601f19603f3d011682016040523d82523d6000602084013e6117fd565b606091505b509150915061180e87838387611819565b979650505050505050565b606083156118af5782516000036118a85773ffffffffffffffffffffffffffffffffffffffff85163b6118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610568565b50816116f8565b6116f883838151156118c45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105689190611a6d565b50805461190490611d8a565b6000825580601f10611914575050565b601f01602090049060005260206000209081019061104e91905b80821115611942576000815560010161192e565b5090565b803567ffffffffffffffff8116811461195e57600080fd5b919050565b60008083601f84011261197557600080fd5b50813567ffffffffffffffff81111561198d57600080fd5b6020830191508360208285010111156119a557600080fd5b9250929050565b6000806000604084860312156119c157600080fd5b6119ca84611946565b9250602084013567ffffffffffffffff8111156119e657600080fd5b6119f286828701611963565b9497909650939450505050565b60005b83811015611a1a578181015183820152602001611a02565b50506000910152565b60008151808452611a3b8160208601602086016119ff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a806020830184611a23565b9392505050565b600060208284031215611a9957600080fd5b611a8082611946565b73ffffffffffffffffffffffffffffffffffffffff8116811461104e57600080fd5b60008060408385031215611ad757600080fd5b8235611ae281611aa2565b946020939093013593505050565b604081526000611b036040830185611a23565b8281036020840152611b158185611a23565b95945050505050565b803561195e81611aa2565b600080600060608486031215611b3e57600080fd5b8335611b4981611aa2565b92506020840135611b5981611aa2565b929592945050506040919091013590565b60008083601f840112611b7c57600080fd5b50813567ffffffffffffffff811115611b9457600080fd5b6020830191508360208260051b85010111156119a557600080fd5b60008060008060408587031215611bc557600080fd5b843567ffffffffffffffff80821115611bdd57600080fd5b611be988838901611b6a565b90965094506020870135915080821115611c0257600080fd5b50611c0f87828801611b6a565b95989497509550505050565b600080600080600060608688031215611c3357600080fd5b611c3c86611946565b9450602086013567ffffffffffffffff80821115611c5957600080fd5b611c6589838a01611963565b90965094506040880135915080821115611c7e57600080fd5b50611c8b88828901611963565b969995985093965092949392505050565b60008060008060008060808789031215611cb557600080fd5b611cbe87611946565b9550602087013567ffffffffffffffff80821115611cdb57600080fd5b818901915089601f830112611cef57600080fd5b813581811115611cfe57600080fd5b8a60208260061b8501011115611d1357600080fd5b602083019750809650506040890135915080821115611d3157600080fd5b50611d3e89828a01611963565b9094509250611d51905060608801611b1e565b90509295509295509295565b600060208284031215611d6f57600080fd5b8135611a8081611aa2565b8183823760009101908152919050565b600181811c90821680611d9e57607f821691505b602082108103611dd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611e4057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e7f57600080fd5b83018035915067ffffffffffffffff821115611e9a57600080fd5b6020019150368190038213156119a557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561037b576000816000526020600020601f850160051c81016020861015611f075750805b601f850160051c820191505b8181101561082857828155600101611f13565b67ffffffffffffffff831115611f3e57611f3e611eaf565b611f5283611f4c8354611d8a565b83611ede565b6000601f841160018114611fa45760008515611f6e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556107c7565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611ff35786850135825560209485019460019092019101611fd3565b508682101561202e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60006040828403121561205257600080fd5b6040516040810181811067ffffffffffffffff8211171561207557612075611eaf565b604052823561208381611aa2565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526120c760e0860182611a23565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526121028383611a23565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612163578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190612124565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a0152955061219f8187611a23565b9a9950505050505050505050565b6000602082840312156121bf57600080fd5b5051919050565b80820180821115612200577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561221857600080fd5b81518015158114611a8057600080fd5b60008251611e408184602087016119ff56fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620021a3380380620021a38339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611f91620002126000396000818161028b01528181610b9401528181610c5d01528181610d310152610d6d0152611f916000f3fe6080604052600436106100d65760003560e01c806379ba50971161007f578063b0f479a111610059578063b0f479a11461027c578063d8469e40146102af578063effde240146102cf578063f2fde38b146102f0576100dd565b806379ba5097146101fb5780638462a2b9146102105780638da5cb5b14610230576100dd565b806341eade46116100b057806341eade461461019b578063536c6bfa146101bb5780635e35359e146101db576100dd565b80630e958d6b146100eb578063181f5a771461012057806335f170ef1461016c576100dd565b366100dd57005b3480156100e957600080fd5b005b3480156100f757600080fd5b5061010b6101063660046116ed565b610310565b60405190151581526020015b60405180910390f35b34801561012c57600080fd5b50604080518082018252601481527f4343495053656e64657220312e302e302d6465760000000000000000000000006020820152905161011791906117ae565b34801561017857600080fd5b5061018c6101873660046117c8565b61035b565b604051610117939291906117e3565b3480156101a757600080fd5b506100e96101b63660046117c8565b610492565b3480156101c757600080fd5b506100e96101d636600461183c565b6104dd565b3480156101e757600080fd5b506100e96101f6366004611873565b6104f3565b34801561020757600080fd5b506100e9610521565b34801561021c57600080fd5b506100e961022b3660046118f9565b610623565b34801561023c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b34801561028857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610257565b3480156102bb57600080fd5b506100e96102ca366004611965565b610804565b6102e26102dd3660046119e6565b610885565b604051908152602001610117565b3480156102fc57600080fd5b506100e961030b366004611aa7565b610e50565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061033f9085908590611ac4565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161038190611ad4565b80601f01602080910402602001604051908101604052809291908181526020018280546103ad90611ad4565b80156103fa5780601f106103cf576101008083540402835291602001916103fa565b820191906000526020600020905b8154815290600101906020018083116103dd57829003601f168201915b50505050509080600201805461040f90611ad4565b80601f016020809104026020016040519081016040528092919081815260200182805461043b90611ad4565b80156104885780601f1061045d57610100808354040283529160200191610488565b820191906000526020600020905b81548152906001019060200180831161046b57829003601f168201915b5050505050905083565b61049a610e64565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6104e5610e64565b6104ef8282610ee7565b5050565b6104fb610e64565b61051c73ffffffffffffffffffffffffffffffffffffffff84168383611041565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61062b610e64565b60005b8181101561070e576002600084848481811061064c5761064c611b27565b905060200281019061065e9190611b56565b61066c9060208101906117c8565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106106a3576106a3611b27565b90506020028101906106b59190611b56565b6106c3906020810190611b94565b6040516106d1929190611ac4565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560010161062e565b5060005b838110156107fd5760016002600087878581811061073257610732611b27565b90506020028101906107449190611b56565b6107529060208101906117c8565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061078957610789611b27565b905060200281019061079b9190611b56565b6107a9906020810190611b94565b6040516107b7929190611ac4565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610712565b5050505050565b61080c610e64565b67ffffffffffffffff8516600090815260026020526040902060018101610834858783611c70565b50811561084c576002810161084a838583611c70565b505b805460ff161561087d5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b67ffffffffffffffff86166000908152600260205260408120600181018054899291906108b190611ad4565b159050806108c05750805460ff165b15610903576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161059e565b6040805160a08101825267ffffffffffffffff8b1660009081526002602052918220600101805482919061093690611ad4565b80601f016020809104026020016040519081016040528092919081815260200182805461096290611ad4565b80156109af5780601f10610984576101008083540402835291602001916109af565b820191906000526020600020905b81548152906001019060200180831161099257829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610a3f57610a3060408302860136819003810190611d8a565b81526020019060010190610a13565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600260008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018054610a9a90611ad4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac690611ad4565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b5050505050815250905060005b88811015610c1c57610b8f33308c8c85818110610b3f57610b3f611b27565b905060400201602001358d8d86818110610b5b57610b5b611b27565b610b719260206040909202019081019150611aa7565b73ffffffffffffffffffffffffffffffffffffffff16929190611115565b610c147f00000000000000000000000000000000000000000000000000000000000000008b8b84818110610bc557610bc5611b27565b905060400201602001358c8c85818110610be157610be1611b27565b610bf79260206040909202019081019150611aa7565b73ffffffffffffffffffffffffffffffffffffffff169190611179565b600101610b20565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90610c94908e908690600401611de2565b602060405180830381865afa158015610cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd59190611ef7565b905073ffffffffffffffffffffffffffffffffffffffff861615610d5657610d1573ffffffffffffffffffffffffffffffffffffffff8716333084611115565b610d5673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000083611179565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615610da3576000610da5565b825b8d856040518463ffffffff1660e01b8152600401610dc4929190611de2565b60206040518083038185885af1158015610de2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e079190611ef7565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051610e3a91815260200190565b60405180910390a1505050509695505050505050565b610e58610e64565b610e6181611277565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161059e565b565b80471015610f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161059e565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610fab576040519150601f19603f3d011682016040523d82523d6000602084013e610fb0565b606091505b505090508061051c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161059e565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261051c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261136c565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526111739085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611093565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112149190611ef7565b61121e9190611f10565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111739085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611093565b3373ffffffffffffffffffffffffffffffffffffffff8216036112f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161059e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006113ce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114789092919063ffffffff16565b80519091501561051c57808060200190518101906113ec9190611f50565b61051c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161059e565b6060611487848460008561148f565b949350505050565b606082471015611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161059e565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161154a9190611f72565b60006040518083038185875af1925050503d8060008114611587576040519150601f19603f3d011682016040523d82523d6000602084013e61158c565b606091505b509150915061159d878383876115a8565b979650505050505050565b6060831561163e5782516000036116375773ffffffffffffffffffffffffffffffffffffffff85163b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161059e565b5081611487565b61148783838151156116535781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059e91906117ae565b803567ffffffffffffffff8116811461169f57600080fd5b919050565b60008083601f8401126116b657600080fd5b50813567ffffffffffffffff8111156116ce57600080fd5b6020830191508360208285010111156116e657600080fd5b9250929050565b60008060006040848603121561170257600080fd5b61170b84611687565b9250602084013567ffffffffffffffff81111561172757600080fd5b611733868287016116a4565b9497909650939450505050565b60005b8381101561175b578181015183820152602001611743565b50506000910152565b6000815180845261177c816020860160208601611740565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117c16020830184611764565b9392505050565b6000602082840312156117da57600080fd5b6117c182611687565b83151581526060602082015260006117fe6060830185611764565b82810360408401526118108185611764565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e6157600080fd5b6000806040838503121561184f57600080fd5b823561185a8161181a565b946020939093013593505050565b803561169f8161181a565b60008060006060848603121561188857600080fd5b83356118938161181a565b925060208401356118a38161181a565b929592945050506040919091013590565b60008083601f8401126118c657600080fd5b50813567ffffffffffffffff8111156118de57600080fd5b6020830191508360208260051b85010111156116e657600080fd5b6000806000806040858703121561190f57600080fd5b843567ffffffffffffffff8082111561192757600080fd5b611933888389016118b4565b9096509450602087013591508082111561194c57600080fd5b50611959878288016118b4565b95989497509550505050565b60008060008060006060868803121561197d57600080fd5b61198686611687565b9450602086013567ffffffffffffffff808211156119a357600080fd5b6119af89838a016116a4565b909650945060408801359150808211156119c857600080fd5b506119d5888289016116a4565b969995985093965092949392505050565b600080600080600080608087890312156119ff57600080fd5b611a0887611687565b9550602087013567ffffffffffffffff80821115611a2557600080fd5b818901915089601f830112611a3957600080fd5b813581811115611a4857600080fd5b8a60208260061b8501011115611a5d57600080fd5b602083019750809650506040890135915080821115611a7b57600080fd5b50611a8889828a016116a4565b9094509250611a9b905060608801611868565b90509295509295509295565b600060208284031215611ab957600080fd5b81356117c18161181a565b8183823760009101908152919050565b600181811c90821680611ae857607f821691505b602082108103611b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611b8a57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bc957600080fd5b83018035915067ffffffffffffffff821115611be457600080fd5b6020019150368190038213156116e657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561051c576000816000526020600020601f850160051c81016020861015611c515750805b601f850160051c820191505b8181101561087d57828155600101611c5d565b67ffffffffffffffff831115611c8857611c88611bf9565b611c9c83611c968354611ad4565b83611c28565b6000601f841160018114611cee5760008515611cb85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556107fd565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611d3d5786850135825560209485019460019092019101611d1d565b5086821015611d78577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060408284031215611d9c57600080fd5b6040516040810181811067ffffffffffffffff82111715611dbf57611dbf611bf9565b6040528235611dcd8161181a565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a06040860152611e1160e0860182611764565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878403016060880152611e4c8383611764565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611ead578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190611e6e565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a01529550611ee98187611764565b9a9950505050505050505050565b600060208284031215611f0957600080fd5b5051919050565b80820180821115611f4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b600060208284031215611f6257600080fd5b815180151581146117c157600080fd5b60008251611b8a81846020870161174056fea164736f6c6343000818000a", } var CCIPSenderABI = CCIPSenderMetaData.ABI @@ -247,34 +247,35 @@ func (_CCIPSender *CCIPSenderCallerSession) Owner() (common.Address, error) { return _CCIPSender.Contract.Owner(&_CCIPSender.CallOpts) } -func (_CCIPSender *CCIPSenderCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, +func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPSender.contract.Call(opts, &out, "s_chains", arg0) + err := _CCIPSender.contract.Call(opts, &out, "s_chainConfigs", arg0) - outstruct := new(SChains) + outstruct := new(SChainConfigs) if err != nil { return *outstruct, err } - outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) - outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) return *outstruct, err } -func (_CCIPSender *CCIPSenderSession) SChains(arg0 uint64) (SChains, +func (_CCIPSender *CCIPSenderSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _CCIPSender.Contract.SChains(&_CCIPSender.CallOpts, arg0) + return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, arg0) } -func (_CCIPSender *CCIPSenderCallerSession) SChains(arg0 uint64) (SChains, +func (_CCIPSender *CCIPSenderCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _CCIPSender.Contract.SChains(&_CCIPSender.CallOpts, arg0) + return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, arg0) } func (_CCIPSender *CCIPSenderCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -359,15 +360,15 @@ func (_CCIPSender *CCIPSenderTransactorSession) TransferOwnership(to common.Addr return _CCIPSender.Contract.TransferOwnership(&_CCIPSender.TransactOpts, to) } -func (_CCIPSender *CCIPSenderTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPSender *CCIPSenderTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPSender.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_CCIPSender *CCIPSenderSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPSender *CCIPSenderSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPSender.Contract.UpdateApprovedSenders(&_CCIPSender.TransactOpts, adds, removes) } -func (_CCIPSender *CCIPSenderTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPSender *CCIPSenderTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _CCIPSender.Contract.UpdateApprovedSenders(&_CCIPSender.TransactOpts, adds, removes) } @@ -925,7 +926,8 @@ func (_CCIPSender *CCIPSenderFilterer) ParseOwnershipTransferred(log types.Log) return event, nil } -type SChains struct { +type SChainConfigs struct { + IsDisabled bool Recipient []byte ExtraArgsBytes []byte } @@ -973,7 +975,7 @@ type CCIPSenderInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) @@ -989,7 +991,7 @@ type CCIPSenderInterface interface { TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index f12b84a906..a25b9a63a5 100644 --- a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go +++ b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go @@ -30,6 +30,11 @@ var ( _ = abi.ConvertType ) +type CCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -43,14 +48,9 @@ type ClientEVMTokenAmount struct { Amount *big.Int } -type ICCIPClientBaseapprovedSenderUpdate struct { - DestChainSelector uint64 - Sender []byte -} - var PingPongDemoMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMagicBytes\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACKMESSAGEMAGICBYTES\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620046b6380380620046b68339810160408190526200003491620005cc565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000144565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013857620001386001600160a01b03821683600019620001ef565b505050505050620006c9565b336001600160a01b038216036200019e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200026d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026b91906200060b565b155b620002e15760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003399185916200033e16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200038d906001600160a01b0385169084906200040f565b805190915015620003395780806020019051810190620003ae919062000625565b620003395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b606062000420848460008562000428565b949350505050565b6060824710156200048b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004a9919062000676565b60006040518083038185875af1925050503d8060008114620004e8576040519150601f19603f3d011682016040523d82523d6000602084013e620004ed565b606091505b50909250905062000501878383876200050c565b979650505050505050565b606083156200058057825160000362000578576001600160a01b0385163b620005785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b508162000420565b620004208383815115620005975781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000694565b6001600160a01b0381168114620005c957600080fd5b50565b60008060408385031215620005e057600080fd5b8251620005ed81620005b3565b60208401519092506200060081620005b3565b809150509250929050565b6000602082840312156200061e57600080fd5b5051919050565b6000602082840312156200063857600080fd5b815180151581146200064957600080fd5b9392505050565b60005b838110156200066d57818101518382015260200162000653565b50506000910152565b600082516200068a81846020870162000650565b9190910192915050565b6020815260008251806020840152620006b581604085016020870162000650565b601f01601f19169190910160400192915050565b608051613fa76200070f6000396000818161056001528181610744015281816107e20152818161107901528181611c3201528181611e05015261201b0152613fa76000f3fe6080604052600436106101c45760003560e01c80636939cd97116100f6578063b5a110111161008f578063e4ca875411610061578063e4ca875414610645578063effde24014610665578063f2fde38b14610678578063ff2deec31461069857005b8063b5a11011146105bc578063bee518a4146105dc578063cf6730f814610605578063d8469e401461062557005b80638da5cb5b116100c85780638da5cb5b146105065780639d2aede514610531578063b0f479a114610551578063b187bd261461058457005b80636939cd971461048457806379ba5097146104b15780638462a2b9146104c657806385572ffb146104e657005b80632b6e5d631161016857806352f813c31161013a57806352f813c3146103f6578063536c6bfa146104165780635dc5ebdb146104365780635e35359e1461046457005b80632b6e5d63146103075780633a51b79e1461035f57806341eade46146103a85780635075a9d4146103c857005b806316c38b3c116101a157806316c38b3c14610263578063181f5a77146102835780631892b906146102d25780632874d8bf146102f257005b806305bfe982146101cd5780630e958d6b1461021357806311e85dff1461024357005b366101cb57005b005b3480156101d957600080fd5b506101fd6101e8366004612e66565b60086020526000908152604090205460ff1681565b60405161020a9190612e7f565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004612f1f565b6106ca565b604051901515815260200161020a565b34801561024f57600080fd5b506101cb61025e366004612fa6565b610714565b34801561026f57600080fd5b506101cb61027e366004612fd1565b6108a4565b34801561028f57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161020a919061305c565b3480156102de57600080fd5b506101cb6102ed36600461306f565b6108fe565b3480156102fe57600080fd5b506101cb610941565b34801561031357600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020a565b34801561036b57600080fd5b506102c56040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103b457600080fd5b506101cb6103c336600461306f565b61097d565b3480156103d457600080fd5b506103e86103e3366004612e66565b6109bc565b60405190815260200161020a565b34801561040257600080fd5b506101cb610411366004612fd1565b6109cf565b34801561042257600080fd5b506101cb61043136600461308c565b610a08565b34801561044257600080fd5b5061045661045136600461306f565b610a1e565b60405161020a9291906130b8565b34801561047057600080fd5b506101cb61047f3660046130e6565b610b4a565b34801561049057600080fd5b506104a461049f366004612e66565b610b73565b60405161020a9190613184565b3480156104bd57600080fd5b506101cb610d7e565b3480156104d257600080fd5b506101cb6104e136600461325d565b610e80565b3480156104f257600080fd5b506101cb6105013660046132c9565b611061565b34801561051257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661033a565b34801561053d57600080fd5b506101cb61054c366004612fa6565b611351565b34801561055d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061033a565b34801561059057600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff16610233565b3480156105c857600080fd5b506101cb6105d7366004613304565b611408565b3480156105e857600080fd5b5060095460405167ffffffffffffffff909116815260200161020a565b34801561061157600080fd5b506101cb6106203660046132c9565b611578565b34801561063157600080fd5b506101cb61064036600461333d565b61174d565b34801561065157600080fd5b506101cb610660366004612e66565b6117af565b6103e86106733660046134f5565b611a2d565b34801561068457600080fd5b506101cb610693366004612fa6565b612125565b3480156106a457600080fd5b5060075461033a90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020819052604080832090519101906106f89085908590613613565b9081526040519081900360200190205460ff1690509392505050565b61071c612139565b600754610100900473ffffffffffffffffffffffffffffffffffffffff1615610789576107897f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff169060006121ba565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945592909104169015610846576108467f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6121ba565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ac612139565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b610906612139565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610949612139565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097b60016123ba565b565b610985612139565b67ffffffffffffffff81166000908152600260205260408120906109a98282612e18565b6109b7600183016000612e18565b505050565b60006109c96004836124e6565b92915050565b6109d7612139565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610a10612139565b610a1a82826124f9565b5050565b600260205260009081526040902080548190610a3990613623565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6590613623565b8015610ab25780601f10610a8757610100808354040283529160200191610ab2565b820191906000526020600020905b815481529060010190602001808311610a9557829003601f168201915b505050505090806001018054610ac790613623565b80601f0160208091040260200160405190810160405280929190818152602001828054610af390613623565b8015610b405780601f10610b1557610100808354040283529160200191610b40565b820191906000526020600020905b815481529060010190602001808311610b2357829003601f168201915b5050505050905082565b610b52612139565b6109b773ffffffffffffffffffffffffffffffffffffffff84168383612653565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610be290613623565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e90613623565b8015610c5b5780601f10610c3057610100808354040283529160200191610c5b565b820191906000526020600020905b815481529060010190602001808311610c3e57829003601f168201915b50505050508152602001600382018054610c7490613623565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca090613623565b8015610ced5780601f10610cc257610100808354040283529160200191610ced565b820191906000526020600020905b815481529060010190602001808311610cd057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d705760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d1b565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e88612139565b60005b81811015610f6b5760026000848484818110610ea957610ea9613676565b9050602002810190610ebb91906136a5565b610ec990602081019061306f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610f0057610f00613676565b9050602002810190610f1291906136a5565b610f209060208101906136e3565b604051610f2e929190613613565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610e8b565b5060005b8381101561105a57600160026000878785818110610f8f57610f8f613676565b9050602002810190610fa191906136a5565b610faf90602081019061306f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fe657610fe6613676565b9050602002810190610ff891906136a5565b6110069060208101906136e3565b604051611014929190613613565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610f6f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146110d2576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610dfb565b6110e2604082016020830161306f565b6110ef60408301836136e3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602081905260409182902091519101935061114c9250849150613748565b9081526040519081900360200190205460ff1661119757806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dfb919061305c565b6111a7604084016020850161306f565b67ffffffffffffffff8116600090815260026020526040902080546111cb90613623565b9050600003611212576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610dfb565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061124e90879060040161385c565b600060405180830381600087803b15801561126857600080fd5b505af1925050508015611279575060015b61131e573d8080156112a7576040519150601f19603f3d011682016040523d82523d6000602084013e6112ac565b606091505b506112be853560015b600491906126a9565b508435600090815260036020526040902085906112db8282613c2e565b50506040518535907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061131090849061305c565b60405180910390a25061134b565b6040518435907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b50505050565b611359612139565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522090610a1a9082613d28565b611410612139565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260208181526040928390208351918201949094526001939091019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526114cb91613748565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600260205220906109b79082613d28565b3330146115b1576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115c1604082016020830161306f565b6115ce60408301836136e3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602081905260409182902091519101935061162b9250849150613748565b9081526040519081900360200190205460ff1661167657806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dfb919061305c565b611686604084016020850161306f565b67ffffffffffffffff8116600090815260026020526040902080546116aa90613623565b90506000036116f1576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610dfb565b600061170060608601866136e3565b81019061170d9190612e66565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff1661105a5761105a611748826001613e42565b6123ba565b611755612139565b67ffffffffffffffff851660009081526002602052604090206117798486836139b2565b50801561105a5767ffffffffffffffff851660009081526002602052604090206001016117a78284836139b2565b505050505050565b6117b7612139565b60016117c46004836124e6565b146117fe576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610dfb565b6118098160006112b5565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161185190613623565b80601f016020809104026020016040519081016040528092919081815260200182805461187d90613623565b80156118ca5780601f1061189f576101008083540402835291602001916118ca565b820191906000526020600020905b8154815290600101906020018083116118ad57829003601f168201915b505050505081526020016003820180546118e390613623565b80601f016020809104026020016040519081016040528092919081815260200182805461190f90613623565b801561195c5780601f106119315761010080835404028352916020019161195c565b820191906000526020600020905b81548152906001019060200180831161193f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156119df5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161198a565b505050508152505090506119f2816126be565b6119fd600483612764565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff841660009081526002602052604081208054869190611a5490613623565b9050600003611a9b576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610dfb565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182208054829190611acb90613623565b80601f0160208091040260200160405190810160405280929190818152602001828054611af790613623565b8015611b445780601f10611b1957610100808354040283529160200191611b44565b820191906000526020600020905b815481529060010190602001808311611b2757829003601f168201915b505050505081526020018681526020018781526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600260008a67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054611bab90613623565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd790613623565b8015611c245780601f10611bf957610100808354040283529160200191611c24565b820191906000526020600020905b815481529060010190602001808311611c0757829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded89846040518363ffffffff1660e01b8152600401611c8b929190613e55565b602060405180830381865afa158015611ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccc9190613f22565b90506000805b8851811015611e8d57611d4233308b8481518110611cf257611cf2613676565b6020026020010151602001518c8581518110611d1057611d10613676565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612770909392919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff16898281518110611d6b57611d6b613676565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16148015611daf575073ffffffffffffffffffffffffffffffffffffffff871615155b8015611dda575060075473ffffffffffffffffffffffffffffffffffffffff88811661010090920416145b15611e005760019150611dfb3330858c8581518110611d1057611d10613676565b611e85565b611e857f00000000000000000000000000000000000000000000000000000000000000008a8381518110611e3657611e36613676565b6020026020010151602001518b8481518110611e5457611e54613676565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166121ba9092919063ffffffff16565b600101611cd2565b5080158015611ebb575060075473ffffffffffffffffffffffffffffffffffffffff87811661010090920416145b8015611edc575073ffffffffffffffffffffffffffffffffffffffff861615155b15611faa576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f719190613f22565b108015611f7e5750333014155b15611fa557611fa573ffffffffffffffffffffffffffffffffffffffff8716333085612770565b612004565b73ffffffffffffffffffffffffffffffffffffffff8616158015611fcd57508134105b15612004576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615612051576000612053565b835b8b866040518463ffffffff1660e01b8152600401612072929190613e55565b60206040518083038185885af1158015612090573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120b59190613f22565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a350505050949350505050565b61212d612139565b612136816127ce565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610dfb565b80158061225a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612234573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122589190613f22565b155b6122e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610dfb565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109b79084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526128c3565b806001166001036123fd576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612431565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161244691815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181526009546000808552602085019093529093506109b79267ffffffffffffffff909116916124c0565b60408051808201909152600080825260208201528152602001906001900390816124995790505b506007548490610100900473ffffffffffffffffffffffffffffffffffffffff16611a2d565b60006124f283836129cf565b9392505050565b80471015612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dfb565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146125bd576040519150601f19603f3d011682016040523d82523d6000602084013e6125c2565b606091505b50509050806109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dfb565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109b79084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612338565b60006126b6848484612a59565b949350505050565b60005b816080015151811015610a1a576000826080015182815181106126e6576126e6613676565b602002602001015160200151905060008360800151838151811061270c5761270c613676565b602002602001015160000151905061275a61273c60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff83169084612653565b50506001016126c1565b60006124f28383612a76565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261134b9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612338565b3373ffffffffffffffffffffffffffffffffffffffff82160361284d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610dfb565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612925826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a939092919063ffffffff16565b8051909150156109b757808060200190518101906129439190613f3b565b6109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dfb565b6000818152600283016020526040812054801515806129f357506129f38484612aa2565b6124f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610dfb565b600082815260028401602052604081208290556126b68484612aae565b600081815260028301602052604081208190556124f28383612aba565b60606126b68484600085612ac6565b60006124f28383612bdf565b60006124f28383612bf7565b60006124f28383612c46565b606082471015612b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dfb565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b819190613748565b60006040518083038185875af1925050503d8060008114612bbe576040519150601f19603f3d011682016040523d82523d6000602084013e612bc3565b606091505b5091509150612bd487838387612d39565b979650505050505050565b600081815260018301602052604081205415156124f2565b6000818152600183016020526040812054612c3e575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109c9565b5060006109c9565b60008181526001830160205260408120548015612d2f576000612c6a600183613f58565b8554909150600090612c7e90600190613f58565b9050818114612ce3576000866000018281548110612c9e57612c9e613676565b9060005260206000200154905080876000018481548110612cc157612cc1613676565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612cf457612cf4613f6b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109c9565b60009150506109c9565b60608315612dcf578251600003612dc85773ffffffffffffffffffffffffffffffffffffffff85163b612dc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dfb565b50816126b6565b6126b68383815115612de45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb919061305c565b508054612e2490613623565b6000825580601f10612e34575050565b601f01602090049060005260206000209081019061213691905b80821115612e625760008155600101612e4e565b5090565b600060208284031215612e7857600080fd5b5035919050565b6020810160038310612eba577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461213657600080fd5b60008083601f840112612ee857600080fd5b50813567ffffffffffffffff811115612f0057600080fd5b602083019150836020828501011115612f1857600080fd5b9250929050565b600080600060408486031215612f3457600080fd5b8335612f3f81612ec0565b9250602084013567ffffffffffffffff811115612f5b57600080fd5b612f6786828701612ed6565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461213657600080fd5b8035612fa181612f74565b919050565b600060208284031215612fb857600080fd5b81356124f281612f74565b801515811461213657600080fd5b600060208284031215612fe357600080fd5b81356124f281612fc3565b60005b83811015613009578181015183820152602001612ff1565b50506000910152565b6000815180845261302a816020860160208601612fee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006124f26020830184613012565b60006020828403121561308157600080fd5b81356124f281612ec0565b6000806040838503121561309f57600080fd5b82356130aa81612f74565b946020939093013593505050565b6040815260006130cb6040830185613012565b82810360208401526130dd8185613012565b95945050505050565b6000806000606084860312156130fb57600080fd5b833561310681612f74565b9250602084013561311681612f74565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613179578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161313c565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526131be60c0840182613012565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526131fa8383613012565b925060808601519150808584030160a0860152506130dd8282613127565b60008083601f84011261322a57600080fd5b50813567ffffffffffffffff81111561324257600080fd5b6020830191508360208260051b8501011115612f1857600080fd5b6000806000806040858703121561327357600080fd5b843567ffffffffffffffff8082111561328b57600080fd5b61329788838901613218565b909650945060208701359150808211156132b057600080fd5b506132bd87828801613218565b95989497509550505050565b6000602082840312156132db57600080fd5b813567ffffffffffffffff8111156132f257600080fd5b820160a081850312156124f257600080fd5b6000806040838503121561331757600080fd5b823561332281612ec0565b9150602083013561333281612f74565b809150509250929050565b60008060008060006060868803121561335557600080fd5b853561336081612ec0565b9450602086013567ffffffffffffffff8082111561337d57600080fd5b61338989838a01612ed6565b909650945060408801359150808211156133a257600080fd5b506133af88828901612ed6565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613412576134126133c0565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561345f5761345f6133c0565b604052919050565b600082601f83011261347857600080fd5b813567ffffffffffffffff811115613492576134926133c0565b6134c360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613418565b8181528460208386010111156134d857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561350b57600080fd5b843561351681612ec0565b935060208581013567ffffffffffffffff8082111561353457600080fd5b818801915088601f83011261354857600080fd5b81358181111561355a5761355a6133c0565b613568848260051b01613418565b81815260069190911b8301840190848101908b83111561358757600080fd5b938501935b828510156135d3576040858d0312156135a55760008081fd5b6135ad6133ef565b85356135b881612f74565b8152858701358782015282526040909401939085019061358c565b9750505060408801359250808311156135eb57600080fd5b50506135f987828801613467565b92505061360860608601612f96565b905092959194509250565b8183823760009101908152919050565b600181811c9082168061363757607f821691505b602082108103613670577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126136d957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261371857600080fd5b83018035915067ffffffffffffffff82111561373357600080fd5b602001915036819003821315612f1857600080fd5b600082516136d9818460208701612fee565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261378f57600080fd5b830160208101925035905067ffffffffffffffff8111156137af57600080fd5b803603821315612f1857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561317957813561382a81612f74565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613817565b60208152813560208201526000602083013561387781612ec0565b67ffffffffffffffff8082166040850152613895604086018661375a565b925060a060608601526138ac60c0860184836137be565b9250506138bc606086018661375a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526138f28583856137be565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261392b57600080fd5b6020928801928301923591508382111561394457600080fd5b8160061b360383131561395657600080fd5b8685030160a0870152612bd4848284613807565b601f8211156109b7576000816000526020600020601f850160051c810160208610156139935750805b601f850160051c820191505b818110156117a75782815560010161399f565b67ffffffffffffffff8311156139ca576139ca6133c0565b6139de836139d88354613623565b8361396a565b6000601f841160018114613a3057600085156139fa5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561105a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613a7f5786850135825560209485019460019092019101613a5f565b5086821015613aba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b0681612f74565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613b6c57613b6c6133c0565b805483825580841015613bf95760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613bad57613bad613acc565b8086168614613bbe57613bbe613acc565b5060008360005260206000208360011b81018760011b820191505b80821015613bf4578282558284830155600282019150613bd9565b505050505b5060008181526020812083915b858110156117a757613c188383613afb565b6040929092019160029190910190600101613c06565b81358155600181016020830135613c4481612ec0565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613c8460408601866136e3565b93509150613c968383600287016139b2565b613ca360608601866136e3565b93509150613cb58383600387016139b2565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613cec57600080fd5b918401918235915080821115613d0157600080fd5b506020820191508060061b3603821315613d1a57600080fd5b61134b818360048601613b53565b815167ffffffffffffffff811115613d4257613d426133c0565b613d5681613d508454613623565b8461396a565b602080601f831160018114613da95760008415613d735750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556117a7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613df657888601518255948401946001909101908401613dd7565b5085821015613e3257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156109c9576109c9613acc565b67ffffffffffffffff83168152604060208201526000825160a06040840152613e8160e0840182613012565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613ebd8383613012565b92506040860151915080858403016080860152613eda8383613127565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613f188282613012565b9695505050505050565b600060208284031215613f3457600080fd5b5051919050565b600060208284031215613f4d57600080fd5b81516124f281612fc3565b818103818111156109c9576109c9613acc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"forwardingAddress\",\"type\":\"address\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620046af380380620046af833981016040819052620000349162000568565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000144565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013857620001386001600160a01b03821683600019620001ef565b5050505050506200068d565b336001600160a01b038216036200019e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002679190620005a7565b620002739190620005c1565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002cf91869190620002d516565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000324906001600160a01b038516908490620003ab565b805190915015620003a65780806020019051810190620003459190620005e9565b620003a65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003bc8484600085620003c4565b949350505050565b606082471015620004275760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b031685876040516200044591906200063a565b60006040518083038185875af1925050503d806000811462000484576040519150601f19603f3d011682016040523d82523d6000602084013e62000489565b606091505b5090925090506200049d87838387620004a8565b979650505050505050565b606083156200051c57825160000362000514576001600160a01b0385163b620005145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003bc565b620003bc8383815115620005335781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000658565b6001600160a01b03811681146200056557600080fd5b50565b600080604083850312156200057c57600080fd5b825162000589816200054f565b60208401519092506200059c816200054f565b809150509250929050565b600060208284031215620005ba57600080fd5b5051919050565b80820180821115620005e357634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fc57600080fd5b815180151581146200060d57600080fd5b9392505050565b60005b838110156200063157818101518382015260200162000617565b50506000910152565b600082516200064e81846020870162000614565b9190910192915050565b60208152600082518060208401526200067981604085016020870162000614565b601f01601f19169190910160400192915050565b608051613fdc620006d3600039600081816105a50152818161076a015281816108080152818161137101528181611de801528181611eb10152611f930152613fdc6000f3fe6080604052600436106101dc5760003560e01c80636939cd9711610102578063b187bd2611610095578063d8469e4011610064578063d8469e401461066a578063e89b44851461068a578063f2fde38b1461069d578063ff2deec3146106bd576101e3565b8063b187bd26146105c9578063b5a1101114610601578063bee518a414610621578063cf6730f81461064a576101e3565b806385572ffb116100d157806385572ffb1461052b5780638da5cb5b1461054b5780639d2aede514610576578063b0f479a114610596576101e3565b80636939cd97146104805780636fef519e146104ad57806379ba5097146104f65780638462a2b91461050b576101e3565b80632b6e5d631161017a5780635075a9d4116101495780635075a9d4146103f257806352f813c314610420578063536c6bfa146104405780635e35359e14610460576101e3565b80632b6e5d631461032b57806335f170ef14610383578063369f7f66146103b257806341eade46146103d2576101e3565b806316c38b3c116101b657806316c38b3c14610287578063181f5a77146102a75780631892b906146102f65780632874d8bf14610316576101e3565b806305bfe982146101f15780630e958d6b1461023757806311e85dff14610267576101e3565b366101e357005b3480156101ef57600080fd5b005b3480156101fd57600080fd5b5061022161020c366004612e72565b60086020526000908152604090205460ff1681565b60405161022e9190612e8b565b60405180910390f35b34801561024357600080fd5b50610257610252366004612f2b565b6106ef565b604051901515815260200161022e565b34801561027357600080fd5b506101ef610282366004612fa2565b61073a565b34801561029357600080fd5b506101ef6102a2366004612fcd565b6108ca565b3480156102b357600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022e9190613058565b34801561030257600080fd5b506101ef61031136600461306b565b610924565b34801561032257600080fd5b506101ef610967565b34801561033757600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022e565b34801561038f57600080fd5b506103a361039e36600461306b565b6109a3565b60405161022e93929190613088565b3480156103be57600080fd5b506101ef6103cd3660046130bf565b610ada565b3480156103de57600080fd5b506101ef6103ed36600461306b565b610d95565b3480156103fe57600080fd5b5061041261040d366004612e72565b610de0565b60405190815260200161022e565b34801561042c57600080fd5b506101ef61043b366004612fcd565b610df3565b34801561044c57600080fd5b506101ef61045b3660046130ef565b610e2c565b34801561046c57600080fd5b506101ef61047b36600461311b565b610e42565b34801561048c57600080fd5b506104a061049b366004612e72565b610e70565b60405161022e91906131b9565b3480156104b957600080fd5b506102e96040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561050257600080fd5b506101ef61107b565b34801561051757600080fd5b506101ef61052636600461329b565b611178565b34801561053757600080fd5b506101ef610546366004613307565b611359565b34801561055757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661035e565b34801561058257600080fd5b506101ef610591366004612fa2565b611654565b3480156105a257600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061035e565b3480156105d557600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff16610257565b34801561060d57600080fd5b506101ef61061c366004613342565b61170e565b34801561062d57600080fd5b5060095460405167ffffffffffffffff909116815260200161022e565b34801561065657600080fd5b506101ef610665366004613307565b611881565b34801561067657600080fd5b506101ef610685366004613370565b611a6e565b610412610698366004613528565b611aed565b3480156106a957600080fd5b506101ef6106b8366004612fa2565b6120a1565b3480156106c957600080fd5b5060075461035e90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071e9085908590613635565b9081526040519081900360200190205460ff1690509392505050565b6107426120b5565b600754610100900473ffffffffffffffffffffffffffffffffffffffff16156107af576107af7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000612136565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff8516179094559290910416901561086c5761086c7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612336565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108d26120b5565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b61092c6120b5565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61096f6120b5565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556109a1600161243a565b565b6002602052600090815260409020805460018201805460ff90921692916109c990613645565b80601f01602080910402602001604051908101604052809291908181526020018280546109f590613645565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b505050505090806002018054610a5790613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8390613645565b8015610ad05780601f10610aa557610100808354040283529160200191610ad0565b820191906000526020600020905b815481529060010190602001808311610ab357829003601f168201915b5050505050905083565b610ae26120b5565b6001610aef600484612547565b14610b2e576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b3e8260005b6004919061255a565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610b8690613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb290613645565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b50505050508152602001600382018054610c1890613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4490613645565b8015610c915780601f10610c6657610100808354040283529160200191610c91565b820191906000526020600020905b815481529060010190602001808311610c7457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d145760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cbf565b505050915250506040805173ffffffffffffffffffffffffffffffffffffffff85166020820152919250610d599183910160405160208183030381529060405261256f565b610d6460048461260e565b5060405183907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a2505050565b610d9d6120b5565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610ded600483612547565b92915050565b610dfb6120b5565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610e346120b5565b610e3e828261261a565b5050565b610e4a6120b5565b610e6b73ffffffffffffffffffffffffffffffffffffffff84168383612774565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610edf90613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0b90613645565b8015610f585780601f10610f2d57610100808354040283529160200191610f58565b820191906000526020600020905b815481529060010190602001808311610f3b57829003601f168201915b50505050508152602001600382018054610f7190613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9d90613645565b8015610fea5780601f10610fbf57610100808354040283529160200191610fea565b820191906000526020600020905b815481529060010190602001808311610fcd57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611018565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b25565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111806120b5565b60005b8181101561126357600260008484848181106111a1576111a1613698565b90506020028101906111b391906136c7565b6111c190602081019061306b565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111f8576111f8613698565b905060200281019061120a91906136c7565b611218906020810190613705565b604051611226929190613635565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611183565b5060005b838110156113525760016002600087878581811061128757611287613698565b905060200281019061129991906136c7565b6112a790602081019061306b565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112de576112de613698565b90506020028101906112f091906136c7565b6112fe906020810190613705565b60405161130c929190613635565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611267565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113ca576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b25565b6113da604082016020830161306b565b6113e76040830183613705565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611445925084915061376a565b9081526040519081900360200190205460ff1661149057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b259190613058565b6114a0604084016020850161306b565b67ffffffffffffffff811660009081526002602052604090206001810180546114c890613645565b159050806114d75750805460ff165b1561151a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b25565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061155690889060040161387e565b600060405180830381600087803b15801561157057600080fd5b505af1925050508015611581575060015b611621573d8080156115af576040519150601f19603f3d011682016040523d82523d6000602084013e6115b4565b606091505b506115c186356001610b35565b508535600090815260036020526040902086906115de8282613c50565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611613908490613058565b60405180910390a250611352565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165c6120b5565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610e3e9082613d4a565b6117166120b5565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d19161376a565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610e6b9082613d4a565b3330146118ba576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118ca604082016020830161306b565b6118d76040830183613705565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611935925084915061376a565b9081526040519081900360200190205460ff1661198057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b259190613058565b611990604084016020850161306b565b67ffffffffffffffff811660009081526002602052604090206001810180546119b890613645565b159050806119c75750805460ff165b15611a0a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b25565b6000611a196060870187613705565b810190611a269190612e72565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6657611a66611a61826001613e64565b61243a565b505050505050565b611a766120b5565b67ffffffffffffffff8516600090815260026020526040902060018101611a9e8587836139d4565b508115611ab65760028101611ab48385836139d4565b505b805460ff1615611a665780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611b1990613645565b15905080611b285750805460ff165b15611b6b576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b25565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611b9e90613645565b80601f0160208091040260200160405190810160405280929190818152602001828054611bca90613645565b8015611c175780601f10611bec57610100808354040283529160200191611c17565b820191906000526020600020905b815481529060010190602001808311611bfa57829003601f168201915b5050509183525050602080820188905260408083018a9052600754610100900473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611c7b90613645565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca790613645565b8015611cf45780601f10611cc957610100808354040283529160200191611cf4565b820191906000526020600020905b815481529060010190602001808311611cd757829003601f168201915b5050505050815250905060005b8651811015611e7057611d713330898481518110611d2157611d21613698565b6020026020010151602001518a8581518110611d3f57611d3f613698565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127ca909392919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16878281518110611dbc57611dbc613698565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611e6857611e687f0000000000000000000000000000000000000000000000000000000000000000888381518110611e1957611e19613698565b602002602001015160200151898481518110611e3757611e37613698565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123369092919063ffffffff16565b600101611d01565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611ee8908b908690600401613e77565b602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190613f3a565b600754909150610100900473ffffffffffffffffffffffffffffffffffffffff1615611f7957600754611f7990610100900473ffffffffffffffffffffffffffffffffffffffff163330846127ca565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615611fce576000611fd0565b825b8a856040518463ffffffff1660e01b8152600401611fef929190613e77565b60206040518083038185885af115801561200d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120329190613f3a565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6120a96120b5565b6120b281612828565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b25565b8015806121d657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d49190613f3a565b155b612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b25565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610e6b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261291d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156123ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d19190613f3a565b6123db9190613e64565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506124349085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016122b4565b50505050565b8060011660010361247d576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16124b1565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b6000816040516020016124c691815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610e6b9267ffffffffffffffff90911691612540565b60408051808201909152600080825260208201528152602001906001900390816125195790505b5083611aed565b60006125538383612a29565b9392505050565b6000612567848484612ab3565b949350505050565b6000818060200190518101906125859190613f53565b905060005b836080015151811015612434576000846080015182815181106125af576125af613698565b60200260200101516020015190506000856080015183815181106125d5576125d5613698565b602090810291909101015151905061260473ffffffffffffffffffffffffffffffffffffffff82168584612774565b505060010161258a565b60006125538383612ad0565b80471015612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b25565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146126de576040519150601f19603f3d011682016040523d82523d6000602084013e6126e3565b606091505b5050905080610e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b25565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610e6b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016122b4565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526124349085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016122b4565b3373ffffffffffffffffffffffffffffffffffffffff8216036128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b25565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061297f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aed9092919063ffffffff16565b805190915015610e6b578080602001905181019061299d9190613f70565b610e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b25565b600081815260028301602052604081205480151580612a4d5750612a4d8484612afc565b612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b25565b600082815260028401602052604081208290556125678484612b08565b600081815260028301602052604081208190556125538383612b14565b60606125678484600085612b20565b60006125538383612c39565b60006125538383612c51565b60006125538383612ca0565b606082471015612bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b25565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612bdb919061376a565b60006040518083038185875af1925050503d8060008114612c18576040519150601f19603f3d011682016040523d82523d6000602084013e612c1d565b606091505b5091509150612c2e87838387612d93565b979650505050505050565b60008181526001830160205260408120541515612553565b6000818152600183016020526040812054612c9857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ded565b506000610ded565b60008181526001830160205260408120548015612d89576000612cc4600183613f8d565b8554909150600090612cd890600190613f8d565b9050818114612d3d576000866000018281548110612cf857612cf8613698565b9060005260206000200154905080876000018481548110612d1b57612d1b613698565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d4e57612d4e613fa0565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ded565b6000915050610ded565b60608315612e29578251600003612e225773ffffffffffffffffffffffffffffffffffffffff85163b612e22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b25565b5081612567565b6125678383815115612e3e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b259190613058565b600060208284031215612e8457600080fd5b5035919050565b6020810160038310612ec6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146120b257600080fd5b60008083601f840112612ef457600080fd5b50813567ffffffffffffffff811115612f0c57600080fd5b602083019150836020828501011115612f2457600080fd5b9250929050565b600080600060408486031215612f4057600080fd5b8335612f4b81612ecc565b9250602084013567ffffffffffffffff811115612f6757600080fd5b612f7386828701612ee2565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146120b257600080fd5b600060208284031215612fb457600080fd5b813561255381612f80565b80151581146120b257600080fd5b600060208284031215612fdf57600080fd5b813561255381612fbf565b60005b83811015613005578181015183820152602001612fed565b50506000910152565b60008151808452613026816020860160208601612fea565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612553602083018461300e565b60006020828403121561307d57600080fd5b813561255381612ecc565b83151581526060602082015260006130a3606083018561300e565b82810360408401526130b5818561300e565b9695505050505050565b600080604083850312156130d257600080fd5b8235915060208301356130e481612f80565b809150509250929050565b6000806040838503121561310257600080fd5b823561310d81612f80565b946020939093013593505050565b60008060006060848603121561313057600080fd5b833561313b81612f80565b9250602084013561314b81612f80565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156131ae578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613171565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526131f360c084018261300e565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261322f838361300e565b925060808601519150808584030160a08601525061324d828261315c565b95945050505050565b60008083601f84011261326857600080fd5b50813567ffffffffffffffff81111561328057600080fd5b6020830191508360208260051b8501011115612f2457600080fd5b600080600080604085870312156132b157600080fd5b843567ffffffffffffffff808211156132c957600080fd5b6132d588838901613256565b909650945060208701359150808211156132ee57600080fd5b506132fb87828801613256565b95989497509550505050565b60006020828403121561331957600080fd5b813567ffffffffffffffff81111561333057600080fd5b820160a0818503121561255357600080fd5b6000806040838503121561335557600080fd5b823561336081612ecc565b915060208301356130e481612f80565b60008060008060006060868803121561338857600080fd5b853561339381612ecc565b9450602086013567ffffffffffffffff808211156133b057600080fd5b6133bc89838a01612ee2565b909650945060408801359150808211156133d557600080fd5b506133e288828901612ee2565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613445576134456133f3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613492576134926133f3565b604052919050565b600082601f8301126134ab57600080fd5b813567ffffffffffffffff8111156134c5576134c56133f3565b6134f660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161344b565b81815284602083860101111561350b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561353d57600080fd5b833561354881612ecc565b925060208481013567ffffffffffffffff8082111561356657600080fd5b818701915087601f83011261357a57600080fd5b81358181111561358c5761358c6133f3565b61359a848260051b0161344b565b81815260069190911b8301840190848101908a8311156135b957600080fd5b938501935b82851015613605576040858c0312156135d75760008081fd5b6135df613422565b85356135ea81612f80565b815285870135878201528252604090940193908501906135be565b96505050604087013592508083111561361d57600080fd5b505061362b8682870161349a565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061365957607f821691505b602082108103613692577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126136fb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261373a57600080fd5b83018035915067ffffffffffffffff82111561375557600080fd5b602001915036819003821315612f2457600080fd5b600082516136fb818460208701612fea565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137b157600080fd5b830160208101925035905067ffffffffffffffff8111156137d157600080fd5b803603821315612f2457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156131ae57813561384c81612f80565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613839565b60208152813560208201526000602083013561389981612ecc565b67ffffffffffffffff80821660408501526138b7604086018661377c565b925060a060608601526138ce60c0860184836137e0565b9250506138de606086018661377c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526139148583856137e0565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261394d57600080fd5b6020928801928301923591508382111561396657600080fd5b8160061b360383131561397857600080fd5b8685030160a0870152612c2e848284613829565b601f821115610e6b576000816000526020600020601f850160051c810160208610156139b55750805b601f850160051c820191505b81811015611a66578281556001016139c1565b67ffffffffffffffff8311156139ec576139ec6133f3565b613a00836139fa8354613645565b8361398c565b6000601f841160018114613a525760008515613a1c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611352565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613aa15786850135825560209485019460019092019101613a81565b5086821015613adc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b2881612f80565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613b8e57613b8e6133f3565b805483825580841015613c1b5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613bcf57613bcf613aee565b8086168614613be057613be0613aee565b5060008360005260206000208360011b81018760011b820191505b80821015613c16578282558284830155600282019150613bfb565b505050505b5060008181526020812083915b85811015611a6657613c3a8383613b1d565b6040929092019160029190910190600101613c28565b81358155600181016020830135613c6681612ecc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613ca66040860186613705565b93509150613cb88383600287016139d4565b613cc56060860186613705565b93509150613cd78383600387016139d4565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d0e57600080fd5b918401918235915080821115613d2357600080fd5b506020820191508060061b3603821315613d3c57600080fd5b612434818360048601613b75565b815167ffffffffffffffff811115613d6457613d646133f3565b613d7881613d728454613645565b8461398c565b602080601f831160018114613dcb5760008415613d955750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a66565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e1857888601518255948401946001909101908401613df9565b5085821015613e5457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610ded57610ded613aee565b67ffffffffffffffff83168152604060208201526000825160a06040840152613ea360e084018261300e565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613edf838361300e565b92506040860151915080858403016080860152613efc838361315c565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506130b5828261300e565b600060208284031215613f4c57600080fd5b5051919050565b600060208284031215613f6557600080fd5b815161255381612f80565b600060208284031215613f8257600080fd5b815161255381612fbf565b81810381811115610ded57610ded613aee565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -189,9 +189,9 @@ func (_PingPongDemo *PingPongDemoTransactorRaw) Transact(opts *bind.TransactOpts return _PingPongDemo.Contract.contract.Transact(opts, method, params...) } -func (_PingPongDemo *PingPongDemoCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) { +func (_PingPongDemo *PingPongDemoCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) { var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "ACKMESSAGEMAGICBYTES") + err := _PingPongDemo.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { return *new([]byte), err @@ -203,12 +203,12 @@ func (_PingPongDemo *PingPongDemoCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpt } -func (_PingPongDemo *PingPongDemoSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { - return _PingPongDemo.Contract.ACKMESSAGEMAGICBYTES(&_PingPongDemo.CallOpts) +func (_PingPongDemo *PingPongDemoSession) ACKMESSAGEHEADER() ([]byte, error) { + return _PingPongDemo.Contract.ACKMESSAGEHEADER(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCallerSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { - return _PingPongDemo.Contract.ACKMESSAGEMAGICBYTES(&_PingPongDemo.CallOpts) +func (_PingPongDemo *PingPongDemoCallerSession) ACKMESSAGEHEADER() ([]byte, error) { + return _PingPongDemo.Contract.ACKMESSAGEHEADER(&_PingPongDemo.CallOpts) } func (_PingPongDemo *PingPongDemoCaller) GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) { @@ -387,34 +387,35 @@ func (_PingPongDemo *PingPongDemoCallerSession) Owner() (common.Address, error) return _PingPongDemo.Contract.Owner(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, +func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) { var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "s_chains", arg0) + err := _PingPongDemo.contract.Call(opts, &out, "s_chainConfigs", arg0) - outstruct := new(SChains) + outstruct := new(SChainConfigs) if err != nil { return *outstruct, err } - outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) - outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) return *outstruct, err } -func (_PingPongDemo *PingPongDemoSession) SChains(arg0 uint64) (SChains, +func (_PingPongDemo *PingPongDemoSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _PingPongDemo.Contract.SChains(&_PingPongDemo.CallOpts, arg0) + return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, arg0) } -func (_PingPongDemo *PingPongDemoCallerSession) SChains(arg0 uint64) (SChains, +func (_PingPongDemo *PingPongDemoCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _PingPongDemo.Contract.SChains(&_PingPongDemo.CallOpts, arg0) + return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, arg0) } func (_PingPongDemo *PingPongDemoCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -507,16 +508,16 @@ func (_PingPongDemo *PingPongDemoTransactorSession) CcipReceive(message ClientAn return _PingPongDemo.Contract.CcipReceive(&_PingPongDemo.TransactOpts, message) } -func (_PingPongDemo *PingPongDemoTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data, feeToken) +func (_PingPongDemo *PingPongDemoTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data) } -func (_PingPongDemo *PingPongDemoSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.CcipSend(&_PingPongDemo.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +func (_PingPongDemo *PingPongDemoSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.CcipSend(&_PingPongDemo.TransactOpts, destChainSelector, tokenAmounts, data) } -func (_PingPongDemo *PingPongDemoTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.CcipSend(&_PingPongDemo.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +func (_PingPongDemo *PingPongDemoTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.CcipSend(&_PingPongDemo.TransactOpts, destChainSelector, tokenAmounts, data) } func (_PingPongDemo *PingPongDemoTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { @@ -567,16 +568,16 @@ func (_PingPongDemo *PingPongDemoTransactorSession) ProcessMessage(message Clien return _PingPongDemo.Contract.ProcessMessage(&_PingPongDemo.TransactOpts, message) } -func (_PingPongDemo *PingPongDemoTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "retryFailedMessage", messageId) +func (_PingPongDemo *PingPongDemoTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "retryFailedMessage", messageId, forwardingAddress) } -func (_PingPongDemo *PingPongDemoSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId) +func (_PingPongDemo *PingPongDemoSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId, forwardingAddress) } -func (_PingPongDemo *PingPongDemoTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId) +func (_PingPongDemo *PingPongDemoTransactorSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId, forwardingAddress) } func (_PingPongDemo *PingPongDemoTransactor) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { @@ -663,15 +664,15 @@ func (_PingPongDemo *PingPongDemoTransactorSession) TransferOwnership(to common. return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) } -func (_PingPongDemo *PingPongDemoTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_PingPongDemo *PingPongDemoTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_PingPongDemo *PingPongDemoSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_PingPongDemo *PingPongDemoSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) } -func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) } @@ -2117,7 +2118,8 @@ func (_PingPongDemo *PingPongDemoFilterer) ParsePong(log types.Log) (*PingPongDe return event, nil } -type SChains struct { +type SChainConfigs struct { + IsDisabled bool Recipient []byte ExtraArgsBytes []byte } @@ -2201,7 +2203,7 @@ func (_PingPongDemo *PingPongDemo) Address() common.Address { } type PingPongDemoInterface interface { - ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) + ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) @@ -2219,7 +2221,7 @@ type PingPongDemoInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) @@ -2233,7 +2235,7 @@ type PingPongDemoInterface interface { CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) @@ -2243,7 +2245,7 @@ type PingPongDemoInterface interface { ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) @@ -2259,7 +2261,7 @@ type PingPongDemoInterface interface { TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go index 363268370b..fa7a6129a1 100644 --- a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go +++ b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go @@ -30,6 +30,11 @@ var ( _ = abi.ConvertType ) +type CCIPClientBaseapprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -43,14 +48,9 @@ type ClientEVMTokenAmount struct { Amount *big.Int } -type ICCIPClientBaseapprovedSenderUpdate struct { - DestChainSelector uint64 - Sender []byte -} - var SelfFundedPingPongMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMagicBytes\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACKMESSAGEMAGICBYTES\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chains\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structICCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162004c1438038062004c148339810160408190526200003491620005fa565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000172565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013a576200013a6001600160a01b038216836000196200021d565b5050505050508060026200014f919062000653565b6009601d6101000a81548160ff021916908360ff16021790555050505062000743565b336001600160a01b03821603620001cc5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200029b5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000273573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000299919062000685565b155b6200030f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200008a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003679185916200036c16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003bb906001600160a01b0385169084906200043d565b805190915015620003675780806020019051810190620003dc91906200069f565b620003675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b60606200044e848460008562000456565b949350505050565b606082471015620004b95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004d79190620006f0565b60006040518083038185875af1925050503d806000811462000516576040519150601f19603f3d011682016040523d82523d6000602084013e6200051b565b606091505b5090925090506200052f878383876200053a565b979650505050505050565b60608315620005ae578251600003620005a6576001600160a01b0385163b620005a65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b50816200044e565b6200044e8383815115620005c55781518083602001fd5b8060405162461bcd60e51b81526004016200008a91906200070e565b6001600160a01b0381168114620005f757600080fd5b50565b6000806000606084860312156200061057600080fd5b83516200061d81620005e1565b60208501519093506200063081620005e1565b604085015190925060ff811681146200064857600080fd5b809150509250925092565b60ff81811683821602908116908181146200067e57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200069857600080fd5b5051919050565b600060208284031215620006b257600080fd5b81518015158114620006c357600080fd5b9392505050565b60005b83811015620006e7578181015183820152602001620006cd565b50506000910152565b6000825162000704818460208701620006ca565b9190910192915050565b60208152600082518060208401526200072f816040850160208701620006ca565b601f01601f19169190910160400192915050565b60805161447d62000797600039600081816105c20152818161080c015281816108aa01528181611141015281816114b401528181611f6f015281816121420152818161235801526128bc015261447d6000f3fe6080604052600436106101ff5760003560e01c80638462a2b91161010e578063bee518a4116100a7578063e6c725f511610079578063effde24011610061578063effde2401461072d578063f2fde38b14610740578063ff2deec31461076057005b8063e6c725f5146106c7578063ef686d8e1461070d57005b8063bee518a41461063e578063cf6730f814610667578063d8469e4014610687578063e4ca8754146106a757005b80639d2aede5116100e05780639d2aede514610593578063b0f479a1146105b3578063b187bd26146105e6578063b5a110111461061e57005b80638462a2b91461050857806385572ffb146105285780638da5cb5b146105485780638f491cba1461057357005b80633a51b79e11610198578063536c6bfa1161016a5780635e35359e116101525780635e35359e146104a65780636939cd97146104c657806379ba5097146104f357005b8063536c6bfa146104585780635dc5ebdb1461047857005b80633a51b79e146103a157806341eade46146103ea5780635075a9d41461040a57806352f813c31461043857005b8063181f5a77116101d1578063181f5a77146102be5780631892b906146103145780632874d8bf146103345780632b6e5d631461034957005b806305bfe982146102085780630e958d6b1461024e57806311e85dff1461027e57806316c38b3c1461029e57005b3661020657005b005b34801561021457600080fd5b506102386102233660046132c1565b60086020526000908152604090205460ff1681565b60405161024591906132da565b60405180910390f35b34801561025a57600080fd5b5061026e61026936600461337a565b610792565b6040519015158152602001610245565b34801561028a57600080fd5b50610206610299366004613401565b6107dc565b3480156102aa57600080fd5b506102066102b936600461342c565b61096c565b3480156102ca57600080fd5b506103076040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161024591906134b7565b34801561032057600080fd5b5061020661032f3660046134ca565b6109c6565b34801561034057600080fd5b50610206610a09565b34801561035557600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610245565b3480156103ad57600080fd5b506103076040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103f657600080fd5b506102066104053660046134ca565b610a45565b34801561041657600080fd5b5061042a6104253660046132c1565b610a84565b604051908152602001610245565b34801561044457600080fd5b5061020661045336600461342c565b610a97565b34801561046457600080fd5b506102066104733660046134e7565b610ad0565b34801561048457600080fd5b506104986104933660046134ca565b610ae6565b604051610245929190613513565b3480156104b257600080fd5b506102066104c1366004613541565b610c12565b3480156104d257600080fd5b506104e66104e13660046132c1565b610c3b565b60405161024591906135df565b3480156104ff57600080fd5b50610206610e46565b34801561051457600080fd5b506102066105233660046136b8565b610f48565b34801561053457600080fd5b50610206610543366004613724565b611129565b34801561055457600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661037c565b34801561057f57600080fd5b5061020661058e3660046132c1565b611419565b34801561059f57600080fd5b506102066105ae366004613401565b6115fd565b3480156105bf57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b3480156105f257600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661026e565b34801561062a57600080fd5b5061020661063936600461375f565b6116b4565b34801561064a57600080fd5b5060095460405167ffffffffffffffff9091168152602001610245565b34801561067357600080fd5b50610206610682366004613724565b611824565b34801561069357600080fd5b506102066106a2366004613798565b6119f9565b3480156106b357600080fd5b506102066106c23660046132c1565b611a5b565b3480156106d357600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610245565b34801561071957600080fd5b5061020661072836600461381b565b611cd9565b61042a61073b366004613973565b611d6a565b34801561074c57600080fd5b5061020661075b366004613401565b612462565b34801561076c57600080fd5b5060075461037c90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020819052604080832090519101906107c09085908590613a91565b9081526040519081900360200190205460ff1690509392505050565b6107e4612473565b600754610100900473ffffffffffffffffffffffffffffffffffffffff1615610851576108517f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff169060006124f4565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff8516179094559290910416901561090e5761090e7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6124f4565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b610974612473565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109ce612473565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a11612473565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4360016126f4565b565b610a4d612473565b67ffffffffffffffff8116600090815260026020526040812090610a718282613273565b610a7f600183016000613273565b505050565b6000610a91600483612941565b92915050565b610a9f612473565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610ad8612473565b610ae28282612954565b5050565b600260205260009081526040902080548190610b0190613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613aa1565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b505050505090806001018054610b8f90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbb90613aa1565b8015610c085780601f10610bdd57610100808354040283529160200191610c08565b820191906000526020600020905b815481529060010190602001808311610beb57829003601f168201915b5050505050905082565b610c1a612473565b610a7f73ffffffffffffffffffffffffffffffffffffffff84168383612aae565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610caa90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd690613aa1565b8015610d235780601f10610cf857610100808354040283529160200191610d23565b820191906000526020600020905b815481529060010190602001808311610d0657829003601f168201915b50505050508152602001600382018054610d3c90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6890613aa1565b8015610db55780601f10610d8a57610100808354040283529160200191610db5565b820191906000526020600020905b815481529060010190602001808311610d9857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e385760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610de3565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ecc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f50612473565b60005b818110156110335760026000848484818110610f7157610f71613af4565b9050602002810190610f839190613b23565b610f919060208101906134ca565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610fc857610fc8613af4565b9050602002810190610fda9190613b23565b610fe8906020810190613b61565b604051610ff6929190613a91565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f53565b5060005b838110156111225760016002600087878581811061105757611057613af4565b90506020028101906110699190613b23565b6110779060208101906134ca565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106110ae576110ae613af4565b90506020028101906110c09190613b23565b6110ce906020810190613b61565b6040516110dc929190613a91565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611037565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461119a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ec3565b6111aa60408201602083016134ca565b6111b76040830183613b61565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260208190526040918290209151910193506112149250849150613bc6565b9081526040519081900360200190205460ff1661125f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ec391906134b7565b61126f60408401602085016134ca565b67ffffffffffffffff81166000908152600260205260409020805461129390613aa1565b90506000036112da576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610ec3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611316908790600401613cda565b600060405180830381600087803b15801561133057600080fd5b505af1925050508015611341575060015b6113e6573d80801561136f576040519150601f19603f3d011682016040523d82523d6000602084013e611374565b606091505b50611386853560015b60049190612b04565b508435600090815260036020526040902085906113a382826140ac565b50506040518535907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113d89084906134b7565b60405180910390a250611413565b6040518435907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b50505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061147157506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156114795750565b6009546001906114ad907d010000000000000000000000000000000000000000000000000000000000900460ff16836141a6565b116115fa577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157191906141e1565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115b857600080fd5b505af11580156115cc573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611605612473565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522090610ae290826141fe565b6116bc612473565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260208181526040928390208351918201949094526001939091019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261177791613bc6565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522090610a7f90826141fe565b33301461185d576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61186d60408201602083016134ca565b61187a6040830183613b61565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260208190526040918290209151910193506118d79250849150613bc6565b9081526040519081900360200190205460ff1661192257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ec391906134b7565b61193260408401602085016134ca565b67ffffffffffffffff81166000908152600260205260409020805461195690613aa1565b905060000361199d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610ec3565b60006119ac6060860186613b61565b8101906119b991906132c1565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611122576111226119f4826001614318565b6126f4565b611a01612473565b67ffffffffffffffff85166000908152600260205260409020611a25848683613e30565b5080156111225767ffffffffffffffff85166000908152600260205260409020600101611a53828483613e30565b505050505050565b611a63612473565b6001611a70600483612941565b14611aaa576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ec3565b611ab581600061137d565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611afd90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2990613aa1565b8015611b765780601f10611b4b57610100808354040283529160200191611b76565b820191906000526020600020905b815481529060010190602001808311611b5957829003601f168201915b50505050508152602001600382018054611b8f90613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbb90613aa1565b8015611c085780601f10611bdd57610100808354040283529160200191611c08565b820191906000526020600020905b815481529060010190602001808311611beb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611c8b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611c36565b50505050815250509050611c9e81612b19565b611ca9600483612bbf565b5060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611ce1612473565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b67ffffffffffffffff841660009081526002602052604081208054869190611d9190613aa1565b9050600003611dd8576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610ec3565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182208054829190611e0890613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3490613aa1565b8015611e815780601f10611e5657610100808354040283529160200191611e81565b820191906000526020600020905b815481529060010190602001808311611e6457829003601f168201915b505050505081526020018681526020018781526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600260008a67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054611ee890613aa1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1490613aa1565b8015611f615780601f10611f3657610100808354040283529160200191611f61565b820191906000526020600020905b815481529060010190602001808311611f4457829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded89846040518363ffffffff1660e01b8152600401611fc892919061432b565b602060405180830381865afa158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200991906143f8565b90506000805b88518110156121ca5761207f33308b848151811061202f5761202f613af4565b6020026020010151602001518c858151811061204d5761204d613af4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612bcb909392919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff168982815181106120a8576120a8613af4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161480156120ec575073ffffffffffffffffffffffffffffffffffffffff871615155b8015612117575060075473ffffffffffffffffffffffffffffffffffffffff88811661010090920416145b1561213d57600191506121383330858c858151811061204d5761204d613af4565b6121c2565b6121c27f00000000000000000000000000000000000000000000000000000000000000008a838151811061217357612173613af4565b6020026020010151602001518b848151811061219157612191613af4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124f49092919063ffffffff16565b60010161200f565b50801580156121f8575060075473ffffffffffffffffffffffffffffffffffffffff87811661010090920416145b8015612219575073ffffffffffffffffffffffffffffffffffffffff861615155b156122e7576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa15801561228a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ae91906143f8565b1080156122bb5750333014155b156122e2576122e273ffffffffffffffffffffffffffffffffffffffff8716333085612bcb565b612341565b73ffffffffffffffffffffffffffffffffffffffff861615801561230a57508134105b15612341576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f99088161561238e576000612390565b835b8b866040518463ffffffff1660e01b81526004016123af92919061432b565b60206040518083038185885af11580156123cd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123f291906143f8565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a350505050949350505050565b61246a612473565b6115fa81612c29565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ec3565b80158061259457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561256e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259291906143f8565b155b612620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ec3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a7f9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612d1e565b80600116600103612737576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a161276b565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b61277481611419565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e081016040516020818303038152906040528152602001836040516020016127d891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561285257816020015b604080518082019091526000808252602082015281526020019060019003908161282b5790505b50815260075473ffffffffffffffffffffffffffffffffffffffff6101009091048116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f9916128fe9167ffffffffffffffff90911690859060040161432b565b6020604051808303816000875af115801561291d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7f91906143f8565b600061294d8383612e2a565b9392505050565b804710156129be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ec3565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612a18576040519150601f19603f3d011682016040523d82523d6000602084013e612a1d565b606091505b5050905080610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ec3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a7f9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612672565b6000612b11848484612eb4565b949350505050565b60005b816080015151811015610ae257600082608001518281518110612b4157612b41613af4565b6020026020010151602001519050600083608001518381518110612b6757612b67613af4565b6020026020010151600001519050612bb5612b9760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff83169084612aae565b5050600101612b1c565b600061294d8383612ed1565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526114139085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612672565b3373ffffffffffffffffffffffffffffffffffffffff821603612ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ec3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612d80826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612eee9092919063ffffffff16565b805190915015610a7f5780806020019051810190612d9e9190614411565b610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ec3565b600081815260028301602052604081205480151580612e4e5750612e4e8484612efd565b61294d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610ec3565b60008281526002840160205260408120829055612b118484612f09565b6000818152600283016020526040812081905561294d8383612f15565b6060612b118484600085612f21565b600061294d838361303a565b600061294d8383613052565b600061294d83836130a1565b606082471015612fb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ec3565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fdc9190613bc6565b60006040518083038185875af1925050503d8060008114613019576040519150601f19603f3d011682016040523d82523d6000602084013e61301e565b606091505b509150915061302f87838387613194565b979650505050505050565b6000818152600183016020526040812054151561294d565b600081815260018301602052604081205461309957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a91565b506000610a91565b6000818152600183016020526040812054801561318a5760006130c560018361442e565b85549091506000906130d99060019061442e565b905081811461313e5760008660000182815481106130f9576130f9613af4565b906000526020600020015490508087600001848154811061311c5761311c613af4565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061314f5761314f614441565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a91565b6000915050610a91565b6060831561322a5782516000036132235773ffffffffffffffffffffffffffffffffffffffff85163b613223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ec3565b5081612b11565b612b11838381511561323f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec391906134b7565b50805461327f90613aa1565b6000825580601f1061328f575050565b601f0160209004906000526020600020908101906115fa91905b808211156132bd57600081556001016132a9565b5090565b6000602082840312156132d357600080fd5b5035919050565b6020810160038310613315577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146115fa57600080fd5b60008083601f84011261334357600080fd5b50813567ffffffffffffffff81111561335b57600080fd5b60208301915083602082850101111561337357600080fd5b9250929050565b60008060006040848603121561338f57600080fd5b833561339a8161331b565b9250602084013567ffffffffffffffff8111156133b657600080fd5b6133c286828701613331565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146115fa57600080fd5b80356133fc816133cf565b919050565b60006020828403121561341357600080fd5b813561294d816133cf565b80151581146115fa57600080fd5b60006020828403121561343e57600080fd5b813561294d8161341e565b60005b8381101561346457818101518382015260200161344c565b50506000910152565b60008151808452613485816020860160208601613449565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061294d602083018461346d565b6000602082840312156134dc57600080fd5b813561294d8161331b565b600080604083850312156134fa57600080fd5b8235613505816133cf565b946020939093013593505050565b604081526000613526604083018561346d565b8281036020840152613538818561346d565b95945050505050565b60008060006060848603121561355657600080fd5b8335613561816133cf565b92506020840135613571816133cf565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156135d4578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613597565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261361960c084018261346d565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613655838361346d565b925060808601519150808584030160a0860152506135388282613582565b60008083601f84011261368557600080fd5b50813567ffffffffffffffff81111561369d57600080fd5b6020830191508360208260051b850101111561337357600080fd5b600080600080604085870312156136ce57600080fd5b843567ffffffffffffffff808211156136e657600080fd5b6136f288838901613673565b9096509450602087013591508082111561370b57600080fd5b5061371887828801613673565b95989497509550505050565b60006020828403121561373657600080fd5b813567ffffffffffffffff81111561374d57600080fd5b820160a0818503121561294d57600080fd5b6000806040838503121561377257600080fd5b823561377d8161331b565b9150602083013561378d816133cf565b809150509250929050565b6000806000806000606086880312156137b057600080fd5b85356137bb8161331b565b9450602086013567ffffffffffffffff808211156137d857600080fd5b6137e489838a01613331565b909650945060408801359150808211156137fd57600080fd5b5061380a88828901613331565b969995985093965092949392505050565b60006020828403121561382d57600080fd5b813560ff8116811461294d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156138905761389061383e565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138dd576138dd61383e565b604052919050565b600082601f8301126138f657600080fd5b813567ffffffffffffffff8111156139105761391061383e565b61394160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613896565b81815284602083860101111561395657600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561398957600080fd5b84356139948161331b565b935060208581013567ffffffffffffffff808211156139b257600080fd5b818801915088601f8301126139c657600080fd5b8135818111156139d8576139d861383e565b6139e6848260051b01613896565b81815260069190911b8301840190848101908b831115613a0557600080fd5b938501935b82851015613a51576040858d031215613a235760008081fd5b613a2b61386d565b8535613a36816133cf565b81528587013587820152825260409094019390850190613a0a565b975050506040880135925080831115613a6957600080fd5b5050613a77878288016138e5565b925050613a86606086016133f1565b905092959194509250565b8183823760009101908152919050565b600181811c90821680613ab557607f821691505b602082108103613aee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613b5757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b9657600080fd5b83018035915067ffffffffffffffff821115613bb157600080fd5b60200191503681900382131561337357600080fd5b60008251613b57818460208701613449565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c0d57600080fd5b830160208101925035905067ffffffffffffffff811115613c2d57600080fd5b80360382131561337357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156135d4578135613ca8816133cf565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613c95565b602081528135602082015260006020830135613cf58161331b565b67ffffffffffffffff8082166040850152613d136040860186613bd8565b925060a06060860152613d2a60c086018483613c3c565b925050613d3a6060860186613bd8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613d70858385613c3c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613da957600080fd5b60209288019283019235915083821115613dc257600080fd5b8160061b3603831315613dd457600080fd5b8685030160a087015261302f848284613c85565b601f821115610a7f576000816000526020600020601f850160051c81016020861015613e115750805b601f850160051c820191505b81811015611a5357828155600101613e1d565b67ffffffffffffffff831115613e4857613e4861383e565b613e5c83613e568354613aa1565b83613de8565b6000601f841160018114613eae5760008515613e785750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611122565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613efd5786850135825560209485019460019092019101613edd565b5086821015613f38577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613f84816133cf565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613fea57613fea61383e565b8054838255808410156140775760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461402b5761402b613f4a565b808616861461403c5761403c613f4a565b5060008360005260206000208360011b81018760011b820191505b80821015614072578282558284830155600282019150614057565b505050505b5060008181526020812083915b85811015611a53576140968383613f79565b6040929092019160029190910190600101614084565b813581556001810160208301356140c28161331b565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141026040860186613b61565b93509150614114838360028701613e30565b6141216060860186613b61565b93509150614133838360038701613e30565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261416a57600080fd5b91840191823591508082111561417f57600080fd5b506020820191508060061b360382131561419857600080fd5b611413818360048601613fd1565b6000826141dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156141f357600080fd5b815161294d816133cf565b815167ffffffffffffffff8111156142185761421861383e565b61422c816142268454613aa1565b84613de8565b602080601f83116001811461427f57600084156142495750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a53565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142cc578886015182559484019460019091019084016142ad565b508582101561430857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610a9157610a91613f4a565b67ffffffffffffffff83168152604060208201526000825160a0604084015261435760e084018261346d565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152614393838361346d565b925060408601519150808584030160808601526143b08383613582565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506143ee828261346d565b9695505050505050565b60006020828403121561440a57600080fd5b5051919050565b60006020828403121561442357600080fd5b815161294d8161341e565b81810381811115610a9157610a91613f4a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"forwardingAddress\",\"type\":\"address\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162004c1338038062004c13833981016040819052620000349162000596565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000172565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013a576200013a6001600160a01b038216836000196200021d565b5050505050508060026200014f919062000605565b6009601d6101000a81548160ff021916908360ff16021790555050505062000705565b336001600160a01b03821603620001cc5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029591906200062b565b620002a1919062000645565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002fd918691906200030316565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000352906001600160a01b038516908490620003d9565b805190915015620003d4578080602001905181019062000373919062000661565b620003d45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003ea8484600085620003f2565b949350505050565b606082471015620004555760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004739190620006b2565b60006040518083038185875af1925050503d8060008114620004b2576040519150601f19603f3d011682016040523d82523d6000602084013e620004b7565b606091505b509092509050620004cb87838387620004d6565b979650505050505050565b606083156200054a57825160000362000542576001600160a01b0385163b620005425760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003ea565b620003ea8383815115620005615781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006d0565b6001600160a01b03811681146200059357600080fd5b50565b600080600060608486031215620005ac57600080fd5b8351620005b9816200057d565b6020850151909350620005cc816200057d565b604085015190925060ff81168114620005e457600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff8181168382160290811690818114620006245762000624620005ef565b5092915050565b6000602082840312156200063e57600080fd5b5051919050565b808201808211156200065b576200065b620005ef565b92915050565b6000602082840312156200067457600080fd5b815180151581146200068557600080fd5b9392505050565b60005b83811015620006a95781810151838201526020016200068f565b50506000910152565b60008251620006c68184602087016200068c565b9190910192915050565b6020815260008251806020840152620006f18160408501602087016200068c565b601f01601f19169190910160400192915050565b6080516144ba620007596000396000818161060d01528181610838015281816108d60152818161143f015281816117bd0152818161209a0152818161216301528181612245015261294201526144ba6000f3fe60806040526004361061021d5760003560e01c806379ba50971161011d578063b5a11011116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461074b578063f2fde38b1461076b578063ff2deec31461078b57610224565b8063e6c725f5146106f2578063e89b44851461073857610224565b8063b5a1101114610669578063bee518a414610689578063cf6730f8146106b2578063d8469e40146106d257610224565b80638f491cba116100ec5780638f491cba146105be5780639d2aede5146105de578063b0f479a1146105fe578063b187bd261461063157610224565b806379ba50971461053e5780638462a2b91461055357806385572ffb146105735780638da5cb5b1461059357610224565b806335f170ef116101b057806352f813c31161017f5780635e35359e116101645780635e35359e146104a85780636939cd97146104c85780636fef519e146104f557610224565b806352f813c314610468578063536c6bfa1461048857610224565b806335f170ef146103cb578063369f7f66146103fa57806341eade461461041a5780635075a9d41461043a57610224565b8063181f5a77116101ec578063181f5a77146102e85780631892b9061461033e5780632874d8bf1461035e5780632b6e5d631461037357610224565b806305bfe982146102325780630e958d6b1461027857806311e85dff146102a857806316c38b3c146102c857610224565b3661022457005b34801561023057600080fd5b005b34801561023e57600080fd5b5061026261024d3660046132f2565b60086020526000908152604090205460ff1681565b60405161026f919061330b565b60405180910390f35b34801561028457600080fd5b506102986102933660046133ab565b6107bd565b604051901515815260200161026f565b3480156102b457600080fd5b506102306102c3366004613422565b610808565b3480156102d457600080fd5b506102306102e336600461344d565b610998565b3480156102f457600080fd5b506103316040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161026f91906134d8565b34801561034a57600080fd5b506102306103593660046134eb565b6109f2565b34801561036a57600080fd5b50610230610a35565b34801561037f57600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161026f565b3480156103d757600080fd5b506103eb6103e63660046134eb565b610a71565b60405161026f93929190613508565b34801561040657600080fd5b5061023061041536600461353f565b610ba8565b34801561042657600080fd5b506102306104353660046134eb565b610e63565b34801561044657600080fd5b5061045a6104553660046132f2565b610eae565b60405190815260200161026f565b34801561047457600080fd5b5061023061048336600461344d565b610ec1565b34801561049457600080fd5b506102306104a336600461356f565b610efa565b3480156104b457600080fd5b506102306104c336600461359b565b610f10565b3480156104d457600080fd5b506104e86104e33660046132f2565b610f3e565b60405161026f9190613639565b34801561050157600080fd5b506103316040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561054a57600080fd5b50610230611149565b34801561055f57600080fd5b5061023061056e36600461371b565b611246565b34801561057f57600080fd5b5061023061058e366004613787565b611427565b34801561059f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166103a6565b3480156105ca57600080fd5b506102306105d93660046132f2565b611722565b3480156105ea57600080fd5b506102306105f9366004613422565b611906565b34801561060a57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103a6565b34801561063d57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff16610298565b34801561067557600080fd5b506102306106843660046137c2565b6119c0565b34801561069557600080fd5b5060095460405167ffffffffffffffff909116815260200161026f565b3480156106be57600080fd5b506102306106cd366004613787565b611b33565b3480156106de57600080fd5b506102306106ed3660046137f0565b611d20565b3480156106fe57600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161026f565b61045a6107463660046139a8565b611d9f565b34801561075757600080fd5b50610230610766366004613ab5565b612353565b34801561077757600080fd5b50610230610786366004613422565b6123e4565b34801561079757600080fd5b506007546103a690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107ec9085908590613ad8565b9081526040519081900360200190205460ff1690509392505050565b6108106123f5565b600754610100900473ffffffffffffffffffffffffffffffffffffffff161561087d5761087d7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000612476565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff8516179094559290910416901561093a5761093a7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612676565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6109a06123f5565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109fa6123f5565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a3d6123f5565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a6f600161277a565b565b6002602052600090815260409020805460018201805460ff9092169291610a9790613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac390613ae8565b8015610b105780601f10610ae557610100808354040283529160200191610b10565b820191906000526020600020905b815481529060010190602001808311610af357829003601f168201915b505050505090806002018054610b2590613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5190613ae8565b8015610b9e5780601f10610b7357610100808354040283529160200191610b9e565b820191906000526020600020905b815481529060010190602001808311610b8157829003601f168201915b5050505050905083565b610bb06123f5565b6001610bbd6004846129c7565b14610bfc576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c0c8260005b600491906129da565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c5490613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8090613ae8565b8015610ccd5780601f10610ca257610100808354040283529160200191610ccd565b820191906000526020600020905b815481529060010190602001808311610cb057829003601f168201915b50505050508152602001600382018054610ce690613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1290613ae8565b8015610d5f5780601f10610d3457610100808354040283529160200191610d5f565b820191906000526020600020905b815481529060010190602001808311610d4257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610de25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d8d565b505050915250506040805173ffffffffffffffffffffffffffffffffffffffff85166020820152919250610e27918391016040516020818303038152906040526129ef565b610e32600484612a8e565b5060405183907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a2505050565b610e6b6123f5565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610ebb6004836129c7565b92915050565b610ec96123f5565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610f026123f5565b610f0c8282612a9a565b5050565b610f186123f5565b610f3973ffffffffffffffffffffffffffffffffffffffff84168383612bf4565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610fad90613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd990613ae8565b80156110265780601f10610ffb57610100808354040283529160200191611026565b820191906000526020600020905b81548152906001019060200180831161100957829003601f168201915b5050505050815260200160038201805461103f90613ae8565b80601f016020809104026020016040519081016040528092919081815260200182805461106b90613ae8565b80156110b85780601f1061108d576101008083540402835291602001916110b8565b820191906000526020600020905b81548152906001019060200180831161109b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561113b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016110e6565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610bf3565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61124e6123f5565b60005b81811015611331576002600084848481811061126f5761126f613b3b565b90506020028101906112819190613b6a565b61128f9060208101906134eb565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c6576112c6613b3b565b90506020028101906112d89190613b6a565b6112e6906020810190613ba8565b6040516112f4929190613ad8565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611251565b5060005b838110156114205760016002600087878581811061135557611355613b3b565b90506020028101906113679190613b6a565b6113759060208101906134eb565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ac576113ac613b3b565b90506020028101906113be9190613b6a565b6113cc906020810190613ba8565b6040516113da929190613ad8565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611335565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611498576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610bf3565b6114a860408201602083016134eb565b6114b56040830183613ba8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115139250849150613c0d565b9081526040519081900360200190205460ff1661155e57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bf391906134d8565b61156e60408401602085016134eb565b67ffffffffffffffff8116600090815260026020526040902060018101805461159690613ae8565b159050806115a55750805460ff165b156115e8576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bf3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611624908890600401613d21565b600060405180830381600087803b15801561163e57600080fd5b505af192505050801561164f575060015b6116ef573d80801561167d576040519150601f19603f3d011682016040523d82523d6000602084013e611682565b606091505b5061168f86356001610c03565b508535600090815260036020526040902086906116ac82826140f3565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e19084906134d8565b60405180910390a250611420565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177a57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117825750565b6009546001906117b6907d010000000000000000000000000000000000000000000000000000000000900460ff16836141ed565b11611903577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187a9190614228565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c157600080fd5b505af11580156118d5573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b61190e6123f5565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610f0c9082614245565b6119c86123f5565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8391613c0d565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610f399082614245565b333014611b6c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7c60408201602083016134eb565b611b896040830183613ba8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be79250849150613c0d565b9081526040519081900360200190205460ff16611c3257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bf391906134d8565b611c4260408401602085016134eb565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6a90613ae8565b15905080611c795750805460ff165b15611cbc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bf3565b6000611ccb6060870187613ba8565b810190611cd891906132f2565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1857611d18611d1382600161435f565b61277a565b505050505050565b611d286123f5565b67ffffffffffffffff8516600090815260026020526040902060018101611d50858783613e77565b508115611d685760028101611d66838583613e77565b505b805460ff1615611d185780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611dcb90613ae8565b15905080611dda5750805460ff165b15611e1d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bf3565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e5090613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7c90613ae8565b8015611ec95780601f10611e9e57610100808354040283529160200191611ec9565b820191906000526020600020905b815481529060010190602001808311611eac57829003601f168201915b5050509183525050602080820188905260408083018a9052600754610100900473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611f2d90613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5990613ae8565b8015611fa65780601f10611f7b57610100808354040283529160200191611fa6565b820191906000526020600020905b815481529060010190602001808311611f8957829003601f168201915b5050505050815250905060005b8651811015612122576120233330898481518110611fd357611fd3613b3b565b6020026020010151602001518a8581518110611ff157611ff1613b3b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c4a909392919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1687828151811061206e5761206e613b3b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461211a5761211a7f00000000000000000000000000000000000000000000000000000000000000008883815181106120cb576120cb613b3b565b6020026020010151602001518984815181106120e9576120e9613b3b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166126769092919063ffffffff16565b600101611fb3565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded9061219a908b908690600401614372565b602060405180830381865afa1580156121b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121db9190614435565b600754909150610100900473ffffffffffffffffffffffffffffffffffffffff161561222b5760075461222b90610100900473ffffffffffffffffffffffffffffffffffffffff16333084612c4a565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615612280576000612282565b825b8a856040518463ffffffff1660e01b81526004016122a1929190614372565b60206040518083038185885af11580156122bf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122e49190614435565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61235b6123f5565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b6123ec6123f5565b61190381612ca8565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bf3565b80158061251657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125149190614435565b155b6125a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610bf3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610f399084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612d9d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127119190614435565b61271b919061435f565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506127749085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016125f4565b50505050565b806001166001036127bd576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16127f1565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b6127fa81611722565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161285e91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156128d857816020015b60408051808201909152600080825260208201528152602001906001900390816128b15790505b50815260075473ffffffffffffffffffffffffffffffffffffffff6101009091048116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f9916129849167ffffffffffffffff909116908590600401614372565b6020604051808303816000875af11580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f399190614435565b60006129d38383612ea9565b9392505050565b60006129e7848484612f33565b949350505050565b600081806020019051810190612a059190614228565b905060005b83608001515181101561277457600084608001518281518110612a2f57612a2f613b3b565b6020026020010151602001519050600085608001518381518110612a5557612a55613b3b565b6020908102919091010151519050612a8473ffffffffffffffffffffffffffffffffffffffff82168584612bf4565b5050600101612a0a565b60006129d38383612f50565b80471015612b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bf3565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612b5e576040519150601f19603f3d011682016040523d82523d6000602084013e612b63565b606091505b5050905080610f39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bf3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610f399084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016125f4565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526127749085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016125f4565b3373ffffffffffffffffffffffffffffffffffffffff821603612d27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bf3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612dff826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612f6d9092919063ffffffff16565b805190915015610f395780806020019051810190612e1d919061444e565b610f39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bf3565b600081815260028301602052604081205480151580612ecd5750612ecd8484612f7c565b6129d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610bf3565b600082815260028401602052604081208290556129e78484612f88565b600081815260028301602052604081208190556129d38383612f94565b60606129e78484600085612fa0565b60006129d383836130b9565b60006129d383836130d1565b60006129d38383613120565b606082471015613032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bf3565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161305b9190613c0d565b60006040518083038185875af1925050503d8060008114613098576040519150601f19603f3d011682016040523d82523d6000602084013e61309d565b606091505b50915091506130ae87838387613213565b979650505050505050565b600081815260018301602052604081205415156129d3565b600081815260018301602052604081205461311857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ebb565b506000610ebb565b6000818152600183016020526040812054801561320957600061314460018361446b565b85549091506000906131589060019061446b565b90508181146131bd57600086600001828154811061317857613178613b3b565b906000526020600020015490508087600001848154811061319b5761319b613b3b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806131ce576131ce61447e565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ebb565b6000915050610ebb565b606083156132a95782516000036132a25773ffffffffffffffffffffffffffffffffffffffff85163b6132a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bf3565b50816129e7565b6129e783838151156132be5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf391906134d8565b60006020828403121561330457600080fd5b5035919050565b6020810160038310613346577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190357600080fd5b60008083601f84011261337457600080fd5b50813567ffffffffffffffff81111561338c57600080fd5b6020830191508360208285010111156133a457600080fd5b9250929050565b6000806000604084860312156133c057600080fd5b83356133cb8161334c565b9250602084013567ffffffffffffffff8111156133e757600080fd5b6133f386828701613362565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190357600080fd5b60006020828403121561343457600080fd5b81356129d381613400565b801515811461190357600080fd5b60006020828403121561345f57600080fd5b81356129d38161343f565b60005b8381101561348557818101518382015260200161346d565b50506000910152565b600081518084526134a681602086016020860161346a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129d3602083018461348e565b6000602082840312156134fd57600080fd5b81356129d38161334c565b8315158152606060208201526000613523606083018561348e565b8281036040840152613535818561348e565b9695505050505050565b6000806040838503121561355257600080fd5b82359150602083013561356481613400565b809150509250929050565b6000806040838503121561358257600080fd5b823561358d81613400565b946020939093013593505050565b6000806000606084860312156135b057600080fd5b83356135bb81613400565b925060208401356135cb81613400565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561362e578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016135f1565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261367360c084018261348e565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136af838361348e565b925060808601519150808584030160a0860152506136cd82826135dc565b95945050505050565b60008083601f8401126136e857600080fd5b50813567ffffffffffffffff81111561370057600080fd5b6020830191508360208260051b85010111156133a457600080fd5b6000806000806040858703121561373157600080fd5b843567ffffffffffffffff8082111561374957600080fd5b613755888389016136d6565b9096509450602087013591508082111561376e57600080fd5b5061377b878288016136d6565b95989497509550505050565b60006020828403121561379957600080fd5b813567ffffffffffffffff8111156137b057600080fd5b820160a081850312156129d357600080fd5b600080604083850312156137d557600080fd5b82356137e08161334c565b9150602083013561356481613400565b60008060008060006060868803121561380857600080fd5b85356138138161334c565b9450602086013567ffffffffffffffff8082111561383057600080fd5b61383c89838a01613362565b9096509450604088013591508082111561385557600080fd5b5061386288828901613362565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156138c5576138c5613873565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561391257613912613873565b604052919050565b600082601f83011261392b57600080fd5b813567ffffffffffffffff81111561394557613945613873565b61397660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016138cb565b81815284602083860101111561398b57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156139bd57600080fd5b83356139c88161334c565b925060208481013567ffffffffffffffff808211156139e657600080fd5b818701915087601f8301126139fa57600080fd5b813581811115613a0c57613a0c613873565b613a1a848260051b016138cb565b81815260069190911b8301840190848101908a831115613a3957600080fd5b938501935b82851015613a85576040858c031215613a575760008081fd5b613a5f6138a2565b8535613a6a81613400565b81528587013587820152825260409094019390850190613a3e565b965050506040870135925080831115613a9d57600080fd5b5050613aab8682870161391a565b9150509250925092565b600060208284031215613ac757600080fd5b813560ff811681146129d357600080fd5b8183823760009101908152919050565b600181811c90821680613afc57607f821691505b602082108103613b35577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613b9e57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613bdd57600080fd5b83018035915067ffffffffffffffff821115613bf857600080fd5b6020019150368190038213156133a457600080fd5b60008251613b9e81846020870161346a565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5457600080fd5b830160208101925035905067ffffffffffffffff811115613c7457600080fd5b8036038213156133a457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561362e578135613cef81613400565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613cdc565b602081528135602082015260006020830135613d3c8161334c565b67ffffffffffffffff8082166040850152613d5a6040860186613c1f565b925060a06060860152613d7160c086018483613c83565b925050613d816060860186613c1f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613db7858385613c83565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613df057600080fd5b60209288019283019235915083821115613e0957600080fd5b8160061b3603831315613e1b57600080fd5b8685030160a08701526130ae848284613ccc565b601f821115610f39576000816000526020600020601f850160051c81016020861015613e585750805b601f850160051c820191505b81811015611d1857828155600101613e64565b67ffffffffffffffff831115613e8f57613e8f613873565b613ea383613e9d8354613ae8565b83613e2f565b6000601f841160018114613ef55760008515613ebf5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611420565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613f445786850135825560209485019460019092019101613f24565b5086821015613f7f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613fcb81613400565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561403157614031613873565b8054838255808410156140be5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461407257614072613f91565b808616861461408357614083613f91565b5060008360005260206000208360011b81018760011b820191505b808210156140b957828255828483015560028201915061409e565b505050505b5060008181526020812083915b85811015611d18576140dd8383613fc0565b60409290920191600291909101906001016140cb565b813581556001810160208301356141098161334c565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141496040860186613ba8565b9350915061415b838360028701613e77565b6141686060860186613ba8565b9350915061417a838360038701613e77565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126141b157600080fd5b9184019182359150808211156141c657600080fd5b506020820191508060061b36038213156141df57600080fd5b612774818360048601614018565b600082614223577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561423a57600080fd5b81516129d381613400565b815167ffffffffffffffff81111561425f5761425f613873565b6142738161426d8454613ae8565b84613e2f565b602080601f8311600181146142c657600084156142905750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d18565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614313578886015182559484019460019091019084016142f4565b508582101561434f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610ebb57610ebb613f91565b67ffffffffffffffff83168152604060208201526000825160a0604084015261439e60e084018261348e565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526143da838361348e565b925060408601519150808584030160808601526143f783836135dc565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613535828261348e565b60006020828403121561444757600080fd5b5051919050565b60006020828403121561446057600080fd5b81516129d38161343f565b81810381811115610ebb57610ebb613f91565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -189,9 +189,9 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorRaw) Transact(opts *bind. return _SelfFundedPingPong.Contract.contract.Transact(opts, method, params...) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) { +func (_SelfFundedPingPong *SelfFundedPingPongCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) { var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "ACKMESSAGEMAGICBYTES") + err := _SelfFundedPingPong.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { return *new([]byte), err @@ -203,12 +203,12 @@ func (_SelfFundedPingPong *SelfFundedPingPongCaller) ACKMESSAGEMAGICBYTES(opts * } -func (_SelfFundedPingPong *SelfFundedPingPongSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { - return _SelfFundedPingPong.Contract.ACKMESSAGEMAGICBYTES(&_SelfFundedPingPong.CallOpts) +func (_SelfFundedPingPong *SelfFundedPingPongSession) ACKMESSAGEHEADER() ([]byte, error) { + return _SelfFundedPingPong.Contract.ACKMESSAGEHEADER(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { - return _SelfFundedPingPong.Contract.ACKMESSAGEMAGICBYTES(&_SelfFundedPingPong.CallOpts) +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) ACKMESSAGEHEADER() ([]byte, error) { + return _SelfFundedPingPong.Contract.ACKMESSAGEHEADER(&_SelfFundedPingPong.CallOpts) } func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetCountIncrBeforeFunding(opts *bind.CallOpts) (uint8, error) { @@ -409,34 +409,35 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) Owner() (common.Addr return _SelfFundedPingPong.Contract.Owner(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, +func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) { var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "s_chains", arg0) + err := _SelfFundedPingPong.contract.Call(opts, &out, "s_chainConfigs", arg0) - outstruct := new(SChains) + outstruct := new(SChainConfigs) if err != nil { return *outstruct, err } - outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) - outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) return *outstruct, err } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SChains(arg0 uint64) (SChains, +func (_SelfFundedPingPong *SelfFundedPingPongSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _SelfFundedPingPong.Contract.SChains(&_SelfFundedPingPong.CallOpts, arg0) + return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, arg0) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SChains(arg0 uint64) (SChains, +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, error) { - return _SelfFundedPingPong.Contract.SChains(&_SelfFundedPingPong.CallOpts, arg0) + return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, arg0) } func (_SelfFundedPingPong *SelfFundedPingPongCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -529,16 +530,16 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) CcipReceive(mess return _SelfFundedPingPong.Contract.CcipReceive(&_SelfFundedPingPong.TransactOpts, message) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data, feeToken) +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data) } -func (_SelfFundedPingPong *SelfFundedPingPongSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.CcipSend(&_SelfFundedPingPong.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +func (_SelfFundedPingPong *SelfFundedPingPongSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.CcipSend(&_SelfFundedPingPong.TransactOpts, destChainSelector, tokenAmounts, data) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.CcipSend(&_SelfFundedPingPong.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.CcipSend(&_SelfFundedPingPong.TransactOpts, destChainSelector, tokenAmounts, data) } func (_SelfFundedPingPong *SelfFundedPingPongTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { @@ -601,16 +602,16 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ProcessMessage(m return _SelfFundedPingPong.Contract.ProcessMessage(&_SelfFundedPingPong.TransactOpts, message) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "retryFailedMessage", messageId) +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "retryFailedMessage", messageId, forwardingAddress) } -func (_SelfFundedPingPong *SelfFundedPingPongSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId) +func (_SelfFundedPingPong *SelfFundedPingPongSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId, forwardingAddress) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId) +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId, forwardingAddress) } func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCountIncrBeforeFunding(opts *bind.TransactOpts, countIncrBeforeFunding uint8) (*types.Transaction, error) { @@ -709,15 +710,15 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) TransferOwnershi return _SelfFundedPingPong.Contract.TransferOwnership(&_SelfFundedPingPong.TransactOpts, to) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) } @@ -2396,7 +2397,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePong(log types.Log) return event, nil } -type SChains struct { +type SChainConfigs struct { + IsDisabled bool Recipient []byte ExtraArgsBytes []byte } @@ -2492,7 +2494,7 @@ func (_SelfFundedPingPong *SelfFundedPingPong) Address() common.Address { } type SelfFundedPingPongInterface interface { - ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) + ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) GetCountIncrBeforeFunding(opts *bind.CallOpts) (uint8, error) @@ -2512,7 +2514,7 @@ type SelfFundedPingPongInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChains(opts *bind.CallOpts, arg0 uint64) (SChains, + SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, error) @@ -2526,7 +2528,7 @@ type SelfFundedPingPongInterface interface { CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) @@ -2538,7 +2540,7 @@ type SelfFundedPingPongInterface interface { ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) SetCountIncrBeforeFunding(opts *bind.TransactOpts, countIncrBeforeFunding uint8) (*types.Transaction, error) @@ -2556,7 +2558,7 @@ type SelfFundedPingPongInterface interface { TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*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 f528d2e4ca..d8d68345d1 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,10 +5,10 @@ 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 fee3f82935ce7a26c65e12f19a472a4fccdae62755abdb42d8b0a01f0f06981a burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin c7efa00d2be62a97a814730c8e13aa70794ebfdd38a9f3b3c11554a5dfd70478 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin a0728e186af74968101135a58a483320ced9ab79b22b1b24ac6994254ee79097 -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 512700dfaad414d21660055794dc57b5372315d646db1e3ecfde7418358c7ff4 -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin c870a11de8fb202288487e388749c07abe14009ff28b14107df54d1d3f185fa8 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 4dc7ae5af9f63903e19cd29573dbb52aa80a64165954c20651d1d26945a2da9b -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin c72ec1121daa8203ec3abb9232b7b53639cd89ef95f239c91c057aa86c61b902 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 18d708c8441701964f3222d78b332d8b973832e260ae29ecf87bf59ee5ddf54a +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 8dd01cb18b917e0481e5a972b2e8f5efac94375170229f3109f46e046de04aaf +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 1d38efe13c3b8ae874e46a6ed98eabd33f77b8b1c96c7efc5c67fa8f5e063c08 +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 90b4fca2b5d20d816f238b679d391a78070d1aa0db967b2fbca5131a6c484414 ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin ef9e1f61b288bc31dda1c4e9d0bb8885b7b0bf1fe35bf74af8b12568e7532010 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 @@ -27,11 +27,11 @@ mock_usdc_token_transmitter: ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmit mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin 518e19efa2ff52b0fefd8e597b05765317ee7638189bfe34ca43de2f6599faf4 multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 6df7723df89f849400f62c36c9bb34dd7f89fc4134b63d81f1804e8398605e10 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 222755aa732e039f3515f0f6553b5fdc5448de93f4349798b92d41ab1eb2c568 price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 0b3e253684d7085aa11f9179b71453b9db9d11cabea41605d5b4ac4128f85bfb registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin cbe7698bfd811b485ac3856daf073a7bdebeefdf2583403ca4a19d5b7e2d4ae8 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin d33172da69255393b354f7dda79141287bb02bacd5260a57cc1f7bdbddfdd7b4 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 30ed080262ce13704aea2a84ebda7b025d5859823e44ec2aab450c735a2a6bf5 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin 48caf06855a2f60455364d384e5fb2e6ecdf0a9ce4c1fc706b54b9885df76695 From c3bb0472c226fe83857ba376eea0b3bdbe204afb Mon Sep 17 00:00:00 2001 From: Matt Yang Date: Tue, 2 Jul 2024 10:24:48 -0400 Subject: [PATCH 22/31] comments from pair --- .../applications/external/CCIPClientBase.sol | 20 ++++++++++++------- .../applications/external/CCIPReceiver.sol | 16 ++++++++++++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 3eebdf65c1..69e5cfdff8 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -20,15 +20,15 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { error InvalidSender(bytes sender); error InvalidRecipient(bytes recipient); - struct approvedSenderUpdate { + struct approvedSenderUpdate { // TODO capitalize uint64 destChainSelector; - bytes sender; + bytes sender; // TODO: add spack comments on what this field is } struct ChainConfig { - bool isDisabled; + bool isDisabled; // TODO rename: disabled bytes recipient; - bytes extraArgsBytes; + bytes extraArgsBytes; // TODO add explanas on why extraArgs is in ChainConfig, and not supposed to be supplied by sender at runtime mapping(bytes => bool) approvedSender; } @@ -42,7 +42,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // ================================================================ // │ Router Management │ // ================================================================ - + // TODO natspec this contract function getRouter() public view virtual returns (address) { return i_ccipRouter; } @@ -78,13 +78,17 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Fee Token Management │ // =============================================================== - fallback() external {} + fallback() external {} // TODO confirm with Devrel why they want this; we would prefer to not have a fallback to avoid silent failures + + // TODO add a comment why payable receive is in client base receive() external payable {} function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { Address.sendValue(to, amount); } + // TODO add a warning message, this should only be used for things like withdrawing tokens that werent sent in error + // this should never be used for recovering tokens from a message function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).safeTransfer(to, amount); } @@ -112,13 +116,15 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { s_chainConfigs[chainSelector].isDisabled = true; } - modifier validChain(uint64 chainSelector) { + // TODO change to supportedChain or isValidChain + modifier validChain(uint64 chainSelector) { // Must be storage and not memory because the struct contains a nested mapping ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; if (currentConfig.recipient.length == 0 || currentConfig.isDisabled) revert InvalidChain(chainSelector); _; } + // TODO ditto modifier validSender(uint64 chainSelector, bytes memory sender) { if (!s_chainConfigs[chainSelector].approvedSender[sender]) revert InvalidSender(sender); _; diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 5bbc1ca308..725b038572 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -13,7 +13,7 @@ contract CCIPReceiver is CCIPClientBase { using EnumerableMap for EnumerableMap.Bytes32ToUintMap; error OnlySelf(); - error ErrorCase(); + error ErrorCase(); // TODO remove error MessageNotFailed(bytes32 messageId); event MessageFailed(bytes32 indexed messageId, bytes reason); @@ -22,6 +22,7 @@ contract CCIPReceiver is CCIPClientBase { // Example error code, could have many different error codes. enum ErrorCode { + // TODO RESOLVED + ABANDONED // RESOLVED is first so that the default value is resolved. RESOLVED, // Could have any number of error codes here. @@ -34,6 +35,7 @@ contract CCIPReceiver is CCIPClientBase { // Contains failed messages and their state. EnumerableMap.Bytes32ToUintMap internal s_failedMessages; + // TODO: the contracts we ship to customers shouldn't have this by default, try refactoring this sim logic in a test helper bool internal s_simRevert; constructor(address router) CCIPClientBase(router) {} @@ -46,6 +48,13 @@ contract CCIPReceiver is CCIPClientBase { // │ Incoming Message Processing | // ================================================================ + // TODO: add comments on: + // if you want custom permisionless retry logic, plus owner extracting tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver + // this means the message will appear as success to CCIP, and you can track the actual message state within the dapp + // if you do not need custom permissionles retry logic, and you don't need owner token recovery function, then you don't need the try-catch + // because you can use ccip manualExecution as a retry function + // + // /// @notice The entrypoint for the CCIP router to call. This function should /// never revert, all errors should be handled internally in this contract. /// @param message The message to process. @@ -73,6 +82,7 @@ contract CCIPReceiver is CCIPClientBase { emit MessageSucceeded(message.messageId); } + /// @notice This function the entrypoint for this contract to process messages. /// @param message The message to process. /// @dev This example just sends the tokens to the owner of this contracts. More @@ -92,6 +102,8 @@ contract CCIPReceiver is CCIPClientBase { // │ Failed Message Processing | // ================== ============================================== + // TODO make this permissionless because the parties that want to retry the message isn't typically the owner, should make this permissionless retry + // /// @notice This function is callable by the owner when a message has failed /// to unblock the tokens that are associated with that message. /// @dev This function is only callable by the owner. @@ -113,6 +125,7 @@ contract CCIPReceiver is CCIPClientBase { emit MessageRecovered(messageId); } + // TODO make a owner-only recoveryAndAbandon message function with custom token receiver address function _retryFailedMessage(Client.Any2EVMMessage memory message, bytes memory retryData) internal virtual { (address forwardingAddress) = abi.decode(retryData, (address)); @@ -137,6 +150,7 @@ contract CCIPReceiver is CCIPClientBase { return s_failedMessages.get(messageId); } + // TODO remove // An example function to demonstrate recovery function setSimRevert(bool simRevert) external onlyOwner { s_simRevert = simRevert; From 3c9c623d42425d5fac16134b00652ba07547bc2b Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 2 Jul 2024 17:10:11 -0400 Subject: [PATCH 23/31] more cosmetic modifications based on sr. feedback --- contracts/gas-snapshots/ccip.gas-snapshot | 50 +++++------ .../ccip/applications/external/CCIPClient.sol | 2 +- .../applications/external/CCIPClientBase.sol | 40 +++++---- .../applications/external/CCIPReceiver.sol | 83 ++++++++----------- .../external/CCIPReceiverWithACK.sol | 29 +++---- .../ccip/applications/external/CCIPSender.sol | 2 +- .../applications/internal/PingPongDemo.sol | 4 +- .../external/CCIPClientTest.t.sol | 6 +- .../external/CCIPReceiverTest.t.sol | 24 +++--- .../external/CCIPReceiverWithAckTest.t.sol | 6 +- .../receivers/CCIPReceiverReverting.sol | 33 ++++++++ 11 files changed, 148 insertions(+), 131 deletions(-) create mode 100644 contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 9629b6b8c3..15d8c2d308 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,10 +34,10 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243568) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 331428) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 347276) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 241501) -CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 552173) +CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 331271) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 347022) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 241425) +CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 552000) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357994) @@ -88,17 +88,17 @@ CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1160583) CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1158919) CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562) -CCIPReceiverTest:test_HappyPath_Success() (gas: 193605) -CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428748) -CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 432364) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205094) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425143) +CCIPReceiverTest:test_HappyPath_Success() (gas: 193606) +CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428772) +CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 444827) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205076) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425122) CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18785) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 55238) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 331480) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437682) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2631077) -CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72646) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 55172) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 331323) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437638) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2639685) +CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72519) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339182) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224256) CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 367940) @@ -208,7 +208,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 170344) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 182073) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47177) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1381192) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1379785) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 232987) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 166040) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 180585) @@ -242,8 +242,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 199773) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28246) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 160817) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1473138) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3164486) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1471731) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3163078) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 201928) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 202502) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 651738) @@ -382,7 +382,7 @@ EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101458) EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165192) EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177948) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1377945) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1376538) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159863) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175094) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248764) @@ -414,14 +414,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131906) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1459318) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1457911) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186809) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26009) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 189003) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188464) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2846394) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2844986) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144106) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -680,9 +680,9 @@ OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 380711) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308219) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17766) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234273) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308231) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17898) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234226) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -829,8 +829,8 @@ Router_routeMessage:test_ManualExec_Success() (gas: 35381) Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25116) Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44724) Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 290332) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 452301) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 290288) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 451971) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20203) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 2e8c30b7da..98d5b0772e 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -26,7 +26,7 @@ contract CCIPClient is CCIPReceiverWithACK { uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, bytes memory data - ) public payable validChain(destChainSelector) returns (bytes32 messageId) { + ) public payable isValidChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: s_chainConfigs[destChainSelector].recipient, data: data, diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 69e5cfdff8..6b0844ed3f 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -12,26 +12,28 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { using SafeERC20 for IERC20; using Address for address; - address internal immutable i_ccipRouter; - error ZeroAddressNotAllowed(); error InvalidRouter(address router); error InvalidChain(uint64 chainSelector); error InvalidSender(bytes sender); error InvalidRecipient(bytes recipient); - struct approvedSenderUpdate { // TODO capitalize + struct ApprovedSenderUpdate { uint64 destChainSelector; - bytes sender; // TODO: add spack comments on what this field is + bytes sender; // The address which initiated source-chain message, abi-encoded in case of a non-EVM-compatible network } struct ChainConfig { - bool isDisabled; // TODO rename: disabled + bool disabled; bytes recipient; - bytes extraArgsBytes; // TODO add explanas on why extraArgs is in ChainConfig, and not supposed to be supplied by sender at runtime + // Includes additional configs such as manual gas limit, and OOO-execution. + // Should not be supplied at runtime to prevent unexpected contract behavior + bytes extraArgsBytes; mapping(bytes => bool) approvedSender; } + address internal immutable i_ccipRouter; + mapping(uint64 => ChainConfig) public s_chainConfigs; constructor(address router) { @@ -42,7 +44,8 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // ================================================================ // │ Router Management │ // ================================================================ - // TODO natspec this contract + + /// @notice returns the address of the CCIP Router set at contract-deployment function getRouter() public view virtual returns (address) { return i_ccipRouter; } @@ -58,8 +61,8 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // ================================================================ function updateApprovedSenders( - approvedSenderUpdate[] calldata adds, - approvedSenderUpdate[] calldata removes + ApprovedSenderUpdate[] calldata adds, + ApprovedSenderUpdate[] calldata removes ) external onlyOwner { for (uint256 i = 0; i < removes.length; ++i) { delete s_chainConfigs[removes[i].destChainSelector].approvedSender[removes[i].sender]; @@ -78,17 +81,14 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Fee Token Management │ // =============================================================== - fallback() external {} // TODO confirm with Devrel why they want this; we would prefer to not have a fallback to avoid silent failures - - // TODO add a comment why payable receive is in client base + /// @notice function is set in client base to support native-fee-token pre-funding in all children implemending CCIPSend receive() external payable {} function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { Address.sendValue(to, amount); } - // TODO add a warning message, this should only be used for things like withdrawing tokens that werent sent in error - // this should never be used for recovering tokens from a message + /// @notice Function should NEVER be used for transfering tokens from a failed message, only for recovering tokens sent in error function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).safeTransfer(to, amount); } @@ -109,23 +109,21 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { if (_extraArgsBytes.length != 0) currentConfig.extraArgsBytes = _extraArgsBytes; // If config was previously disabled, then re-enable it; - if (currentConfig.isDisabled) currentConfig.isDisabled = false; + if (currentConfig.disabled) currentConfig.disabled = false; } function disableChain(uint64 chainSelector) external onlyOwner { - s_chainConfigs[chainSelector].isDisabled = true; + s_chainConfigs[chainSelector].disabled = true; } - // TODO change to supportedChain or isValidChain - modifier validChain(uint64 chainSelector) { + modifier isValidChain(uint64 chainSelector) { // Must be storage and not memory because the struct contains a nested mapping ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; - if (currentConfig.recipient.length == 0 || currentConfig.isDisabled) revert InvalidChain(chainSelector); + if (currentConfig.recipient.length == 0 || currentConfig.disabled) revert InvalidChain(chainSelector); _; } - // TODO ditto - modifier validSender(uint64 chainSelector, bytes memory sender) { + modifier isValidSender(uint64 chainSelector, bytes memory sender) { if (!s_chainConfigs[chainSelector].approvedSender[sender]) revert InvalidSender(sender); _; } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 725b038572..9be6db83d5 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -13,20 +13,20 @@ contract CCIPReceiver is CCIPClientBase { using EnumerableMap for EnumerableMap.Bytes32ToUintMap; error OnlySelf(); - error ErrorCase(); // TODO remove error MessageNotFailed(bytes32 messageId); event MessageFailed(bytes32 indexed messageId, bytes reason); event MessageSucceeded(bytes32 indexed messageId); event MessageRecovered(bytes32 indexed messageId); + event MessageAbandoned(bytes32 indexed messageId, address tokenReceiver); // Example error code, could have many different error codes. enum ErrorCode { - // TODO RESOLVED + ABANDONED // RESOLVED is first so that the default value is resolved. RESOLVED, // Could have any number of error codes here. - FAILED + FAILED, + ABANDONED } // The message contents of failed messages are stored here. @@ -35,9 +35,6 @@ contract CCIPReceiver is CCIPClientBase { // Contains failed messages and their state. EnumerableMap.Bytes32ToUintMap internal s_failedMessages; - // TODO: the contracts we ship to customers shouldn't have this by default, try refactoring this sim logic in a test helper - bool internal s_simRevert; - constructor(address router) CCIPClientBase(router) {} function typeAndVersion() external pure virtual returns (string memory) { @@ -48,13 +45,6 @@ contract CCIPReceiver is CCIPClientBase { // │ Incoming Message Processing | // ================================================================ - // TODO: add comments on: - // if you want custom permisionless retry logic, plus owner extracting tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver - // this means the message will appear as success to CCIP, and you can track the actual message state within the dapp - // if you do not need custom permissionles retry logic, and you don't need owner token recovery function, then you don't need the try-catch - // because you can use ccip manualExecution as a retry function - // - // /// @notice The entrypoint for the CCIP router to call. This function should /// never revert, all errors should be handled internally in this contract. /// @param message The message to process. @@ -63,18 +53,21 @@ contract CCIPReceiver is CCIPClientBase { external virtual onlyRouter - validChain(message.sourceChainSelector) + isValidChain(message.sourceChainSelector) { try this.processMessage(message) {} catch (bytes memory err) { - // Could set different error codes based on the caught error. Each could be - // handled differently. + // Mark the message as having failed. Any failures should be tracked by individual Dapps, since CCIP + // will mark the message as having been successfully delivered. CCIP makes no assurances about message delivery + // other than invocation with proper gas limit. Any logic/execution errors should be tracked by separately. s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); + // Store the message contents in case it needs to be retried or abandoned s_messageContents[message.messageId] = message; - // Don't revert so CCIP doesn't revert. Emit event instead. - // The message can be retried later without having to do manual execution of CCIP. + // Don't revert because CCIPRouter doesn't revert. Emit event instead. + // The message can be retried or abandoned later without having to do manual execution of CCIP, which should + // be reserved for retrying with a higher gas limit. emit MessageFailed(message.messageId, err); return; } @@ -82,7 +75,6 @@ contract CCIPReceiver is CCIPClientBase { emit MessageSucceeded(message.messageId); } - /// @notice This function the entrypoint for this contract to process messages. /// @param message The message to process. /// @dev This example just sends the tokens to the owner of this contracts. More @@ -92,22 +84,16 @@ contract CCIPReceiver is CCIPClientBase { external virtual onlySelf - validSender(message.sourceChainSelector, message.sender) - { - // Insert Custom logic here - if (s_simRevert) revert ErrorCase(); - } + isValidSender(message.sourceChainSelector, message.sender) + {} // ================================================================ // │ Failed Message Processing | // ================== ============================================== - // TODO make this permissionless because the parties that want to retry the message isn't typically the owner, should make this permissionless retry - // - /// @notice This function is callable by the owner when a message has failed - /// to unblock the tokens that are associated with that message. - /// @dev This function is only callable by the owner. - function retryFailedMessage(bytes32 messageId, address forwardingAddress) external onlyOwner { + /// @notice This function is called when the initial message delivery has failed but should be attempted again with different logic + /// @dev By default this function is callable by anyone, and should be modified if special access control is needed. + function retryFailedMessage(bytes32 messageId) external { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); // Set the error code to 0 to disallow reentry and retry the same failed message @@ -117,45 +103,46 @@ contract CCIPReceiver is CCIPClientBase { // Allow developer to implement arbitrary functionality on retried messages, such as just releasing the associated tokens Client.Any2EVMMessage memory message = s_messageContents[messageId]; - // Let the user override the implementation, since different workflow may be desired for retrying a merssage - _retryFailedMessage(message, abi.encode(forwardingAddress)); - - s_failedMessages.remove(messageId); // If retry succeeds, remove from set of failed messages. + // Allow the user override the implementation, since different workflow may be desired for retrying a merssage + _retryFailedMessage(message); emit MessageRecovered(messageId); } - // TODO make a owner-only recoveryAndAbandon message function with custom token receiver address - function _retryFailedMessage(Client.Any2EVMMessage memory message, bytes memory retryData) internal virtual { - (address forwardingAddress) = abi.decode(retryData, (address)); + /// @notice Function should contain any special logic needed to "retry" processing of a previously failed message. + /// @dev if the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead + function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual {} - // Owner rescues tokens sent with a failed message - for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { - uint256 amount = message.destTokenAmounts[i].amount; - address token = message.destTokenAmounts[i].token; + /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried + /// @notice function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. + /// @dev this function is only callable as the owner, and + function abandonMessage(bytes32 messageId, address receiver) external onlyOwner { + if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); - IERC20(token).safeTransfer(forwardingAddress, amount); + s_failedMessages.set(messageId, uint256(ErrorCode.ABANDONED)); + Client.Any2EVMMessage memory message = s_messageContents[messageId]; + + for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { + IERC20(message.destTokenAmounts[i].token).safeTransfer(receiver, message.destTokenAmounts[i].amount); } + + emit MessageAbandoned(messageId, receiver); } // ================================================================ // │ Message Tracking │ // ================================================================ + /// @param messageId the ID of the message delivered by the CCIP Router function getMessageContents(bytes32 messageId) public view returns (Client.Any2EVMMessage memory) { return s_messageContents[messageId]; } + /// @param messageId the ID of the message delivered by the CCIP Router function getMessageStatus(bytes32 messageId) public view returns (uint256) { return s_failedMessages.get(messageId); } - // TODO remove - // An example function to demonstrate recovery - function setSimRevert(bool simRevert) external onlyOwner { - s_simRevert = simRevert; - } - modifier onlySelf() { if (msg.sender != address(this)) revert OnlySelf(); _; diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index d10445c26c..310182b311 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -14,21 +14,12 @@ contract CCIPReceiverWithACK is CCIPReceiver { using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; - // Current feeToken - IERC20 public s_feeToken; - - bytes public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; - - // mapping(bytes32 messageId => bool ackReceived) public s_messageAckReceived; - mapping(bytes32 messageId => MessageStatus status) public s_messageStatus; + error InvalidAckMessageHeader(); + error MessageAlreadyAcknowledged(bytes32 messageId); event MessageAckSent(bytes32 incomingMessageId); event MessageSent(bytes32 indexed incomingMessageId, bytes32 indexed ACKMessageId); event MessageAckReceived(bytes32); - - error InvalidAckMessageHeader(); - error MessageAlreadyAcknowledged(bytes32 messageId); - event FeeTokenModified(address indexed oldToken, address indexed newToken); enum MessageType { @@ -48,6 +39,13 @@ contract CCIPReceiverWithACK is CCIPReceiver { MessageType messageType; } + bytes public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; + + // Current feeToken + IERC20 public s_feeToken; + + mapping(bytes32 messageId => MessageStatus status) public s_messageStatus; + constructor(address router, IERC20 feeToken) CCIPReceiver(router) { s_feeToken = feeToken; @@ -86,16 +84,15 @@ contract CCIPReceiverWithACK is CCIPReceiver { public override onlyRouter - validSender(message.sourceChainSelector, message.sender) - validChain(message.sourceChainSelector) + isValidSender(message.sourceChainSelector, message.sender) + isValidChain(message.sourceChainSelector) { try this.processMessage(message) {} catch (bytes memory err) { - // Could set different error codes based on the caught error. Each could be - // handled differently. s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); s_messageContents[message.messageId] = message; - // Don't revert so CCIP doesn't revert. Emit event instead. + + // Don't revert so CCIPRouter doesn't revert. Emit event instead. // The message can be retried later without having to do manual execution of CCIP. emit MessageFailed(message.messageId, err); return; diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index acb9e3fa22..6590c495a3 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -42,7 +42,7 @@ contract CCIPSender is CCIPClientBase { Client.EVMTokenAmount[] calldata tokenAmounts, bytes calldata data, address feeToken - ) public payable validChain(destChainSelector) returns (bytes32 messageId) { + ) public payable isValidChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: s_chainConfigs[destChainSelector].recipient, data: data, diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 059fd4cd4e..64669c3819 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -62,8 +62,8 @@ contract PingPongDemo is CCIPClient { external override onlySelf - validSender(message.sourceChainSelector, message.sender) - validChain(message.sourceChainSelector) + isValidSender(message.sourceChainSelector, message.sender) + isValidChain(message.sourceChainSelector) { uint256 pingPongCount = abi.decode(message.data, (uint256)); if (!s_isPaused) { diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol index 6b0c619cea..ae924a8c60 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol @@ -29,11 +29,11 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { s_sender = new CCIPClient(address(s_sourceRouter), IERC20(s_sourceFeeToken)); s_sender.enableChain(destChainSelector, abi.encode(address(s_sender)), ""); - CCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new CCIPClientBase.approvedSenderUpdate[](1); + CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); senderUpdates[0] = - CCIPClientBase.approvedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_sender))}); + CCIPClientBase.ApprovedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_sender))}); - s_sender.updateApprovedSenders(senderUpdates, new CCIPClientBase.approvedSenderUpdate[](0)); + s_sender.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); } function test_ccipReceiveAndSendAck() public { diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index c16715537d..4ed15c2dbe 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -2,7 +2,9 @@ pragma solidity ^0.8.0; import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; + import {CCIPReceiver} from "../../../applications/external/CCIPReceiver.sol"; +import {CCIPReceiverReverting} from "../../helpers/receivers/CCIPReceiverReverting.sol"; import {Client} from "../../../libraries/Client.sol"; import {EVM2EVMOnRampSetup} from "../../onRamp/EVM2EVMOnRampSetup.t.sol"; @@ -14,22 +16,22 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { event MessageSucceeded(bytes32 indexed messageId); event MessageRecovered(bytes32 indexed messageId); - CCIPReceiver internal s_receiver; + CCIPReceiverReverting internal s_receiver; uint64 internal sourceChainSelector = 7331; function setUp() public virtual override { EVM2EVMOnRampSetup.setUp(); - s_receiver = new CCIPReceiver(address(s_destRouter)); + s_receiver = new CCIPReceiverReverting(address(s_destRouter)); s_receiver.enableChain(sourceChainSelector, abi.encode(address(1)), ""); - CCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new CCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.approvedSenderUpdate({ + CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ destChainSelector: sourceChainSelector, sender: abi.encode(address(s_receiver)) }); - s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.approvedSenderUpdate[](0)); + s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); } function test_Recovery_with_intentional_revert() public { @@ -49,7 +51,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.startPrank(address(s_destRouter)); vm.expectEmit(); - emit MessageFailed(messageId, abi.encodeWithSelector(CCIPReceiver.ErrorCase.selector)); + emit MessageFailed(messageId, abi.encodeWithSelector(CCIPReceiverReverting.ErrorCase.selector)); s_receiver.ccipReceive( Client.Any2EVMMessage({ @@ -69,9 +71,9 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.startPrank(OWNER); vm.expectEmit(); - emit MessageRecovered(messageId); + emit CCIPReceiver.MessageAbandoned(messageId, OWNER); - s_receiver.retryFailedMessage(messageId, OWNER); + s_receiver.abandonMessage(messageId, OWNER); // Assert the tokens have successfully been rescued from the contract. assertEq( @@ -191,13 +193,13 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { } function test_removeSender_from_approvedList_and_revert() public { - CCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new CCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.approvedSenderUpdate({ + CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ destChainSelector: sourceChainSelector, sender: abi.encode(address(s_receiver)) }); - s_receiver.updateApprovedSenders(new CCIPClientBase.approvedSenderUpdate[](0), senderUpdates); + s_receiver.updateApprovedSenders(new CCIPClientBase.ApprovedSenderUpdate[](0), senderUpdates); // assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); assertFalse(s_receiver.isApprovedSender(sourceChainSelector, abi.encode(address(s_receiver)))); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol index 989d07fef1..eca03f56f1 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol @@ -26,13 +26,13 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { s_receiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); s_receiver.enableChain(destChainSelector, abi.encode(address(s_receiver)), ""); - CCIPClientBase.approvedSenderUpdate[] memory senderUpdates = new CCIPClientBase.approvedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.approvedSenderUpdate({ + CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ destChainSelector: destChainSelector, sender: abi.encode(address(s_receiver)) }); - s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.approvedSenderUpdate[](0)); + s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); } function test_ccipReceive_and_respond_with_ack() public { diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol new file mode 100644 index 0000000000..5466ea19c6 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {CCIPReceiver} from "../../../applications/external/CCIPReceiver.sol"; +import {Client} from "../../../libraries/Client.sol"; + +contract CCIPReceiverReverting is CCIPReceiver { + error ErrorCase(); + + bool private s_simRevert; + + constructor(address router) CCIPReceiver(router) {} + + /// @notice This function the entrypoint for this contract to process messages. + /// @param message The message to process. + /// @dev This example just sends the tokens to the owner of this contracts. More + /// interesting functions could be implemented. + /// @dev It has to be external because of the try/catch. + function processMessage(Client.Any2EVMMessage calldata message) + external + override + onlySelf + isValidSender(message.sourceChainSelector, message.sender) + { + // Meant to help simulate a failed-message + if (s_simRevert) revert ErrorCase(); + } + + // An example function to demonstrate recovery + function setSimRevert(bool simRevert) external { + s_simRevert = simRevert; + } +} From 6c868844ffaa43ff0f1840f6ee110d741455461f Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 21:22:55 +0000 Subject: [PATCH 24/31] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 214 ++++++++++++++---- .../generated/ccipReceiver/ccipReceiver.go | 214 ++++++++++++++---- .../ccip/generated/ccipSender/ccipSender.go | 32 +-- .../ping_pong_demo/ping_pong_demo.go | 214 ++++++++++++++---- .../self_funded_ping_pong.go | 214 ++++++++++++++---- ...rapper-dependency-versions-do-not-edit.txt | 13 +- 6 files changed, 696 insertions(+), 205 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 9f3508f4b9..dc5e458126 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -30,7 +30,7 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseapprovedSenderUpdate struct { +type CCIPClientBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"forwardingAddress\",\"type\":\"address\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200457238038062004572833981016040819052620000349162000564565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000140565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013657620001366001600160a01b03821683600019620001eb565b5050505062000689565b336001600160a01b038216036200019a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002639190620005a3565b6200026f9190620005bd565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002cb91869190620002d116565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000320906001600160a01b038516908490620003a7565b805190915015620003a25780806020019051810190620003419190620005e5565b620003a25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b88484600085620003c0565b949350505050565b606082471015620004235760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b0316858760405162000441919062000636565b60006040518083038185875af1925050503d806000811462000480576040519150601f19603f3d011682016040523d82523d6000602084013e62000485565b606091505b5090925090506200049987838387620004a4565b979650505050505050565b606083156200051857825160000362000510576001600160a01b0385163b620005105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b8565b620003b883838151156200052f5781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000654565b6001600160a01b03811681146200056157600080fd5b50565b600080604083850312156200057857600080fd5b825162000585816200054b565b602084015190925062000598816200054b565b809150509250929050565b600060208284031215620005b657600080fd5b5051919050565b80820180821115620005df57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f857600080fd5b815180151581146200060957600080fd5b9392505050565b60005b838110156200062d57818101518382015260200162000613565b50506000910152565b600082516200064a81846020870162000610565b9190910192915050565b60208152600082518060208401526200067581604085016020870162000610565b601f01601f19169190910160400192915050565b608051613e95620006dd600039600081816104a1015281816105e501528181610683015281816111130152818161198f01528181611a5801528181611b3a0152818161246a01526125360152613e956000f3fe6080604052600436106101845760003560e01c80636939cd97116100d6578063b0f479a11161007f578063e89b448511610059578063e89b448514610505578063f2fde38b14610518578063ff2deec3146105385761018b565b8063b0f479a114610492578063cf6730f8146104c5578063d8469e40146104e55761018b565b80638462a2b9116100b05780638462a2b91461040657806385572ffb146104265780638da5cb5b146104465761018b565b80636939cd971461037b5780636fef519e146103a857806379ba5097146103f15761018b565b8063369f7f661161013857806352f813c31161011257806352f813c31461031b578063536c6bfa1461033b5780635e35359e1461035b5761018b565b8063369f7f66146102ad57806341eade46146102cd5780635075a9d4146102ed5761018b565b806311e85dff1161016957806311e85dff1461020f578063181f5a771461022f57806335f170ef1461027e5761018b565b806305bfe982146101995780630e958d6b146101df5761018b565b3661018b57005b34801561019757600080fd5b005b3480156101a557600080fd5b506101c96101b4366004612cc4565b60086020526000908152604090205460ff1681565b6040516101d69190612d0c565b60405180910390f35b3480156101eb57600080fd5b506101ff6101fa366004612dac565b61056a565b60405190151581526020016101d6565b34801561021b57600080fd5b5061019761022a366004612e23565b6105b5565b34801561023b57600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101d69190612eae565b34801561028a57600080fd5b5061029e610299366004612ec1565b610745565b6040516101d693929190612ede565b3480156102b957600080fd5b506101976102c8366004612f15565b61087c565b3480156102d957600080fd5b506101976102e8366004612ec1565b610b37565b3480156102f957600080fd5b5061030d610308366004612cc4565b610b82565b6040519081526020016101d6565b34801561032757600080fd5b50610197610336366004612f53565b610b95565b34801561034757600080fd5b50610197610356366004612f70565b610bce565b34801561036757600080fd5b50610197610376366004612f9c565b610be4565b34801561038757600080fd5b5061039b610396366004612cc4565b610c12565b6040516101d6919061303a565b3480156103b457600080fd5b506102716040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103fd57600080fd5b50610197610e1d565b34801561041257600080fd5b5061019761042136600461311c565b610f1a565b34801561043257600080fd5b50610197610441366004613188565b6110fb565b34801561045257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d6565b34801561049e57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061046d565b3480156104d157600080fd5b506101976104e0366004613188565b6113f6565b3480156104f157600080fd5b506101976105003660046131c3565b611613565b61030d6105133660046133ac565b611694565b34801561052457600080fd5b50610197610533366004612e23565b611c48565b34801561054457600080fd5b5060075461046d90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061059990859085906134b9565b9081526040519081900360200190205460ff1690509392505050565b6105bd611c5c565b600754610100900473ffffffffffffffffffffffffffffffffffffffff161561062a5761062a7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000611cdf565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff851617909455929091041690156106e7576106e77f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611edf565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff909216929161076b906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610797906134c9565b80156107e45780601f106107b9576101008083540402835291602001916107e4565b820191906000526020600020905b8154815290600101906020018083116107c757829003601f168201915b5050505050908060020180546107f9906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610825906134c9565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b5050505050905083565b610884611c5c565b6001610891600484611fe3565b146108d0576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108e08260005b60049190611ff6565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610928906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610954906134c9565b80156109a15780601f10610976576101008083540402835291602001916109a1565b820191906000526020600020905b81548152906001019060200180831161098457829003601f168201915b505050505081526020016003820180546109ba906134c9565b80601f01602080910402602001604051908101604052809291908181526020018280546109e6906134c9565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610ab65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a61565b505050915250506040805173ffffffffffffffffffffffffffffffffffffffff85166020820152919250610afb9183910160405160208183030381529060405261200b565b610b066004846120aa565b5060405183907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a2505050565b610b3f611c5c565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610b8f600483611fe3565b92915050565b610b9d611c5c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610bd6611c5c565b610be082826120b6565b5050565b610bec611c5c565b610c0d73ffffffffffffffffffffffffffffffffffffffff84168383612210565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c81906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad906134c9565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b50505050508152602001600382018054610d13906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3f906134c9565b8015610d8c5780601f10610d6157610100808354040283529160200191610d8c565b820191906000526020600020905b815481529060010190602001808311610d6f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e0f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dba565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108c7565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f22611c5c565b60005b818110156110055760026000848484818110610f4357610f4361351c565b9050602002810190610f55919061354b565b610f63906020810190612ec1565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9a57610f9a61351c565b9050602002810190610fac919061354b565b610fba906020810190613589565b604051610fc89291906134b9565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f25565b5060005b838110156110f4576001600260008787858181106110295761102961351c565b905060200281019061103b919061354b565b611049906020810190612ec1565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106110805761108061351c565b9050602002810190611092919061354b565b6110a0906020810190613589565b6040516110ae9291906134b9565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611009565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116c576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108c7565b61117c6040820160208301612ec1565b6111896040830183613589565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e792508491506135ee565b9081526040519081900360200190205460ff1661123257806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108c79190612eae565b6112426040840160208501612ec1565b67ffffffffffffffff8116600090815260026020526040902060018101805461126a906134c9565b159050806112795750805460ff165b156112bc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108c7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112f8908890600401613702565b600060405180830381600087803b15801561131257600080fd5b505af1925050508015611323575060015b6113c3573d808015611351576040519150601f19603f3d011682016040523d82523d6000602084013e611356565b606091505b50611363863560016108d7565b508535600090815260036020526040902086906113808282613ad4565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b5908490612eae565b60405180910390a2506110f4565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b33301461142f576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061143e6060830183613589565b81019061144b9190613bce565b905060008160400151600181111561146557611465612cdd565b0361147357610be082612266565b60018160400151600181111561148b5761148b612cdd565b03610be05760008082602001518060200190518101906114ab9190613c7a565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611543576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156857611568612cdd565b146115a2576040517f3ec87700000000000000000000000000000000000000000000000000000000008152600481018290526024016108c7565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161b611c5c565b67ffffffffffffffff8516600090815260026020526040902060018101611643858783613858565b50811561165b5760028101611659838583613858565b505b805460ff161561168c5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b67ffffffffffffffff83166000908152600260205260408120600181018054869291906116c0906134c9565b159050806116cf5750805460ff165b15611712576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108c7565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611745906134c9565b80601f0160208091040260200160405190810160405280929190818152602001828054611771906134c9565b80156117be5780601f10611793576101008083540402835291602001916117be565b820191906000526020600020905b8154815290600101906020018083116117a157829003601f168201915b5050509183525050602080820188905260408083018a9052600754610100900473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611822906134c9565b80601f016020809104026020016040519081016040528092919081815260200182805461184e906134c9565b801561189b5780601f106118705761010080835404028352916020019161189b565b820191906000526020600020905b81548152906001019060200180831161187e57829003601f168201915b5050505050815250905060005b8651811015611a175761191833308984815181106118c8576118c861351c565b6020026020010151602001518a85815181106118e6576118e661351c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661261c909392919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168782815181106119635761196361351c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611a0f57611a0f7f00000000000000000000000000000000000000000000000000000000000000008883815181106119c0576119c061351c565b6020026020010151602001518984815181106119de576119de61351c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611edf9092919063ffffffff16565b6001016118a8565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611a8f908b908690600401613cfb565b602060405180830381865afa158015611aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad09190613dbe565b600754909150610100900473ffffffffffffffffffffffffffffffffffffffff1615611b2057600754611b2090610100900473ffffffffffffffffffffffffffffffffffffffff1633308461261c565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615611b75576000611b77565b825b8a856040518463ffffffff1660e01b8152600401611b96929190613cfb565b60206040518083038185885af1158015611bb4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bd99190613dbe565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611c50611c5c565b611c598161267a565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108c7565b565b801580611d7f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7d9190613dbe565b155b611e0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108c7565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c0d9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261276f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015611f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7a9190613dbe565b611f849190613dd7565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611fdd9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611e5d565b50505050565b6000611fef838361287b565b9392505050565b6000612003848484612905565b949350505050565b6000818060200190518101906120219190613dea565b905060005b836080015151811015611fdd5760008460800151828151811061204b5761204b61351c565b60200260200101516020015190506000856080015183815181106120715761207161351c565b60209081029190910101515190506120a073ffffffffffffffffffffffffffffffffffffffff82168584612210565b5050600101612026565b6000611fef8383612922565b80471015612120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108c7565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461217a576040519150601f19603f3d011682016040523d82523d6000602084013e61217f565b606091505b5050905080610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108c7565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c0d9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611e5d565b60408051600080825260208201909252816122a3565b604080518082019091526000808252602082015281526020019060019003908161227c5790505b50905060006040518060a001604052808480604001906122c39190613589565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926123449288359101613e07565b6040516020818303038152906040528152602001838152602001600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600260008660200160208101906123b39190612ec1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020180546123e3906134c9565b80601f016020809104026020016040519081016040528092919081815260200182805461240f906134c9565b801561245c5780601f106124315761010080835404028352916020019161245c565b820191906000526020600020905b81548152906001019060200180831161243f57829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906124b79190612ec1565b846040518363ffffffff1660e01b81526004016124d5929190613cfb565b602060405180830381865afa1580156124f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125169190613dbe565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615612571576000612573565b835b6125836040890160208a01612ec1565b866040518463ffffffff1660e01b81526004016125a1929190613cfb565b60206040518083038185885af11580156125bf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125e49190613dbe565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611fdd9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611e5d565b3373ffffffffffffffffffffffffffffffffffffffff8216036126f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108c7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006127d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661293f9092919063ffffffff16565b805190915015610c0d57808060200190518101906127ef9190613e29565b610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108c7565b60008181526002830160205260408120548015158061289f575061289f848461294e565b611fef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016108c7565b60008281526002840160205260408120829055612003848461295a565b60008181526002830160205260408120819055611fef8383612966565b60606120038484600085612972565b6000611fef8383612a8b565b6000611fef8383612aa3565b6000611fef8383612af2565b606082471015612a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108c7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612a2d91906135ee565b60006040518083038185875af1925050503d8060008114612a6a576040519150601f19603f3d011682016040523d82523d6000602084013e612a6f565b606091505b5091509150612a8087838387612be5565b979650505050505050565b60008181526001830160205260408120541515611fef565b6000818152600183016020526040812054612aea57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b8f565b506000610b8f565b60008181526001830160205260408120548015612bdb576000612b16600183613e46565b8554909150600090612b2a90600190613e46565b9050818114612b8f576000866000018281548110612b4a57612b4a61351c565b9060005260206000200154905080876000018481548110612b6d57612b6d61351c565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ba057612ba0613e59565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b8f565b6000915050610b8f565b60608315612c7b578251600003612c745773ffffffffffffffffffffffffffffffffffffffff85163b612c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108c7565b5081612003565b6120038383815115612c905781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c79190612eae565b600060208284031215612cd657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612d47577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611c5957600080fd5b60008083601f840112612d7557600080fd5b50813567ffffffffffffffff811115612d8d57600080fd5b602083019150836020828501011115612da557600080fd5b9250929050565b600080600060408486031215612dc157600080fd5b8335612dcc81612d4d565b9250602084013567ffffffffffffffff811115612de857600080fd5b612df486828701612d63565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611c5957600080fd5b600060208284031215612e3557600080fd5b8135611fef81612e01565b60005b83811015612e5b578181015183820152602001612e43565b50506000910152565b60008151808452612e7c816020860160208601612e40565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fef6020830184612e64565b600060208284031215612ed357600080fd5b8135611fef81612d4d565b8315158152606060208201526000612ef96060830185612e64565b8281036040840152612f0b8185612e64565b9695505050505050565b60008060408385031215612f2857600080fd5b823591506020830135612f3a81612e01565b809150509250929050565b8015158114611c5957600080fd5b600060208284031215612f6557600080fd5b8135611fef81612f45565b60008060408385031215612f8357600080fd5b8235612f8e81612e01565b946020939093013593505050565b600080600060608486031215612fb157600080fd5b8335612fbc81612e01565b92506020840135612fcc81612e01565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561302f578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612ff2565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261307460c0840182612e64565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130b08383612e64565b925060808601519150808584030160a0860152506130ce8282612fdd565b95945050505050565b60008083601f8401126130e957600080fd5b50813567ffffffffffffffff81111561310157600080fd5b6020830191508360208260051b8501011115612da557600080fd5b6000806000806040858703121561313257600080fd5b843567ffffffffffffffff8082111561314a57600080fd5b613156888389016130d7565b9096509450602087013591508082111561316f57600080fd5b5061317c878288016130d7565b95989497509550505050565b60006020828403121561319a57600080fd5b813567ffffffffffffffff8111156131b157600080fd5b820160a08185031215611fef57600080fd5b6000806000806000606086880312156131db57600080fd5b85356131e681612d4d565b9450602086013567ffffffffffffffff8082111561320357600080fd5b61320f89838a01612d63565b9096509450604088013591508082111561322857600080fd5b5061323588828901612d63565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561329857613298613246565b60405290565b6040516060810167ffffffffffffffff8111828210171561329857613298613246565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561330857613308613246565b604052919050565b600067ffffffffffffffff82111561332a5761332a613246565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261336757600080fd5b813561337a61337582613310565b6132c1565b81815284602083860101111561338f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156133c157600080fd5b83356133cc81612d4d565b925060208481013567ffffffffffffffff808211156133ea57600080fd5b818701915087601f8301126133fe57600080fd5b81358181111561341057613410613246565b61341e848260051b016132c1565b81815260069190911b8301840190848101908a83111561343d57600080fd5b938501935b82851015613489576040858c03121561345b5760008081fd5b613463613275565b853561346e81612e01565b81528587013587820152825260409094019390850190613442565b9650505060408701359250808311156134a157600080fd5b50506134af86828701613356565b9150509250925092565b8183823760009101908152919050565b600181811c908216806134dd57607f821691505b602082108103613516577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261357f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135be57600080fd5b83018035915067ffffffffffffffff8211156135d957600080fd5b602001915036819003821315612da557600080fd5b6000825161357f818460208701612e40565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261363557600080fd5b830160208101925035905067ffffffffffffffff81111561365557600080fd5b803603821315612da557600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561302f5781356136d081612e01565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016136bd565b60208152813560208201526000602083013561371d81612d4d565b67ffffffffffffffff808216604085015261373b6040860186613600565b925060a0606086015261375260c086018483613664565b9250506137626060860186613600565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613798858385613664565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126137d157600080fd5b602092880192830192359150838211156137ea57600080fd5b8160061b36038313156137fc57600080fd5b8685030160a0870152612a808482846136ad565b601f821115610c0d576000816000526020600020601f850160051c810160208610156138395750805b601f850160051c820191505b8181101561168c57828155600101613845565b67ffffffffffffffff83111561387057613870613246565b6138848361387e83546134c9565b83613810565b6000601f8411600181146138d657600085156138a05750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f4565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139255786850135825560209485019460019092019101613905565b5086821015613960577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139ac81612e01565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a1257613a12613246565b805483825580841015613a9f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a5357613a53613972565b8086168614613a6457613a64613972565b5060008360005260206000208360011b81018760011b820191505b80821015613a9a578282558284830155600282019150613a7f565b505050505b5060008181526020812083915b8581101561168c57613abe83836139a1565b6040929092019160029190910190600101613aac565b81358155600181016020830135613aea81612d4d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b2a6040860186613589565b93509150613b3c838360028701613858565b613b496060860186613589565b93509150613b5b838360038701613858565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613b9257600080fd5b918401918235915080821115613ba757600080fd5b506020820191508060061b3603821315613bc057600080fd5b611fdd8183600486016139f9565b600060208284031215613be057600080fd5b813567ffffffffffffffff80821115613bf857600080fd5b9083019060608286031215613c0c57600080fd5b613c1461329e565b823582811115613c2357600080fd5b613c2f87828601613356565b825250602083013582811115613c4457600080fd5b613c5087828601613356565b6020830152506040830135925060028310613c6a57600080fd5b6040810192909252509392505050565b60008060408385031215613c8d57600080fd5b825167ffffffffffffffff811115613ca457600080fd5b8301601f81018513613cb557600080fd5b8051613cc361337582613310565b818152866020838501011115613cd857600080fd5b613ce9826020830160208601612e40565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d2760e0840182612e64565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613d638383612e64565b92506040860151915080858403016080860152613d808383612fdd565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f0b8282612e64565b600060208284031215613dd057600080fd5b5051919050565b80820180821115610b8f57610b8f613972565b600060208284031215613dfc57600080fd5b8151611fef81612e01565b604081526000613e1a6040830185612e64565b90508260208301529392505050565b600060208284031215613e3b57600080fd5b8151611fef81612f45565b81810381811115610b8f57610b8f613972565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b506040516200454f3803806200454f83398101604081905262000034916200055f565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200013b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013157620001316001600160a01b03821683600019620001e6565b5050505062000684565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e91906200059e565b6200026a9190620005b8565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002c691869190620002cc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031b906001600160a01b038516908490620003a2565b8051909150156200039d57808060200190518101906200033c9190620005e0565b6200039d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b38484600085620003bb565b949350505050565b6060824710156200041e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200043c919062000631565b60006040518083038185875af1925050503d80600081146200047b576040519150601f19603f3d011682016040523d82523d6000602084013e62000480565b606091505b50909250905062000494878383876200049f565b979650505050505050565b60608315620005135782516000036200050b576001600160a01b0385163b6200050b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b3565b620003b383838151156200052a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200064f565b6001600160a01b03811681146200055c57600080fd5b50565b600080604083850312156200057357600080fd5b8251620005808162000546565b6020840151909250620005938162000546565b809150509250929050565b600060208284031215620005b157600080fd5b5051919050565b80820180821115620005da57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f357600080fd5b815180151581146200060457600080fd5b9392505050565b60005b83811015620006285781810151838201526020016200060e565b50506000910152565b60008251620006458184602087016200060b565b9190910192915050565b6020815260008251806020840152620006708160408501602087016200060b565b601f01601f19169190910160400192915050565b608051613e77620006d86000396000818161047a015281816105d4015281816106640152818161111501528181611bd201528181611c9b01528181611d73015281816125f301526126bf0152613e776000f3fe6080604052600436106101845760003560e01c80636fef519e116100d6578063cf6730f81161007f578063e89b448511610059578063e89b4485146104fe578063f2fde38b14610511578063ff2deec31461053157600080fd5b8063cf6730f81461049e578063d8469e40146104be578063e4ca8754146104de57600080fd5b806385572ffb116100b057806385572ffb146103ff5780638da5cb5b1461041f578063b0f479a11461046b57600080fd5b80636fef519e1461038157806379ba5097146103ca5780638462a2b9146103df57600080fd5b80633a998eaf11610138578063536c6bfa11610112578063536c6bfa146103145780635e35359e146103345780636939cd971461035457600080fd5b80633a998eaf146102a657806341eade46146102c65780635075a9d4146102e657600080fd5b806311e85dff1161016957806311e85dff14610206578063181f5a771461022857806335f170ef1461027757600080fd5b806305bfe982146101905780630e958d6b146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab366004612d2b565b60086020526000908152604090205460ff1681565b6040516101cd9190612d73565b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612e13565b61055e565b60405190151581526020016101cd565b34801561021257600080fd5b50610226610221366004612e8a565b6105a9565b005b34801561023457600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101cd9190612f15565b34801561028357600080fd5b50610297610292366004612f28565b610721565b6040516101cd93929190612f45565b3480156102b257600080fd5b506102266102c1366004612f7c565b610858565b3480156102d257600080fd5b506102266102e1366004612f28565b610b72565b3480156102f257600080fd5b50610306610301366004612d2b565b610bbd565b6040519081526020016101cd565b34801561032057600080fd5b5061022661032f366004612fac565b610bd0565b34801561034057600080fd5b5061022661034f366004612fd8565b610be6565b34801561036057600080fd5b5061037461036f366004612d2b565b610c14565b6040516101cd9190613076565b34801561038d57600080fd5b5061026a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103d657600080fd5b50610226610e1f565b3480156103eb57600080fd5b506102266103fa366004613158565b610f1c565b34801561040b57600080fd5b5061022661041a3660046131c4565b6110fd565b34801561042b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561047757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610446565b3480156104aa57600080fd5b506102266104b93660046131c4565b6113f8565b3480156104ca57600080fd5b506102266104d93660046131ff565b611615565b3480156104ea57600080fd5b506102266104f9366004612d2b565b611696565b61030661050c3660046133e8565b6118f7565b34801561051d57600080fd5b5061022661052c366004612e8a565b611e7b565b34801561053d57600080fd5b506007546104469073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061058d90859085906134f5565b9081526040519081900360200190205460ff1690509392505050565b6105b1611e8f565b60075473ffffffffffffffffffffffffffffffffffffffff1615610614576106147f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000611f12565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106c3576106c37f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612112565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff909216929161074790613505565b80601f016020809104026020016040519081016040528092919081815260200182805461077390613505565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050908060020180546107d590613505565b80601f016020809104026020016040519081016040528092919081815260200182805461080190613505565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905083565b610860611e8f565b600161086d600484612216565b146108ac576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108bc8260025b60049190612229565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161090490613505565b80601f016020809104026020016040519081016040528092919081815260200182805461093090613505565b801561097d5780601f106109525761010080835404028352916020019161097d565b820191906000526020600020905b81548152906001019060200180831161096057829003601f168201915b5050505050815260200160038201805461099690613505565b80601f01602080910402602001604051908101604052809291908181526020018280546109c290613505565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a925760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a3d565b5050505081525050905060005b816080015151811015610b2157610b198383608001518381518110610ac657610ac6613558565b60200260200101516020015184608001518481518110610ae857610ae8613558565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661223e9092919063ffffffff16565b600101610a9f565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b610b7a611e8f565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610bca600483612216565b92915050565b610bd8611e8f565b610be28282612294565b5050565b610bee611e8f565b610c0f73ffffffffffffffffffffffffffffffffffffffff8416838361223e565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c8390613505565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf90613505565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b50505050508152602001600382018054610d1590613505565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4190613505565b8015610d8e5780601f10610d6357610100808354040283529160200191610d8e565b820191906000526020600020905b815481529060010190602001808311610d7157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e115760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dbc565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108a3565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f24611e8f565b60005b818110156110075760026000848484818110610f4557610f45613558565b9050602002810190610f579190613587565b610f65906020810190612f28565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9c57610f9c613558565b9050602002810190610fae9190613587565b610fbc9060208101906135c5565b604051610fca9291906134f5565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f27565b5060005b838110156110f65760016002600087878581811061102b5761102b613558565b905060200281019061103d9190613587565b61104b906020810190612f28565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061108257611082613558565b90506020028101906110949190613587565b6110a29060208101906135c5565b6040516110b09291906134f5565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161100b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116e576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108a3565b61117e6040820160208301612f28565b61118b60408301836135c5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e9925084915061362a565b9081526040519081900360200190205460ff1661123457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108a39190612f15565b6112446040840160208501612f28565b67ffffffffffffffff8116600090815260026020526040902060018101805461126c90613505565b1590508061127b5750805460ff165b156112be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108a3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112fa90889060040161373e565b600060405180830381600087803b15801561131457600080fd5b505af1925050508015611325575060015b6113c5573d808015611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b50611365863560016108b3565b508535600090815260036020526040902086906113828282613b10565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b7908490612f15565b60405180910390a2506110f6565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b333014611431576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061144060608301836135c5565b81019061144d9190613c0a565b905060008160400151600181111561146757611467612d44565b0361147557610be2826123ee565b60018160400151600181111561148d5761148d612d44565b03610be25760008082602001518060200190518101906114ad9190613cb6565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611545576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156a5761156a612d44565b146115a4576040517f3ec87700000000000000000000000000000000000000000000000000000000008152600481018290526024016108a3565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161d611e8f565b67ffffffffffffffff8516600090815260026020526040902060018101611645858783613894565b50811561165d576002810161165b838583613894565b505b805460ff161561168e5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016116a3600483612216565b146116dd576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016108a3565b6116e88160006108b3565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161173090613505565b80601f016020809104026020016040519081016040528092919081815260200182805461175c90613505565b80156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b505050505081526020016003820180546117c290613505565b80601f01602080910402602001604051908101604052809291908181526020018280546117ee90613505565b801561183b5780601f106118105761010080835404028352916020019161183b565b820191906000526020600020905b81548152906001019060200180831161181e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118be5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611869565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061192390613505565b159050806119325750805460ff165b15611975576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108a3565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906119a890613505565b80601f01602080910402602001604051908101604052809291908181526020018280546119d490613505565b8015611a215780601f106119f657610100808354040283529160200191611a21565b820191906000526020600020905b815481529060010190602001808311611a0457829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611a8090613505565b80601f0160208091040260200160405190810160405280929190818152602001828054611aac90613505565b8015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b5050505050815250905060005b8651811015611c5a57611b763330898481518110611b2657611b26613558565b6020026020010151602001518a8581518110611b4457611b44613558565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661279f909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611ba657611ba6613558565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611c5257611c527f0000000000000000000000000000000000000000000000000000000000000000888381518110611c0357611c03613558565b602002602001015160200151898481518110611c2157611c21613558565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166121129092919063ffffffff16565b600101611b06565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611cd2908b908690600401613d37565b602060405180830381865afa158015611cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d139190613dfa565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615611d5957600754611d599073ffffffffffffffffffffffffffffffffffffffff1633308461279f565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615611da8576000611daa565b825b8a856040518463ffffffff1660e01b8152600401611dc9929190613d37565b60206040518083038185885af1158015611de7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e0c9190613dfa565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611e83611e8f565b611e8c816127fd565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108a3565b565b801580611fb257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb09190613dfa565b155b61203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108a3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c0f9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526128f2565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad9190613dfa565b6121b79190613e13565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506122109085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612090565b50505050565b600061222283836129fe565b9392505050565b6000612236848484612a88565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c0f9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612090565b804710156122fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108a3565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612358576040519150601f19603f3d011682016040523d82523d6000602084013e61235d565b606091505b5050905080610c0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108a3565b604080516000808252602082019092528161242b565b60408051808201909152600080825260208201528152602001906001900390816124045790505b50905060006040518060a0016040528084806040019061244b91906135c5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124cc9288359101613e26565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260075473ffffffffffffffffffffffffffffffffffffffff168383015260609092019160029160009161253c918901908901612f28565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201805461256c90613505565b80601f016020809104026020016040519081016040528092919081815260200182805461259890613505565b80156125e55780601f106125ba576101008083540402835291602001916125e5565b820191906000526020600020905b8154815290600101906020018083116125c857829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906126409190612f28565b846040518363ffffffff1660e01b815260040161265e929190613d37565b602060405180830381865afa15801561267b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269f9190613dfa565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156126f45760006126f6565b835b6127066040890160208a01612f28565b866040518463ffffffff1660e01b8152600401612724929190613d37565b60206040518083038185885af1158015612742573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127679190613dfa565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526122109085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612090565b3373ffffffffffffffffffffffffffffffffffffffff82160361287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108a3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612954826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aa59092919063ffffffff16565b805190915015610c0f57808060200190518101906129729190613e48565b610c0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108a3565b600081815260028301602052604081205480151580612a225750612a228484612ab4565b612222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016108a3565b600082815260028401602052604081208290556122368484612ac0565b60606122368484600085612acc565b60006122228383612be5565b60006122228383612bfd565b606082471015612b5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108a3565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b87919061362a565b60006040518083038185875af1925050503d8060008114612bc4576040519150601f19603f3d011682016040523d82523d6000602084013e612bc9565b606091505b5091509150612bda87838387612c4c565b979650505050505050565b60008181526001830160205260408120541515612222565b6000818152600183016020526040812054612c4457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bca565b506000610bca565b60608315612ce2578251600003612cdb5773ffffffffffffffffffffffffffffffffffffffff85163b612cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108a3565b5081612236565b6122368383815115612cf75781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a39190612f15565b600060208284031215612d3d57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612dae577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e8c57600080fd5b60008083601f840112612ddc57600080fd5b50813567ffffffffffffffff811115612df457600080fd5b602083019150836020828501011115612e0c57600080fd5b9250929050565b600080600060408486031215612e2857600080fd5b8335612e3381612db4565b9250602084013567ffffffffffffffff811115612e4f57600080fd5b612e5b86828701612dca565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e8c57600080fd5b600060208284031215612e9c57600080fd5b813561222281612e68565b60005b83811015612ec2578181015183820152602001612eaa565b50506000910152565b60008151808452612ee3816020860160208601612ea7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006122226020830184612ecb565b600060208284031215612f3a57600080fd5b813561222281612db4565b8315158152606060208201526000612f606060830185612ecb565b8281036040840152612f728185612ecb565b9695505050505050565b60008060408385031215612f8f57600080fd5b823591506020830135612fa181612e68565b809150509250929050565b60008060408385031215612fbf57600080fd5b8235612fca81612e68565b946020939093013593505050565b600080600060608486031215612fed57600080fd5b8335612ff881612e68565b9250602084013561300881612e68565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561306b578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161302e565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526130b060c0840182612ecb565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130ec8383612ecb565b925060808601519150808584030160a08601525061310a8282613019565b95945050505050565b60008083601f84011261312557600080fd5b50813567ffffffffffffffff81111561313d57600080fd5b6020830191508360208260051b8501011115612e0c57600080fd5b6000806000806040858703121561316e57600080fd5b843567ffffffffffffffff8082111561318657600080fd5b61319288838901613113565b909650945060208701359150808211156131ab57600080fd5b506131b887828801613113565b95989497509550505050565b6000602082840312156131d657600080fd5b813567ffffffffffffffff8111156131ed57600080fd5b820160a0818503121561222257600080fd5b60008060008060006060868803121561321757600080fd5b853561322281612db4565b9450602086013567ffffffffffffffff8082111561323f57600080fd5b61324b89838a01612dca565b9096509450604088013591508082111561326457600080fd5b5061327188828901612dca565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156132d4576132d4613282565b60405290565b6040516060810167ffffffffffffffff811182821017156132d4576132d4613282565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561334457613344613282565b604052919050565b600067ffffffffffffffff82111561336657613366613282565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126133a357600080fd5b81356133b66133b18261334c565b6132fd565b8181528460208386010111156133cb57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156133fd57600080fd5b833561340881612db4565b925060208481013567ffffffffffffffff8082111561342657600080fd5b818701915087601f83011261343a57600080fd5b81358181111561344c5761344c613282565b61345a848260051b016132fd565b81815260069190911b8301840190848101908a83111561347957600080fd5b938501935b828510156134c5576040858c0312156134975760008081fd5b61349f6132b1565b85356134aa81612e68565b8152858701358782015282526040909401939085019061347e565b9650505060408701359250808311156134dd57600080fd5b50506134eb86828701613392565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061351957607f821691505b602082108103613552577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126135bb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135fa57600080fd5b83018035915067ffffffffffffffff82111561361557600080fd5b602001915036819003821315612e0c57600080fd5b600082516135bb818460208701612ea7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261367157600080fd5b830160208101925035905067ffffffffffffffff81111561369157600080fd5b803603821315612e0c57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561306b57813561370c81612e68565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016136f9565b60208152813560208201526000602083013561375981612db4565b67ffffffffffffffff8082166040850152613777604086018661363c565b925060a0606086015261378e60c0860184836136a0565b92505061379e606086018661363c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526137d48583856136a0565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261380d57600080fd5b6020928801928301923591508382111561382657600080fd5b8160061b360383131561383857600080fd5b8685030160a0870152612bda8482846136e9565b601f821115610c0f576000816000526020600020601f850160051c810160208610156138755750805b601f850160051c820191505b8181101561168e57828155600101613881565b67ffffffffffffffff8311156138ac576138ac613282565b6138c0836138ba8354613505565b8361384c565b6000601f84116001811461391257600085156138dc5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139615786850135825560209485019460019092019101613941565b508682101561399c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139e881612e68565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a4e57613a4e613282565b805483825580841015613adb5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a8f57613a8f6139ae565b8086168614613aa057613aa06139ae565b5060008360005260206000208360011b81018760011b820191505b80821015613ad6578282558284830155600282019150613abb565b505050505b5060008181526020812083915b8581101561168e57613afa83836139dd565b6040929092019160029190910190600101613ae8565b81358155600181016020830135613b2681612db4565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b6660408601866135c5565b93509150613b78838360028701613894565b613b8560608601866135c5565b93509150613b97838360038701613894565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613bce57600080fd5b918401918235915080821115613be357600080fd5b506020820191508060061b3603821315613bfc57600080fd5b612210818360048601613a35565b600060208284031215613c1c57600080fd5b813567ffffffffffffffff80821115613c3457600080fd5b9083019060608286031215613c4857600080fd5b613c506132da565b823582811115613c5f57600080fd5b613c6b87828601613392565b825250602083013582811115613c8057600080fd5b613c8c87828601613392565b6020830152506040830135925060028310613ca657600080fd5b6040810192909252509392505050565b60008060408385031215613cc957600080fd5b825167ffffffffffffffff811115613ce057600080fd5b8301601f81018513613cf157600080fd5b8051613cff6133b18261334c565b818152866020838501011115613d1457600080fd5b613d25826020830160208601612ea7565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d6360e0840182612ecb565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613d9f8383612ecb565b92506040860151915080858403016080860152613dbc8383613019565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f728282612ecb565b600060208284031215613e0c57600080fd5b5051919050565b80820180821115610bca57610bca6139ae565b604081526000613e396040830185612ecb565b90508260208301529392505050565b600060208284031215613e5a57600080fd5b8151801515811461222257600080fdfea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -332,7 +332,7 @@ func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, arg0 uin return *outstruct, err } - outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Disabled = *abi.ConvertType(out[0], new(bool)).(*bool) outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) @@ -418,6 +418,18 @@ func (_CCIPClient *CCIPClientCallerSession) TypeAndVersion() (string, error) { return _CCIPClient.Contract.TypeAndVersion(&_CCIPClient.CallOpts) } +func (_CCIPClient *CCIPClientTransactor) AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "abandonMessage", messageId, receiver) +} + +func (_CCIPClient *CCIPClientSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.AbandonMessage(&_CCIPClient.TransactOpts, messageId, receiver) +} + +func (_CCIPClient *CCIPClientTransactorSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.AbandonMessage(&_CCIPClient.TransactOpts, messageId, receiver) +} + func (_CCIPClient *CCIPClientTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "acceptOwnership") } @@ -502,28 +514,16 @@ func (_CCIPClient *CCIPClientTransactorSession) ProcessMessage(message ClientAny return _CCIPClient.Contract.ProcessMessage(&_CCIPClient.TransactOpts, message) } -func (_CCIPClient *CCIPClientTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "retryFailedMessage", messageId, forwardingAddress) -} - -func (_CCIPClient *CCIPClientSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId, forwardingAddress) +func (_CCIPClient *CCIPClientTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "retryFailedMessage", messageId) } -func (_CCIPClient *CCIPClientTransactorSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId, forwardingAddress) +func (_CCIPClient *CCIPClientSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId) } -func (_CCIPClient *CCIPClientTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "setSimRevert", simRevert) -} - -func (_CCIPClient *CCIPClientSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _CCIPClient.Contract.SetSimRevert(&_CCIPClient.TransactOpts, simRevert) -} - -func (_CCIPClient *CCIPClientTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _CCIPClient.Contract.SetSimRevert(&_CCIPClient.TransactOpts, simRevert) +func (_CCIPClient *CCIPClientTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId) } func (_CCIPClient *CCIPClientTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -538,15 +538,15 @@ func (_CCIPClient *CCIPClientTransactorSession) TransferOwnership(to common.Addr return _CCIPClient.Contract.TransferOwnership(&_CCIPClient.TransactOpts, to) } -func (_CCIPClient *CCIPClientTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPClient *CCIPClientTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_CCIPClient *CCIPClientSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPClient *CCIPClientSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) } -func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) } @@ -574,18 +574,6 @@ func (_CCIPClient *CCIPClientTransactorSession) WithdrawTokens(token common.Addr return _CCIPClient.Contract.WithdrawTokens(&_CCIPClient.TransactOpts, token, to, amount) } -func (_CCIPClient *CCIPClientTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { - return _CCIPClient.contract.RawTransact(opts, calldata) -} - -func (_CCIPClient *CCIPClientSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _CCIPClient.Contract.Fallback(&_CCIPClient.TransactOpts, calldata) -} - -func (_CCIPClient *CCIPClientTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _CCIPClient.Contract.Fallback(&_CCIPClient.TransactOpts, calldata) -} - func (_CCIPClient *CCIPClientTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { return _CCIPClient.contract.RawTransact(opts, nil) } @@ -734,6 +722,134 @@ func (_CCIPClient *CCIPClientFilterer) ParseFeeTokenModified(log types.Log) (*CC return event, nil } +type CCIPClientMessageAbandonedIterator struct { + Event *CCIPClientMessageAbandoned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientMessageAbandonedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientMessageAbandoned) + 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(CCIPClientMessageAbandoned) + 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 *CCIPClientMessageAbandonedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientMessageAbandonedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientMessageAbandoned struct { + MessageId [32]byte + TokenReceiver common.Address + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageAbandonedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientMessageAbandonedIterator{contract: _CCIPClient.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageAbandoned, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientMessageAbandoned) + if err := _CCIPClient.contract.UnpackLog(event, "MessageAbandoned", 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 (_CCIPClient *CCIPClientFilterer) ParseMessageAbandoned(log types.Log) (*CCIPClientMessageAbandoned, error) { + event := new(CCIPClientMessageAbandoned) + if err := _CCIPClient.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type CCIPClientMessageAckReceivedIterator struct { Event *CCIPClientMessageAckReceived @@ -1759,7 +1875,7 @@ func (_CCIPClient *CCIPClientFilterer) ParseOwnershipTransferred(log types.Log) } type SChainConfigs struct { - IsDisabled bool + Disabled bool Recipient []byte ExtraArgsBytes []byte } @@ -1768,6 +1884,8 @@ func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, err switch log.Topics[0] { case _CCIPClient.abi.Events["FeeTokenModified"].ID: return _CCIPClient.ParseFeeTokenModified(log) + case _CCIPClient.abi.Events["MessageAbandoned"].ID: + return _CCIPClient.ParseMessageAbandoned(log) case _CCIPClient.abi.Events["MessageAckReceived"].ID: return _CCIPClient.ParseMessageAckReceived(log) case _CCIPClient.abi.Events["MessageAckSent"].ID: @@ -1794,6 +1912,10 @@ func (CCIPClientFeeTokenModified) Topic() common.Hash { return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") } +func (CCIPClientMessageAbandoned) Topic() common.Hash { + return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") +} + func (CCIPClientMessageAckReceived) Topic() common.Hash { return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") } @@ -1853,6 +1975,8 @@ type CCIPClientInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) + AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) @@ -1867,20 +1991,16 @@ type CCIPClientInterface interface { ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) - - SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) - Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) - Receive(opts *bind.TransactOpts) (*types.Transaction, error) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPClientFeeTokenModifiedIterator, error) @@ -1889,6 +2009,12 @@ type CCIPClientInterface interface { ParseFeeTokenModified(log types.Log) (*CCIPClientFeeTokenModified, error) + FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageAbandonedIterator, error) + + WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageAbandoned, messageId [][32]byte) (event.Subscription, error) + + ParseMessageAbandoned(log types.Log) (*CCIPClientMessageAbandoned, error) + FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPClientMessageAckReceivedIterator, error) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageAckReceived) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go index b196d2ec3f..14fb609d47 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -30,7 +30,7 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseapprovedSenderUpdate struct { +type CCIPClientBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var CCIPReceiverMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"forwardingAddress\",\"type\":\"address\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002a8738038062002a878339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b60805161288a620001fd6000396000818161039d0152610e3a015261288a6000f3fe60806040526004361061012d5760003560e01c80636939cd97116100a55780638da5cb5b11610074578063cf6730f811610059578063cf6730f8146103c1578063d8469e40146103e1578063f2fde38b1461040157610134565b80638da5cb5b14610342578063b0f479a11461038e57610134565b80636939cd97146102c057806379ba5097146102ed5780638462a2b91461030257806385572ffb1461032257610134565b806341eade46116100fc57806352f813c3116100e157806352f813c314610260578063536c6bfa146102805780635e35359e146102a057610134565b806341eade46146102125780635075a9d41461023257610134565b80630e958d6b14610142578063181f5a771461017757806335f170ef146101c3578063369f7f66146101f257610134565b3661013457005b34801561014057600080fd5b005b34801561014e57600080fd5b5061016261015d366004611c12565b610421565b60405190151581526020015b60405180910390f35b34801561018357600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d646576000000000000000000006020820152905161016e9190611cd5565b3480156101cf57600080fd5b506101e36101de366004611ce8565b61046c565b60405161016e93929190611d05565b3480156101fe57600080fd5b5061014061020d366004611d5e565b6105a3565b34801561021e57600080fd5b5061014061022d366004611ce8565b61085e565b34801561023e57600080fd5b5061025261024d366004611d8e565b6108a9565b60405190815260200161016e565b34801561026c57600080fd5b5061014061027b366004611db5565b6108bc565b34801561028c57600080fd5b5061014061029b366004611dd2565b6108f5565b3480156102ac57600080fd5b506101406102bb366004611dfe565b61090b565b3480156102cc57600080fd5b506102e06102db366004611d8e565b610939565b60405161016e9190611e3f565b3480156102f957600080fd5b50610140610b44565b34801561030e57600080fd5b5061014061031d366004611f6b565b610c41565b34801561032e57600080fd5b5061014061033d366004611fd7565b610e22565b34801561034e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016e565b34801561039a57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610369565b3480156103cd57600080fd5b506101406103dc366004611fd7565b611055565b3480156103ed57600080fd5b506101406103fc366004612012565b611191565b34801561040d57600080fd5b5061014061041c366004612095565b611212565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061045090859085906120b2565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff9092169291610492906120c2565b80601f01602080910402602001604051908101604052809291908181526020018280546104be906120c2565b801561050b5780601f106104e05761010080835404028352916020019161050b565b820191906000526020600020905b8154815290600101906020018083116104ee57829003601f168201915b505050505090806002018054610520906120c2565b80601f016020809104026020016040519081016040528092919081815260200182805461054c906120c2565b80156105995780601f1061056e57610100808354040283529160200191610599565b820191906000526020600020905b81548152906001019060200180831161057c57829003601f168201915b5050505050905083565b6105ab611226565b60016105b86004846112a9565b146105f7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6106078260005b600491906112bc565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161064f906120c2565b80601f016020809104026020016040519081016040528092919081815260200182805461067b906120c2565b80156106c85780601f1061069d576101008083540402835291602001916106c8565b820191906000526020600020905b8154815290600101906020018083116106ab57829003601f168201915b505050505081526020016003820180546106e1906120c2565b80601f016020809104026020016040519081016040528092919081815260200182805461070d906120c2565b801561075a5780601f1061072f5761010080835404028352916020019161075a565b820191906000526020600020905b81548152906001019060200180831161073d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107dd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610788565b505050915250506040805173ffffffffffffffffffffffffffffffffffffffff85166020820152919250610822918391016040516020818303038152906040526112d1565b61082d600484611376565b5060405183907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a2505050565b610866611226565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006108b66004836112a9565b92915050565b6108c4611226565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6108fd611226565b6109078282611382565b5050565b610913611226565b61093473ffffffffffffffffffffffffffffffffffffffff841683836114dc565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109a8906120c2565b80601f01602080910402602001604051908101604052809291908181526020018280546109d4906120c2565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b50505050508152602001600382018054610a3a906120c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a66906120c2565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b365760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ae1565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016105ee565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c49611226565b60005b81811015610d2c5760026000848484818110610c6a57610c6a612115565b9050602002810190610c7c9190612144565b610c8a906020810190611ce8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610cc157610cc1612115565b9050602002810190610cd39190612144565b610ce1906020810190612182565b604051610cef9291906120b2565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c4c565b5060005b83811015610e1b57600160026000878785818110610d5057610d50612115565b9050602002810190610d629190612144565b610d70906020810190611ce8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610da757610da7612115565b9050602002810190610db99190612144565b610dc7906020810190612182565b604051610dd59291906120b2565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d30565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e93576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016105ee565b610ea36040820160208301611ce8565b67ffffffffffffffff81166000908152600260205260409020600181018054610ecb906120c2565b15905080610eda5750805460ff165b15610f1d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016105ee565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f599086906004016122f4565b600060405180830381600087803b158015610f7357600080fd5b505af1925050508015610f84575060015b611024573d808015610fb2576040519150601f19603f3d011682016040523d82523d6000602084013e610fb7565b606091505b50610fc4843560016105fe565b50833560009081526003602052604090208490610fe182826126f5565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611016908490611cd5565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b33301461108e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61109e6040820160208301611ce8565b6110ab6040830183612182565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061110992508491506127ef565b9081526040519081900360200190205460ff1661115457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016105ee9190611cd5565b60075460ff1615610934576040517f79f79e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611199611226565b67ffffffffffffffff85166000908152600260205260409020600181016111c1858783612479565b5081156111d957600281016111d7838583612479565b505b805460ff161561120a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b61121a611226565b61122381611569565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105ee565b565b60006112b5838361165e565b9392505050565b60006112c98484846116e8565b949350505050565b6000818060200190518101906112e79190612801565b905060005b8360800151518110156113705760008460800151828151811061131157611311612115565b602002602001015160200151905060008560800151838151811061133757611337612115565b602090810291909101015151905061136673ffffffffffffffffffffffffffffffffffffffff821685846114dc565b50506001016112ec565b50505050565b60006112b58383611705565b804710156113ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016105ee565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611446576040519150601f19603f3d011682016040523d82523d6000602084013e61144b565b606091505b5050905080610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016105ee565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610934908490611722565b3373ffffffffffffffffffffffffffffffffffffffff8216036115e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105ee565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054801515806116825750611682848461182e565b6112b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016105ee565b600082815260028401602052604081208290556112c9848461183a565b600081815260028301602052604081208190556112b58383611846565b6000611784826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166118529092919063ffffffff16565b80519091501561093457808060200190518101906117a2919061281e565b610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016105ee565b60006112b58383611861565b60006112b58383611879565b60006112b583836118c8565b60606112c984846000856119bb565b600081815260018301602052604081205415156112b5565b60008181526001830160205260408120546118c0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b6565b5060006108b6565b600081815260018301602052604081205480156119b15760006118ec60018361283b565b85549091506000906119009060019061283b565b905081811461196557600086600001828154811061192057611920612115565b906000526020600020015490508087600001848154811061194357611943612115565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806119765761197661284e565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108b6565b60009150506108b6565b606082471015611a4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016105ee565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611a7691906127ef565b60006040518083038185875af1925050503d8060008114611ab3576040519150601f19603f3d011682016040523d82523d6000602084013e611ab8565b606091505b5091509150611ac987838387611ad4565b979650505050505050565b60608315611b6a578251600003611b635773ffffffffffffffffffffffffffffffffffffffff85163b611b63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105ee565b50816112c9565b6112c98383815115611b7f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ee9190611cd5565b67ffffffffffffffff8116811461122357600080fd5b60008083601f840112611bdb57600080fd5b50813567ffffffffffffffff811115611bf357600080fd5b602083019150836020828501011115611c0b57600080fd5b9250929050565b600080600060408486031215611c2757600080fd5b8335611c3281611bb3565b9250602084013567ffffffffffffffff811115611c4e57600080fd5b611c5a86828701611bc9565b9497909650939450505050565b60005b83811015611c82578181015183820152602001611c6a565b50506000910152565b60008151808452611ca3816020860160208601611c67565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112b56020830184611c8b565b600060208284031215611cfa57600080fd5b81356112b581611bb3565b8315158152606060208201526000611d206060830185611c8b565b8281036040840152611d328185611c8b565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461122357600080fd5b60008060408385031215611d7157600080fd5b823591506020830135611d8381611d3c565b809150509250929050565b600060208284031215611da057600080fd5b5035919050565b801515811461122357600080fd5b600060208284031215611dc757600080fd5b81356112b581611da7565b60008060408385031215611de557600080fd5b8235611df081611d3c565b946020939093013593505050565b600080600060608486031215611e1357600080fd5b8335611e1e81611d3c565b92506020840135611e2e81611d3c565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611e7d60c0860183611c8b565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611eb98483611c8b565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f1a578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611edb565b50979650505050505050565b60008083601f840112611f3857600080fd5b50813567ffffffffffffffff811115611f5057600080fd5b6020830191508360208260051b8501011115611c0b57600080fd5b60008060008060408587031215611f8157600080fd5b843567ffffffffffffffff80821115611f9957600080fd5b611fa588838901611f26565b90965094506020870135915080821115611fbe57600080fd5b50611fcb87828801611f26565b95989497509550505050565b600060208284031215611fe957600080fd5b813567ffffffffffffffff81111561200057600080fd5b820160a081850312156112b557600080fd5b60008060008060006060868803121561202a57600080fd5b853561203581611bb3565b9450602086013567ffffffffffffffff8082111561205257600080fd5b61205e89838a01611bc9565b9096509450604088013591508082111561207757600080fd5b5061208488828901611bc9565b969995985093965092949392505050565b6000602082840312156120a757600080fd5b81356112b581611d3c565b8183823760009101908152919050565b600181811c908216806120d657607f821691505b60208210810361210f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261217857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121b757600080fd5b83018035915067ffffffffffffffff8211156121d257600080fd5b602001915036819003821315611c0b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261221c57600080fd5b830160208101925035905067ffffffffffffffff81111561223c57600080fd5b803603821315611c0b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156122e95781356122b781611d3c565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016122a4565b509495945050505050565b60208152813560208201526000602083013561230f81611bb3565b67ffffffffffffffff808216604085015261232d60408601866121e7565b925060a0606086015261234460c08601848361224b565b92505061235460608601866121e7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261238a85838561224b565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126123c357600080fd5b602092880192830192359150838211156123dc57600080fd5b8160061b36038313156123ee57600080fd5b8685030160a0870152611ac9848284612294565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610934576000816000526020600020601f850160051c8101602086101561245a5750805b601f850160051c820191505b8181101561120a57828155600101612466565b67ffffffffffffffff83111561249157612491612402565b6124a58361249f83546120c2565b83612431565b6000601f8411600181146124f757600085156124c15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e1b565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125465786850135825560209485019460019092019101612526565b5086821015612581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356125cd81611d3c565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561263357612633612402565b8054838255808410156126c05760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461267457612674612593565b808616861461268557612685612593565b5060008360005260206000208360011b81018760011b820191505b808210156126bb5782825582848301556002820191506126a0565b505050505b5060008181526020812083915b8581101561120a576126df83836125c2565b60409290920191600291909101906001016126cd565b8135815560018101602083013561270b81611bb3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561274b6040860186612182565b9350915061275d838360028701612479565b61276a6060860186612182565b9350915061277c838360038701612479565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126127b357600080fd5b9184019182359150808211156127c857600080fd5b506020820191508060061b36038213156127e157600080fd5b61137081836004860161261a565b60008251612178818460208701611c67565b60006020828403121561281357600080fd5b81516112b581611d3c565b60006020828403121561283057600080fd5b81516112b581611da7565b818103818111156108b6576108b6612593565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002a7638038062002a768339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051612879620001fd600039600081816103760152610e5901526128796000f3fe60806040526004361061012d5760003560e01c806379ba5097116100a5578063b0f479a111610074578063d8469e4011610059578063d8469e40146103ba578063e4ca8754146103da578063f2fde38b146103fa57600080fd5b8063b0f479a114610367578063cf6730f81461039a57600080fd5b806379ba5097146102c65780638462a2b9146102db57806385572ffb146102fb5780638da5cb5b1461031b57600080fd5b806341eade46116100fc578063536c6bfa116100e1578063536c6bfa146102595780635e35359e146102795780636939cd971461029957600080fd5b806341eade461461020b5780635075a9d41461022b57600080fd5b80630e958d6b14610139578063181f5a771461016e57806335f170ef146101ba5780633a998eaf146101e957600080fd5b3661013457005b600080fd5b34801561014557600080fd5b50610159610154366004611c88565b61041a565b60405190151581526020015b60405180910390f35b34801561017a57600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101659190611d4b565b3480156101c657600080fd5b506101da6101d5366004611d5e565b610465565b60405161016593929190611d7b565b3480156101f557600080fd5b50610209610204366004611dd4565b61059c565b005b34801561021757600080fd5b50610209610226366004611d5e565b6108b6565b34801561023757600080fd5b5061024b610246366004611e04565b610901565b604051908152602001610165565b34801561026557600080fd5b50610209610274366004611e1d565b610914565b34801561028557600080fd5b50610209610294366004611e49565b61092a565b3480156102a557600080fd5b506102b96102b4366004611e04565b610958565b6040516101659190611e8a565b3480156102d257600080fd5b50610209610b63565b3480156102e757600080fd5b506102096102f6366004611fb6565b610c60565b34801561030757600080fd5b50610209610316366004612022565b610e41565b34801561032757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610165565b34801561037357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610342565b3480156103a657600080fd5b506102096103b5366004612022565b611074565b3480156103c657600080fd5b506102096103d536600461205d565b611173565b3480156103e657600080fd5b506102096103f5366004611e04565b6111f4565b34801561040657600080fd5b506102096104153660046120e0565b611455565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061044990859085906120fd565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161048b9061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546104b79061210d565b80156105045780601f106104d957610100808354040283529160200191610504565b820191906000526020600020905b8154815290600101906020018083116104e757829003601f168201915b5050505050908060020180546105199061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546105459061210d565b80156105925780601f1061056757610100808354040283529160200191610592565b820191906000526020600020905b81548152906001019060200180831161057557829003601f168201915b5050505050905083565b6105a4611469565b60016105b16004846114ec565b146105f0576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6106008260025b600491906114ff565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916106489061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546106749061210d565b80156106c15780601f10610696576101008083540402835291602001916106c1565b820191906000526020600020905b8154815290600101906020018083116106a457829003601f168201915b505050505081526020016003820180546106da9061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546107069061210d565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107d65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610781565b5050505081525050905060005b8160800151518110156108655761085d838360800151838151811061080a5761080a612160565b6020026020010151602001518460800151848151811061082c5761082c612160565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166115149092919063ffffffff16565b6001016107e3565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b6108be611469565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061090e6004836114ec565b92915050565b61091c611469565b61092682826115a1565b5050565b610932611469565b61095373ffffffffffffffffffffffffffffffffffffffff84168383611514565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109c79061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546109f39061210d565b8015610a405780601f10610a1557610100808354040283529160200191610a40565b820191906000526020600020905b815481529060010190602001808311610a2357829003601f168201915b50505050508152602001600382018054610a599061210d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a859061210d565b8015610ad25780601f10610aa757610100808354040283529160200191610ad2565b820191906000526020600020905b815481529060010190602001808311610ab557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b555760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b00565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016105e7565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c68611469565b60005b81811015610d4b5760026000848484818110610c8957610c89612160565b9050602002810190610c9b919061218f565b610ca9906020810190611d5e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610ce057610ce0612160565b9050602002810190610cf2919061218f565b610d009060208101906121cd565b604051610d0e9291906120fd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c6b565b5060005b83811015610e3a57600160026000878785818110610d6f57610d6f612160565b9050602002810190610d81919061218f565b610d8f906020810190611d5e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610dc657610dc6612160565b9050602002810190610dd8919061218f565b610de69060208101906121cd565b604051610df49291906120fd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d4f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb2576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016105e7565b610ec26040820160208301611d5e565b67ffffffffffffffff81166000908152600260205260409020600181018054610eea9061210d565b15905080610ef95750805460ff165b15610f3c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016105e7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f7890869060040161233f565b600060405180830381600087803b158015610f9257600080fd5b505af1925050508015610fa3575060015b611043573d808015610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50610fe3843560016105f7565b508335600090815260036020526040902084906110008282612738565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611035908490611d4b565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b3330146110ad576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110bd6040820160208301611d5e565b6110ca60408301836121cd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111289250849150612838565b9081526040519081900360200190205460ff1661095357806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016105e79190611d4b565b61117b611469565b67ffffffffffffffff85166000908152600260205260409020600181016111a38587836124c4565b5081156111bb57600281016111b98385836124c4565b505b805460ff16156111ec5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016112016004836114ec565b1461123b576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016105e7565b6112468160006105f7565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161128e9061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba9061210d565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b505050505081526020016003820180546113209061210d565b80601f016020809104026020016040519081016040528092919081815260200182805461134c9061210d565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561141c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016113c7565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b61145d611469565b611466816116fb565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105e7565b565b60006114f883836117f0565b9392505050565b600061150c84848461187a565b949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610953908490611897565b8047101561160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016105e7565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611665576040519150601f19603f3d011682016040523d82523d6000602084013e61166a565b606091505b5050905080610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016105e7565b3373ffffffffffffffffffffffffffffffffffffffff82160361177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105e7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611814575061181484846119a3565b6114f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016105e7565b6000828152600284016020526040812082905561150c84846119af565b60006118f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119bb9092919063ffffffff16565b8051909150156109535780806020019051810190611917919061284a565b610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016105e7565b60006114f883836119ca565b60006114f883836119e2565b606061150c8484600085611a31565b600081815260018301602052604081205415156114f8565b6000818152600183016020526040812054611a295750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561090e565b50600061090e565b606082471015611ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016105e7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611aec9190612838565b60006040518083038185875af1925050503d8060008114611b29576040519150601f19603f3d011682016040523d82523d6000602084013e611b2e565b606091505b5091509150611b3f87838387611b4a565b979650505050505050565b60608315611be0578251600003611bd95773ffffffffffffffffffffffffffffffffffffffff85163b611bd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105e7565b508161150c565b61150c8383815115611bf55781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e79190611d4b565b67ffffffffffffffff8116811461146657600080fd5b60008083601f840112611c5157600080fd5b50813567ffffffffffffffff811115611c6957600080fd5b602083019150836020828501011115611c8157600080fd5b9250929050565b600080600060408486031215611c9d57600080fd5b8335611ca881611c29565b9250602084013567ffffffffffffffff811115611cc457600080fd5b611cd086828701611c3f565b9497909650939450505050565b60005b83811015611cf8578181015183820152602001611ce0565b50506000910152565b60008151808452611d19816020860160208601611cdd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006114f86020830184611d01565b600060208284031215611d7057600080fd5b81356114f881611c29565b8315158152606060208201526000611d966060830185611d01565b8281036040840152611da88185611d01565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461146657600080fd5b60008060408385031215611de757600080fd5b823591506020830135611df981611db2565b809150509250929050565b600060208284031215611e1657600080fd5b5035919050565b60008060408385031215611e3057600080fd5b8235611e3b81611db2565b946020939093013593505050565b600080600060608486031215611e5e57600080fd5b8335611e6981611db2565b92506020840135611e7981611db2565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611ec860c0860183611d01565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611f048483611d01565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f65578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611f26565b50979650505050505050565b60008083601f840112611f8357600080fd5b50813567ffffffffffffffff811115611f9b57600080fd5b6020830191508360208260051b8501011115611c8157600080fd5b60008060008060408587031215611fcc57600080fd5b843567ffffffffffffffff80821115611fe457600080fd5b611ff088838901611f71565b9096509450602087013591508082111561200957600080fd5b5061201687828801611f71565b95989497509550505050565b60006020828403121561203457600080fd5b813567ffffffffffffffff81111561204b57600080fd5b820160a081850312156114f857600080fd5b60008060008060006060868803121561207557600080fd5b853561208081611c29565b9450602086013567ffffffffffffffff8082111561209d57600080fd5b6120a989838a01611c3f565b909650945060408801359150808211156120c257600080fd5b506120cf88828901611c3f565b969995985093965092949392505050565b6000602082840312156120f257600080fd5b81356114f881611db2565b8183823760009101908152919050565b600181811c9082168061212157607f821691505b60208210810361215a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126121c357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261220257600080fd5b83018035915067ffffffffffffffff82111561221d57600080fd5b602001915036819003821315611c8157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261226757600080fd5b830160208101925035905067ffffffffffffffff81111561228757600080fd5b803603821315611c8157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561233457813561230281611db2565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016122ef565b509495945050505050565b60208152813560208201526000602083013561235a81611c29565b67ffffffffffffffff80821660408501526123786040860186612232565b925060a0606086015261238f60c086018483612296565b92505061239f6060860186612232565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123d5858385612296565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261240e57600080fd5b6020928801928301923591508382111561242757600080fd5b8160061b360383131561243957600080fd5b8685030160a0870152611b3f8482846122df565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610953576000816000526020600020601f850160051c810160208610156124a55750805b601f850160051c820191505b818110156111ec578281556001016124b1565b67ffffffffffffffff8311156124dc576124dc61244d565b6124f0836124ea835461210d565b8361247c565b6000601f841160018114612542576000851561250c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e3a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125915786850135825560209485019460019092019101612571565b50868210156125cc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216821461263b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561264b81611db2565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156126b1576126b161244d565b805483825580841015612703576126c7816125de565b6126d0856125de565b6000848152602081209283019291909101905b828210156126ff578082558060018301556002820191506126e3565b5050505b5060008181526020812083915b858110156111ec576127228383612640565b6040929092019160029190910190600101612710565b8135815560018101602083013561274e81611c29565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561278e60408601866121cd565b935091506127a08383600287016124c4565b6127ad60608601866121cd565b935091506127bf8383600387016124c4565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126127f657600080fd5b91840191823591508082111561280b57600080fd5b506020820191508060061b360382131561282457600080fd5b612832818360048601612698565b50505050565b600082516121c3818460208701611cdd565b60006020828403121561285c57600080fd5b815180151581146114f857600080fdfea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -310,7 +310,7 @@ func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, arg0 return *outstruct, err } - outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Disabled = *abi.ConvertType(out[0], new(bool)).(*bool) outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) @@ -352,6 +352,18 @@ func (_CCIPReceiver *CCIPReceiverCallerSession) TypeAndVersion() (string, error) return _CCIPReceiver.Contract.TypeAndVersion(&_CCIPReceiver.CallOpts) } +func (_CCIPReceiver *CCIPReceiverTransactor) AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "abandonMessage", messageId, receiver) +} + +func (_CCIPReceiver *CCIPReceiverSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.AbandonMessage(&_CCIPReceiver.TransactOpts, messageId, receiver) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.AbandonMessage(&_CCIPReceiver.TransactOpts, messageId, receiver) +} + func (_CCIPReceiver *CCIPReceiverTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { return _CCIPReceiver.contract.Transact(opts, "acceptOwnership") } @@ -412,28 +424,16 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) ProcessMessage(message Clien return _CCIPReceiver.Contract.ProcessMessage(&_CCIPReceiver.TransactOpts, message) } -func (_CCIPReceiver *CCIPReceiverTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _CCIPReceiver.contract.Transact(opts, "retryFailedMessage", messageId, forwardingAddress) -} - -func (_CCIPReceiver *CCIPReceiverSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId, forwardingAddress) +func (_CCIPReceiver *CCIPReceiverTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "retryFailedMessage", messageId) } -func (_CCIPReceiver *CCIPReceiverTransactorSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId, forwardingAddress) +func (_CCIPReceiver *CCIPReceiverSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId) } -func (_CCIPReceiver *CCIPReceiverTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { - return _CCIPReceiver.contract.Transact(opts, "setSimRevert", simRevert) -} - -func (_CCIPReceiver *CCIPReceiverSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _CCIPReceiver.Contract.SetSimRevert(&_CCIPReceiver.TransactOpts, simRevert) -} - -func (_CCIPReceiver *CCIPReceiverTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _CCIPReceiver.Contract.SetSimRevert(&_CCIPReceiver.TransactOpts, simRevert) +func (_CCIPReceiver *CCIPReceiverTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiver.Contract.RetryFailedMessage(&_CCIPReceiver.TransactOpts, messageId) } func (_CCIPReceiver *CCIPReceiverTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -448,15 +448,15 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) TransferOwnership(to common. return _CCIPReceiver.Contract.TransferOwnership(&_CCIPReceiver.TransactOpts, to) } -func (_CCIPReceiver *CCIPReceiverTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPReceiver *CCIPReceiverTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPReceiver.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_CCIPReceiver *CCIPReceiverSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPReceiver *CCIPReceiverSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPReceiver.Contract.UpdateApprovedSenders(&_CCIPReceiver.TransactOpts, adds, removes) } -func (_CCIPReceiver *CCIPReceiverTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPReceiver *CCIPReceiverTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPReceiver.Contract.UpdateApprovedSenders(&_CCIPReceiver.TransactOpts, adds, removes) } @@ -484,18 +484,6 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) WithdrawTokens(token common. return _CCIPReceiver.Contract.WithdrawTokens(&_CCIPReceiver.TransactOpts, token, to, amount) } -func (_CCIPReceiver *CCIPReceiverTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { - return _CCIPReceiver.contract.RawTransact(opts, calldata) -} - -func (_CCIPReceiver *CCIPReceiverSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _CCIPReceiver.Contract.Fallback(&_CCIPReceiver.TransactOpts, calldata) -} - -func (_CCIPReceiver *CCIPReceiverTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _CCIPReceiver.Contract.Fallback(&_CCIPReceiver.TransactOpts, calldata) -} - func (_CCIPReceiver *CCIPReceiverTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { return _CCIPReceiver.contract.RawTransact(opts, nil) } @@ -508,6 +496,134 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) Receive() (*types.Transactio return _CCIPReceiver.Contract.Receive(&_CCIPReceiver.TransactOpts) } +type CCIPReceiverMessageAbandonedIterator struct { + Event *CCIPReceiverMessageAbandoned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverMessageAbandonedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverMessageAbandoned) + 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(CCIPReceiverMessageAbandoned) + 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 *CCIPReceiverMessageAbandonedIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverMessageAbandonedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverMessageAbandoned struct { + MessageId [32]byte + TokenReceiver common.Address + Raw types.Log +} + +func (_CCIPReceiver *CCIPReceiverFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageAbandonedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPReceiverMessageAbandonedIterator{contract: _CCIPReceiver.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageAbandoned, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverMessageAbandoned) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageAbandoned", 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 (_CCIPReceiver *CCIPReceiverFilterer) ParseMessageAbandoned(log types.Log) (*CCIPReceiverMessageAbandoned, error) { + event := new(CCIPReceiverMessageAbandoned) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type CCIPReceiverMessageFailedIterator struct { Event *CCIPReceiverMessageFailed @@ -1163,13 +1279,15 @@ func (_CCIPReceiver *CCIPReceiverFilterer) ParseOwnershipTransferred(log types.L } type SChainConfigs struct { - IsDisabled bool + Disabled bool Recipient []byte ExtraArgsBytes []byte } func (_CCIPReceiver *CCIPReceiver) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { + case _CCIPReceiver.abi.Events["MessageAbandoned"].ID: + return _CCIPReceiver.ParseMessageAbandoned(log) case _CCIPReceiver.abi.Events["MessageFailed"].ID: return _CCIPReceiver.ParseMessageFailed(log) case _CCIPReceiver.abi.Events["MessageRecovered"].ID: @@ -1186,6 +1304,10 @@ func (_CCIPReceiver *CCIPReceiver) ParseLog(log types.Log) (generated.AbigenLog, } } +func (CCIPReceiverMessageAbandoned) Topic() common.Hash { + return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") +} + func (CCIPReceiverMessageFailed) Topic() common.Hash { return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") } @@ -1227,6 +1349,8 @@ type CCIPReceiverInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) + AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) @@ -1237,22 +1361,24 @@ type CCIPReceiverInterface interface { ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) - - SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) - Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) - Receive(opts *bind.TransactOpts) (*types.Transaction, error) + FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageAbandonedIterator, error) + + WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageAbandoned, messageId [][32]byte) (event.Subscription, error) + + ParseMessageAbandoned(log types.Log) (*CCIPReceiverMessageAbandoned, error) + FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageFailedIterator, error) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageFailed, messageId [][32]byte) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index 25afce9f30..8ed77d40ce 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -30,7 +30,7 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseapprovedSenderUpdate struct { +type CCIPClientBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } @@ -41,8 +41,8 @@ type ClientEVMTokenAmount struct { } var CCIPSenderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620021a3380380620021a38339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611f91620002126000396000818161028b01528181610b9401528181610c5d01528181610d310152610d6d0152611f916000f3fe6080604052600436106100d65760003560e01c806379ba50971161007f578063b0f479a111610059578063b0f479a11461027c578063d8469e40146102af578063effde240146102cf578063f2fde38b146102f0576100dd565b806379ba5097146101fb5780638462a2b9146102105780638da5cb5b14610230576100dd565b806341eade46116100b057806341eade461461019b578063536c6bfa146101bb5780635e35359e146101db576100dd565b80630e958d6b146100eb578063181f5a771461012057806335f170ef1461016c576100dd565b366100dd57005b3480156100e957600080fd5b005b3480156100f757600080fd5b5061010b6101063660046116ed565b610310565b60405190151581526020015b60405180910390f35b34801561012c57600080fd5b50604080518082018252601481527f4343495053656e64657220312e302e302d6465760000000000000000000000006020820152905161011791906117ae565b34801561017857600080fd5b5061018c6101873660046117c8565b61035b565b604051610117939291906117e3565b3480156101a757600080fd5b506100e96101b63660046117c8565b610492565b3480156101c757600080fd5b506100e96101d636600461183c565b6104dd565b3480156101e757600080fd5b506100e96101f6366004611873565b6104f3565b34801561020757600080fd5b506100e9610521565b34801561021c57600080fd5b506100e961022b3660046118f9565b610623565b34801561023c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b34801561028857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610257565b3480156102bb57600080fd5b506100e96102ca366004611965565b610804565b6102e26102dd3660046119e6565b610885565b604051908152602001610117565b3480156102fc57600080fd5b506100e961030b366004611aa7565b610e50565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061033f9085908590611ac4565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161038190611ad4565b80601f01602080910402602001604051908101604052809291908181526020018280546103ad90611ad4565b80156103fa5780601f106103cf576101008083540402835291602001916103fa565b820191906000526020600020905b8154815290600101906020018083116103dd57829003601f168201915b50505050509080600201805461040f90611ad4565b80601f016020809104026020016040519081016040528092919081815260200182805461043b90611ad4565b80156104885780601f1061045d57610100808354040283529160200191610488565b820191906000526020600020905b81548152906001019060200180831161046b57829003601f168201915b5050505050905083565b61049a610e64565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6104e5610e64565b6104ef8282610ee7565b5050565b6104fb610e64565b61051c73ffffffffffffffffffffffffffffffffffffffff84168383611041565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61062b610e64565b60005b8181101561070e576002600084848481811061064c5761064c611b27565b905060200281019061065e9190611b56565b61066c9060208101906117c8565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106106a3576106a3611b27565b90506020028101906106b59190611b56565b6106c3906020810190611b94565b6040516106d1929190611ac4565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560010161062e565b5060005b838110156107fd5760016002600087878581811061073257610732611b27565b90506020028101906107449190611b56565b6107529060208101906117c8565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061078957610789611b27565b905060200281019061079b9190611b56565b6107a9906020810190611b94565b6040516107b7929190611ac4565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610712565b5050505050565b61080c610e64565b67ffffffffffffffff8516600090815260026020526040902060018101610834858783611c70565b50811561084c576002810161084a838583611c70565b505b805460ff161561087d5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b67ffffffffffffffff86166000908152600260205260408120600181018054899291906108b190611ad4565b159050806108c05750805460ff165b15610903576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161059e565b6040805160a08101825267ffffffffffffffff8b1660009081526002602052918220600101805482919061093690611ad4565b80601f016020809104026020016040519081016040528092919081815260200182805461096290611ad4565b80156109af5780601f10610984576101008083540402835291602001916109af565b820191906000526020600020905b81548152906001019060200180831161099257829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610a3f57610a3060408302860136819003810190611d8a565b81526020019060010190610a13565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600260008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018054610a9a90611ad4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac690611ad4565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b5050505050815250905060005b88811015610c1c57610b8f33308c8c85818110610b3f57610b3f611b27565b905060400201602001358d8d86818110610b5b57610b5b611b27565b610b719260206040909202019081019150611aa7565b73ffffffffffffffffffffffffffffffffffffffff16929190611115565b610c147f00000000000000000000000000000000000000000000000000000000000000008b8b84818110610bc557610bc5611b27565b905060400201602001358c8c85818110610be157610be1611b27565b610bf79260206040909202019081019150611aa7565b73ffffffffffffffffffffffffffffffffffffffff169190611179565b600101610b20565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90610c94908e908690600401611de2565b602060405180830381865afa158015610cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd59190611ef7565b905073ffffffffffffffffffffffffffffffffffffffff861615610d5657610d1573ffffffffffffffffffffffffffffffffffffffff8716333084611115565b610d5673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000083611179565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615610da3576000610da5565b825b8d856040518463ffffffff1660e01b8152600401610dc4929190611de2565b60206040518083038185885af1158015610de2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e079190611ef7565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051610e3a91815260200190565b60405180910390a1505050509695505050505050565b610e58610e64565b610e6181611277565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161059e565b565b80471015610f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161059e565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610fab576040519150601f19603f3d011682016040523d82523d6000602084013e610fb0565b606091505b505090508061051c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161059e565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261051c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261136c565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526111739085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611093565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112149190611ef7565b61121e9190611f10565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111739085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611093565b3373ffffffffffffffffffffffffffffffffffffffff8216036112f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161059e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006113ce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114789092919063ffffffff16565b80519091501561051c57808060200190518101906113ec9190611f50565b61051c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161059e565b6060611487848460008561148f565b949350505050565b606082471015611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161059e565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161154a9190611f72565b60006040518083038185875af1925050503d8060008114611587576040519150601f19603f3d011682016040523d82523d6000602084013e61158c565b606091505b509150915061159d878383876115a8565b979650505050505050565b6060831561163e5782516000036116375773ffffffffffffffffffffffffffffffffffffffff85163b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161059e565b5081611487565b61148783838151156116535781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059e91906117ae565b803567ffffffffffffffff8116811461169f57600080fd5b919050565b60008083601f8401126116b657600080fd5b50813567ffffffffffffffff8111156116ce57600080fd5b6020830191508360208285010111156116e657600080fd5b9250929050565b60008060006040848603121561170257600080fd5b61170b84611687565b9250602084013567ffffffffffffffff81111561172757600080fd5b611733868287016116a4565b9497909650939450505050565b60005b8381101561175b578181015183820152602001611743565b50506000910152565b6000815180845261177c816020860160208601611740565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117c16020830184611764565b9392505050565b6000602082840312156117da57600080fd5b6117c182611687565b83151581526060602082015260006117fe6060830185611764565b82810360408401526118108185611764565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e6157600080fd5b6000806040838503121561184f57600080fd5b823561185a8161181a565b946020939093013593505050565b803561169f8161181a565b60008060006060848603121561188857600080fd5b83356118938161181a565b925060208401356118a38161181a565b929592945050506040919091013590565b60008083601f8401126118c657600080fd5b50813567ffffffffffffffff8111156118de57600080fd5b6020830191508360208260051b85010111156116e657600080fd5b6000806000806040858703121561190f57600080fd5b843567ffffffffffffffff8082111561192757600080fd5b611933888389016118b4565b9096509450602087013591508082111561194c57600080fd5b50611959878288016118b4565b95989497509550505050565b60008060008060006060868803121561197d57600080fd5b61198686611687565b9450602086013567ffffffffffffffff808211156119a357600080fd5b6119af89838a016116a4565b909650945060408801359150808211156119c857600080fd5b506119d5888289016116a4565b969995985093965092949392505050565b600080600080600080608087890312156119ff57600080fd5b611a0887611687565b9550602087013567ffffffffffffffff80821115611a2557600080fd5b818901915089601f830112611a3957600080fd5b813581811115611a4857600080fd5b8a60208260061b8501011115611a5d57600080fd5b602083019750809650506040890135915080821115611a7b57600080fd5b50611a8889828a016116a4565b9094509250611a9b905060608801611868565b90509295509295509295565b600060208284031215611ab957600080fd5b81356117c18161181a565b8183823760009101908152919050565b600181811c90821680611ae857607f821691505b602082108103611b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611b8a57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bc957600080fd5b83018035915067ffffffffffffffff821115611be457600080fd5b6020019150368190038213156116e657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561051c576000816000526020600020601f850160051c81016020861015611c515750805b601f850160051c820191505b8181101561087d57828155600101611c5d565b67ffffffffffffffff831115611c8857611c88611bf9565b611c9c83611c968354611ad4565b83611c28565b6000601f841160018114611cee5760008515611cb85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556107fd565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611d3d5786850135825560209485019460019092019101611d1d565b5086821015611d78577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060408284031215611d9c57600080fd5b6040516040810181811067ffffffffffffffff82111715611dbf57611dbf611bf9565b6040528235611dcd8161181a565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a06040860152611e1160e0860182611764565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878403016060880152611e4c8383611764565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611ead578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190611e6e565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a01529550611ee98187611764565b9a9950505050505050505050565b600060208284031215611f0957600080fd5b5051919050565b80820180821115611f4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b600060208284031215611f6257600080fd5b815180151581146117c157600080fd5b60008251611b8a81846020870161174056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b506040516200219c3803806200219c8339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611f8a620002126000396000818161028401528181610b8d01528181610c5601528181610d2a0152610d660152611f8a6000f3fe6080604052600436106100d65760003560e01c806379ba50971161007f578063b0f479a111610059578063b0f479a114610275578063d8469e40146102a8578063effde240146102c8578063f2fde38b146102e957600080fd5b806379ba5097146101f45780638462a2b9146102095780638da5cb5b1461022957600080fd5b806341eade46116100b057806341eade4614610192578063536c6bfa146101b45780635e35359e146101d457600080fd5b80630e958d6b146100e2578063181f5a771461011757806335f170ef1461016357600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101026100fd3660046116e6565b610309565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b50604080518082018252601481527f4343495053656e64657220312e302e302d6465760000000000000000000000006020820152905161010e91906117a7565b34801561016f57600080fd5b5061018361017e3660046117c1565b610354565b60405161010e939291906117dc565b34801561019e57600080fd5b506101b26101ad3660046117c1565b61048b565b005b3480156101c057600080fd5b506101b26101cf366004611835565b6104d6565b3480156101e057600080fd5b506101b26101ef36600461186c565b6104ec565b34801561020057600080fd5b506101b261051a565b34801561021557600080fd5b506101b26102243660046118f2565b61061c565b34801561023557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010e565b34801561028157600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610250565b3480156102b457600080fd5b506101b26102c336600461195e565b6107fd565b6102db6102d63660046119df565b61087e565b60405190815260200161010e565b3480156102f557600080fd5b506101b2610304366004611aa0565b610e49565b67ffffffffffffffff831660009081526002602052604080822090516003909101906103389085908590611abd565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161037a90611acd565b80601f01602080910402602001604051908101604052809291908181526020018280546103a690611acd565b80156103f35780601f106103c8576101008083540402835291602001916103f3565b820191906000526020600020905b8154815290600101906020018083116103d657829003601f168201915b50505050509080600201805461040890611acd565b80601f016020809104026020016040519081016040528092919081815260200182805461043490611acd565b80156104815780601f1061045657610100808354040283529160200191610481565b820191906000526020600020905b81548152906001019060200180831161046457829003601f168201915b5050505050905083565b610493610e5d565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6104de610e5d565b6104e88282610ee0565b5050565b6104f4610e5d565b61051573ffffffffffffffffffffffffffffffffffffffff8416838361103a565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610624610e5d565b60005b81811015610707576002600084848481811061064557610645611b20565b90506020028101906106579190611b4f565b6106659060208101906117c1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030183838381811061069c5761069c611b20565b90506020028101906106ae9190611b4f565b6106bc906020810190611b8d565b6040516106ca929190611abd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610627565b5060005b838110156107f65760016002600087878581811061072b5761072b611b20565b905060200281019061073d9190611b4f565b61074b9060208101906117c1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061078257610782611b20565b90506020028101906107949190611b4f565b6107a2906020810190611b8d565b6040516107b0929190611abd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161070b565b5050505050565b610805610e5d565b67ffffffffffffffff851660009081526002602052604090206001810161082d858783611c69565b5081156108455760028101610843838583611c69565b505b805460ff16156108765780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b67ffffffffffffffff86166000908152600260205260408120600181018054899291906108aa90611acd565b159050806108b95750805460ff165b156108fc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610597565b6040805160a08101825267ffffffffffffffff8b1660009081526002602052918220600101805482919061092f90611acd565b80601f016020809104026020016040519081016040528092919081815260200182805461095b90611acd565b80156109a85780601f1061097d576101008083540402835291602001916109a8565b820191906000526020600020905b81548152906001019060200180831161098b57829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610a3857610a2960408302860136819003810190611d83565b81526020019060010190610a0c565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600260008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018054610a9390611acd565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90611acd565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b5050505050815250905060005b88811015610c1557610b8833308c8c85818110610b3857610b38611b20565b905060400201602001358d8d86818110610b5457610b54611b20565b610b6a9260206040909202019081019150611aa0565b73ffffffffffffffffffffffffffffffffffffffff1692919061110e565b610c0d7f00000000000000000000000000000000000000000000000000000000000000008b8b84818110610bbe57610bbe611b20565b905060400201602001358c8c85818110610bda57610bda611b20565b610bf09260206040909202019081019150611aa0565b73ffffffffffffffffffffffffffffffffffffffff169190611172565b600101610b19565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90610c8d908e908690600401611ddb565b602060405180830381865afa158015610caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cce9190611ef0565b905073ffffffffffffffffffffffffffffffffffffffff861615610d4f57610d0e73ffffffffffffffffffffffffffffffffffffffff871633308461110e565b610d4f73ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000083611172565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615610d9c576000610d9e565b825b8d856040518463ffffffff1660e01b8152600401610dbd929190611ddb565b60206040518083038185885af1158015610ddb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e009190611ef0565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051610e3391815260200190565b60405180910390a1505050509695505050505050565b610e51610e5d565b610e5a81611270565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610597565b565b80471015610f4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610597565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610fa4576040519150601f19603f3d011682016040523d82523d6000602084013e610fa9565b606091505b5050905080610515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610597565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526105159084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611365565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261116c9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161108c565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190611ef0565b6112179190611f09565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061116c9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161108c565b3373ffffffffffffffffffffffffffffffffffffffff8216036112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610597565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006113c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114719092919063ffffffff16565b80519091501561051557808060200190518101906113e59190611f49565b610515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610597565b60606114808484600085611488565b949350505050565b60608247101561151a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610597565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115439190611f6b565b60006040518083038185875af1925050503d8060008114611580576040519150601f19603f3d011682016040523d82523d6000602084013e611585565b606091505b5091509150611596878383876115a1565b979650505050505050565b606083156116375782516000036116305773ffffffffffffffffffffffffffffffffffffffff85163b611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610597565b5081611480565b611480838381511561164c5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059791906117a7565b803567ffffffffffffffff8116811461169857600080fd5b919050565b60008083601f8401126116af57600080fd5b50813567ffffffffffffffff8111156116c757600080fd5b6020830191508360208285010111156116df57600080fd5b9250929050565b6000806000604084860312156116fb57600080fd5b61170484611680565b9250602084013567ffffffffffffffff81111561172057600080fd5b61172c8682870161169d565b9497909650939450505050565b60005b8381101561175457818101518382015260200161173c565b50506000910152565b60008151808452611775816020860160208601611739565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117ba602083018461175d565b9392505050565b6000602082840312156117d357600080fd5b6117ba82611680565b83151581526060602082015260006117f7606083018561175d565b8281036040840152611809818561175d565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e5a57600080fd5b6000806040838503121561184857600080fd5b823561185381611813565b946020939093013593505050565b803561169881611813565b60008060006060848603121561188157600080fd5b833561188c81611813565b9250602084013561189c81611813565b929592945050506040919091013590565b60008083601f8401126118bf57600080fd5b50813567ffffffffffffffff8111156118d757600080fd5b6020830191508360208260051b85010111156116df57600080fd5b6000806000806040858703121561190857600080fd5b843567ffffffffffffffff8082111561192057600080fd5b61192c888389016118ad565b9096509450602087013591508082111561194557600080fd5b50611952878288016118ad565b95989497509550505050565b60008060008060006060868803121561197657600080fd5b61197f86611680565b9450602086013567ffffffffffffffff8082111561199c57600080fd5b6119a889838a0161169d565b909650945060408801359150808211156119c157600080fd5b506119ce8882890161169d565b969995985093965092949392505050565b600080600080600080608087890312156119f857600080fd5b611a0187611680565b9550602087013567ffffffffffffffff80821115611a1e57600080fd5b818901915089601f830112611a3257600080fd5b813581811115611a4157600080fd5b8a60208260061b8501011115611a5657600080fd5b602083019750809650506040890135915080821115611a7457600080fd5b50611a8189828a0161169d565b9094509250611a94905060608801611861565b90509295509295509295565b600060208284031215611ab257600080fd5b81356117ba81611813565b8183823760009101908152919050565b600181811c90821680611ae157607f821691505b602082108103611b1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611b8357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bc257600080fd5b83018035915067ffffffffffffffff821115611bdd57600080fd5b6020019150368190038213156116df57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610515576000816000526020600020601f850160051c81016020861015611c4a5750805b601f850160051c820191505b8181101561087657828155600101611c56565b67ffffffffffffffff831115611c8157611c81611bf2565b611c9583611c8f8354611acd565b83611c21565b6000601f841160018114611ce75760008515611cb15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556107f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611d365786850135825560209485019460019092019101611d16565b5086821015611d71577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060408284031215611d9557600080fd5b6040516040810181811067ffffffffffffffff82111715611db857611db8611bf2565b6040528235611dc681611813565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a06040860152611e0a60e086018261175d565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878403016060880152611e45838361175d565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611ea6578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190611e67565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a01529550611ee2818761175d565b9a9950505050505050505050565b600060208284031215611f0257600080fd5b5051919050565b80820180821115611f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b600060208284031215611f5b57600080fd5b815180151581146117ba57600080fd5b60008251611b8381846020870161173956fea164736f6c6343000818000a", } var CCIPSenderABI = CCIPSenderMetaData.ABI @@ -258,7 +258,7 @@ func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, arg0 uin return *outstruct, err } - outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Disabled = *abi.ConvertType(out[0], new(bool)).(*bool) outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) @@ -360,15 +360,15 @@ func (_CCIPSender *CCIPSenderTransactorSession) TransferOwnership(to common.Addr return _CCIPSender.Contract.TransferOwnership(&_CCIPSender.TransactOpts, to) } -func (_CCIPSender *CCIPSenderTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPSender *CCIPSenderTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPSender.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_CCIPSender *CCIPSenderSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPSender *CCIPSenderSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPSender.Contract.UpdateApprovedSenders(&_CCIPSender.TransactOpts, adds, removes) } -func (_CCIPSender *CCIPSenderTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_CCIPSender *CCIPSenderTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPSender.Contract.UpdateApprovedSenders(&_CCIPSender.TransactOpts, adds, removes) } @@ -396,18 +396,6 @@ func (_CCIPSender *CCIPSenderTransactorSession) WithdrawTokens(token common.Addr return _CCIPSender.Contract.WithdrawTokens(&_CCIPSender.TransactOpts, token, to, amount) } -func (_CCIPSender *CCIPSenderTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { - return _CCIPSender.contract.RawTransact(opts, calldata) -} - -func (_CCIPSender *CCIPSenderSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _CCIPSender.Contract.Fallback(&_CCIPSender.TransactOpts, calldata) -} - -func (_CCIPSender *CCIPSenderTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _CCIPSender.Contract.Fallback(&_CCIPSender.TransactOpts, calldata) -} - func (_CCIPSender *CCIPSenderTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { return _CCIPSender.contract.RawTransact(opts, nil) } @@ -927,7 +915,7 @@ func (_CCIPSender *CCIPSenderFilterer) ParseOwnershipTransferred(log types.Log) } type SChainConfigs struct { - IsDisabled bool + Disabled bool Recipient []byte ExtraArgsBytes []byte } @@ -991,14 +979,12 @@ type CCIPSenderInterface interface { TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) - Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) - Receive(opts *bind.TransactOpts) (*types.Transaction, error) FilterMessageReceived(opts *bind.FilterOpts) (*CCIPSenderMessageReceivedIterator, error) diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index a25b9a63a5..d8f1e57c05 100644 --- a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go +++ b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go @@ -30,7 +30,7 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseapprovedSenderUpdate struct { +type CCIPClientBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var PingPongDemoMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"forwardingAddress\",\"type\":\"address\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620046af380380620046af833981016040819052620000349162000568565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000144565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013857620001386001600160a01b03821683600019620001ef565b5050505050506200068d565b336001600160a01b038216036200019e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002679190620005a7565b620002739190620005c1565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002cf91869190620002d516565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000324906001600160a01b038516908490620003ab565b805190915015620003a65780806020019051810190620003459190620005e9565b620003a65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003bc8484600085620003c4565b949350505050565b606082471015620004275760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b031685876040516200044591906200063a565b60006040518083038185875af1925050503d806000811462000484576040519150601f19603f3d011682016040523d82523d6000602084013e62000489565b606091505b5090925090506200049d87838387620004a8565b979650505050505050565b606083156200051c57825160000362000514576001600160a01b0385163b620005145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003bc565b620003bc8383815115620005335781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000658565b6001600160a01b03811681146200056557600080fd5b50565b600080604083850312156200057c57600080fd5b825162000589816200054f565b60208401519092506200059c816200054f565b809150509250929050565b600060208284031215620005ba57600080fd5b5051919050565b80820180821115620005e357634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fc57600080fd5b815180151581146200060d57600080fd5b9392505050565b60005b838110156200063157818101518382015260200162000617565b50506000910152565b600082516200064e81846020870162000614565b9190910192915050565b60208152600082518060208401526200067981604085016020870162000614565b601f01601f19169190910160400192915050565b608051613fdc620006d3600039600081816105a50152818161076a015281816108080152818161137101528181611de801528181611eb10152611f930152613fdc6000f3fe6080604052600436106101dc5760003560e01c80636939cd9711610102578063b187bd2611610095578063d8469e4011610064578063d8469e401461066a578063e89b44851461068a578063f2fde38b1461069d578063ff2deec3146106bd576101e3565b8063b187bd26146105c9578063b5a1101114610601578063bee518a414610621578063cf6730f81461064a576101e3565b806385572ffb116100d157806385572ffb1461052b5780638da5cb5b1461054b5780639d2aede514610576578063b0f479a114610596576101e3565b80636939cd97146104805780636fef519e146104ad57806379ba5097146104f65780638462a2b91461050b576101e3565b80632b6e5d631161017a5780635075a9d4116101495780635075a9d4146103f257806352f813c314610420578063536c6bfa146104405780635e35359e14610460576101e3565b80632b6e5d631461032b57806335f170ef14610383578063369f7f66146103b257806341eade46146103d2576101e3565b806316c38b3c116101b657806316c38b3c14610287578063181f5a77146102a75780631892b906146102f65780632874d8bf14610316576101e3565b806305bfe982146101f15780630e958d6b1461023757806311e85dff14610267576101e3565b366101e357005b3480156101ef57600080fd5b005b3480156101fd57600080fd5b5061022161020c366004612e72565b60086020526000908152604090205460ff1681565b60405161022e9190612e8b565b60405180910390f35b34801561024357600080fd5b50610257610252366004612f2b565b6106ef565b604051901515815260200161022e565b34801561027357600080fd5b506101ef610282366004612fa2565b61073a565b34801561029357600080fd5b506101ef6102a2366004612fcd565b6108ca565b3480156102b357600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022e9190613058565b34801561030257600080fd5b506101ef61031136600461306b565b610924565b34801561032257600080fd5b506101ef610967565b34801561033757600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022e565b34801561038f57600080fd5b506103a361039e36600461306b565b6109a3565b60405161022e93929190613088565b3480156103be57600080fd5b506101ef6103cd3660046130bf565b610ada565b3480156103de57600080fd5b506101ef6103ed36600461306b565b610d95565b3480156103fe57600080fd5b5061041261040d366004612e72565b610de0565b60405190815260200161022e565b34801561042c57600080fd5b506101ef61043b366004612fcd565b610df3565b34801561044c57600080fd5b506101ef61045b3660046130ef565b610e2c565b34801561046c57600080fd5b506101ef61047b36600461311b565b610e42565b34801561048c57600080fd5b506104a061049b366004612e72565b610e70565b60405161022e91906131b9565b3480156104b957600080fd5b506102e96040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561050257600080fd5b506101ef61107b565b34801561051757600080fd5b506101ef61052636600461329b565b611178565b34801561053757600080fd5b506101ef610546366004613307565b611359565b34801561055757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661035e565b34801561058257600080fd5b506101ef610591366004612fa2565b611654565b3480156105a257600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061035e565b3480156105d557600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff16610257565b34801561060d57600080fd5b506101ef61061c366004613342565b61170e565b34801561062d57600080fd5b5060095460405167ffffffffffffffff909116815260200161022e565b34801561065657600080fd5b506101ef610665366004613307565b611881565b34801561067657600080fd5b506101ef610685366004613370565b611a6e565b610412610698366004613528565b611aed565b3480156106a957600080fd5b506101ef6106b8366004612fa2565b6120a1565b3480156106c957600080fd5b5060075461035e90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071e9085908590613635565b9081526040519081900360200190205460ff1690509392505050565b6107426120b5565b600754610100900473ffffffffffffffffffffffffffffffffffffffff16156107af576107af7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000612136565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff8516179094559290910416901561086c5761086c7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612336565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108d26120b5565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b61092c6120b5565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61096f6120b5565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556109a1600161243a565b565b6002602052600090815260409020805460018201805460ff90921692916109c990613645565b80601f01602080910402602001604051908101604052809291908181526020018280546109f590613645565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b505050505090806002018054610a5790613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8390613645565b8015610ad05780601f10610aa557610100808354040283529160200191610ad0565b820191906000526020600020905b815481529060010190602001808311610ab357829003601f168201915b5050505050905083565b610ae26120b5565b6001610aef600484612547565b14610b2e576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b3e8260005b6004919061255a565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610b8690613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb290613645565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b50505050508152602001600382018054610c1890613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4490613645565b8015610c915780601f10610c6657610100808354040283529160200191610c91565b820191906000526020600020905b815481529060010190602001808311610c7457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d145760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cbf565b505050915250506040805173ffffffffffffffffffffffffffffffffffffffff85166020820152919250610d599183910160405160208183030381529060405261256f565b610d6460048461260e565b5060405183907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a2505050565b610d9d6120b5565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610ded600483612547565b92915050565b610dfb6120b5565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610e346120b5565b610e3e828261261a565b5050565b610e4a6120b5565b610e6b73ffffffffffffffffffffffffffffffffffffffff84168383612774565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610edf90613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0b90613645565b8015610f585780601f10610f2d57610100808354040283529160200191610f58565b820191906000526020600020905b815481529060010190602001808311610f3b57829003601f168201915b50505050508152602001600382018054610f7190613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9d90613645565b8015610fea5780601f10610fbf57610100808354040283529160200191610fea565b820191906000526020600020905b815481529060010190602001808311610fcd57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611018565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b25565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111806120b5565b60005b8181101561126357600260008484848181106111a1576111a1613698565b90506020028101906111b391906136c7565b6111c190602081019061306b565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111f8576111f8613698565b905060200281019061120a91906136c7565b611218906020810190613705565b604051611226929190613635565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611183565b5060005b838110156113525760016002600087878581811061128757611287613698565b905060200281019061129991906136c7565b6112a790602081019061306b565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112de576112de613698565b90506020028101906112f091906136c7565b6112fe906020810190613705565b60405161130c929190613635565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611267565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113ca576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b25565b6113da604082016020830161306b565b6113e76040830183613705565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611445925084915061376a565b9081526040519081900360200190205460ff1661149057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b259190613058565b6114a0604084016020850161306b565b67ffffffffffffffff811660009081526002602052604090206001810180546114c890613645565b159050806114d75750805460ff165b1561151a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b25565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061155690889060040161387e565b600060405180830381600087803b15801561157057600080fd5b505af1925050508015611581575060015b611621573d8080156115af576040519150601f19603f3d011682016040523d82523d6000602084013e6115b4565b606091505b506115c186356001610b35565b508535600090815260036020526040902086906115de8282613c50565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611613908490613058565b60405180910390a250611352565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165c6120b5565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610e3e9082613d4a565b6117166120b5565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d19161376a565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610e6b9082613d4a565b3330146118ba576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118ca604082016020830161306b565b6118d76040830183613705565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611935925084915061376a565b9081526040519081900360200190205460ff1661198057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b259190613058565b611990604084016020850161306b565b67ffffffffffffffff811660009081526002602052604090206001810180546119b890613645565b159050806119c75750805460ff165b15611a0a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b25565b6000611a196060870187613705565b810190611a269190612e72565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6657611a66611a61826001613e64565b61243a565b505050505050565b611a766120b5565b67ffffffffffffffff8516600090815260026020526040902060018101611a9e8587836139d4565b508115611ab65760028101611ab48385836139d4565b505b805460ff1615611a665780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611b1990613645565b15905080611b285750805460ff165b15611b6b576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b25565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611b9e90613645565b80601f0160208091040260200160405190810160405280929190818152602001828054611bca90613645565b8015611c175780601f10611bec57610100808354040283529160200191611c17565b820191906000526020600020905b815481529060010190602001808311611bfa57829003601f168201915b5050509183525050602080820188905260408083018a9052600754610100900473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611c7b90613645565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca790613645565b8015611cf45780601f10611cc957610100808354040283529160200191611cf4565b820191906000526020600020905b815481529060010190602001808311611cd757829003601f168201915b5050505050815250905060005b8651811015611e7057611d713330898481518110611d2157611d21613698565b6020026020010151602001518a8581518110611d3f57611d3f613698565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127ca909392919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16878281518110611dbc57611dbc613698565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611e6857611e687f0000000000000000000000000000000000000000000000000000000000000000888381518110611e1957611e19613698565b602002602001015160200151898481518110611e3757611e37613698565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123369092919063ffffffff16565b600101611d01565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611ee8908b908690600401613e77565b602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190613f3a565b600754909150610100900473ffffffffffffffffffffffffffffffffffffffff1615611f7957600754611f7990610100900473ffffffffffffffffffffffffffffffffffffffff163330846127ca565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615611fce576000611fd0565b825b8a856040518463ffffffff1660e01b8152600401611fef929190613e77565b60206040518083038185885af115801561200d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120329190613f3a565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6120a96120b5565b6120b281612828565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b25565b8015806121d657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d49190613f3a565b155b612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b25565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610e6b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261291d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156123ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d19190613f3a565b6123db9190613e64565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506124349085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016122b4565b50505050565b8060011660010361247d576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16124b1565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b6000816040516020016124c691815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610e6b9267ffffffffffffffff90911691612540565b60408051808201909152600080825260208201528152602001906001900390816125195790505b5083611aed565b60006125538383612a29565b9392505050565b6000612567848484612ab3565b949350505050565b6000818060200190518101906125859190613f53565b905060005b836080015151811015612434576000846080015182815181106125af576125af613698565b60200260200101516020015190506000856080015183815181106125d5576125d5613698565b602090810291909101015151905061260473ffffffffffffffffffffffffffffffffffffffff82168584612774565b505060010161258a565b60006125538383612ad0565b80471015612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b25565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146126de576040519150601f19603f3d011682016040523d82523d6000602084013e6126e3565b606091505b5050905080610e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b25565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610e6b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016122b4565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526124349085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016122b4565b3373ffffffffffffffffffffffffffffffffffffffff8216036128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b25565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061297f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aed9092919063ffffffff16565b805190915015610e6b578080602001905181019061299d9190613f70565b610e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b25565b600081815260028301602052604081205480151580612a4d5750612a4d8484612afc565b612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b25565b600082815260028401602052604081208290556125678484612b08565b600081815260028301602052604081208190556125538383612b14565b60606125678484600085612b20565b60006125538383612c39565b60006125538383612c51565b60006125538383612ca0565b606082471015612bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b25565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612bdb919061376a565b60006040518083038185875af1925050503d8060008114612c18576040519150601f19603f3d011682016040523d82523d6000602084013e612c1d565b606091505b5091509150612c2e87838387612d93565b979650505050505050565b60008181526001830160205260408120541515612553565b6000818152600183016020526040812054612c9857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ded565b506000610ded565b60008181526001830160205260408120548015612d89576000612cc4600183613f8d565b8554909150600090612cd890600190613f8d565b9050818114612d3d576000866000018281548110612cf857612cf8613698565b9060005260206000200154905080876000018481548110612d1b57612d1b613698565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d4e57612d4e613fa0565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ded565b6000915050610ded565b60608315612e29578251600003612e225773ffffffffffffffffffffffffffffffffffffffff85163b612e22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b25565b5081612567565b6125678383815115612e3e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b259190613058565b600060208284031215612e8457600080fd5b5035919050565b6020810160038310612ec6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146120b257600080fd5b60008083601f840112612ef457600080fd5b50813567ffffffffffffffff811115612f0c57600080fd5b602083019150836020828501011115612f2457600080fd5b9250929050565b600080600060408486031215612f4057600080fd5b8335612f4b81612ecc565b9250602084013567ffffffffffffffff811115612f6757600080fd5b612f7386828701612ee2565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146120b257600080fd5b600060208284031215612fb457600080fd5b813561255381612f80565b80151581146120b257600080fd5b600060208284031215612fdf57600080fd5b813561255381612fbf565b60005b83811015613005578181015183820152602001612fed565b50506000910152565b60008151808452613026816020860160208601612fea565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612553602083018461300e565b60006020828403121561307d57600080fd5b813561255381612ecc565b83151581526060602082015260006130a3606083018561300e565b82810360408401526130b5818561300e565b9695505050505050565b600080604083850312156130d257600080fd5b8235915060208301356130e481612f80565b809150509250929050565b6000806040838503121561310257600080fd5b823561310d81612f80565b946020939093013593505050565b60008060006060848603121561313057600080fd5b833561313b81612f80565b9250602084013561314b81612f80565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156131ae578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613171565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526131f360c084018261300e565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261322f838361300e565b925060808601519150808584030160a08601525061324d828261315c565b95945050505050565b60008083601f84011261326857600080fd5b50813567ffffffffffffffff81111561328057600080fd5b6020830191508360208260051b8501011115612f2457600080fd5b600080600080604085870312156132b157600080fd5b843567ffffffffffffffff808211156132c957600080fd5b6132d588838901613256565b909650945060208701359150808211156132ee57600080fd5b506132fb87828801613256565b95989497509550505050565b60006020828403121561331957600080fd5b813567ffffffffffffffff81111561333057600080fd5b820160a0818503121561255357600080fd5b6000806040838503121561335557600080fd5b823561336081612ecc565b915060208301356130e481612f80565b60008060008060006060868803121561338857600080fd5b853561339381612ecc565b9450602086013567ffffffffffffffff808211156133b057600080fd5b6133bc89838a01612ee2565b909650945060408801359150808211156133d557600080fd5b506133e288828901612ee2565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613445576134456133f3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613492576134926133f3565b604052919050565b600082601f8301126134ab57600080fd5b813567ffffffffffffffff8111156134c5576134c56133f3565b6134f660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161344b565b81815284602083860101111561350b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561353d57600080fd5b833561354881612ecc565b925060208481013567ffffffffffffffff8082111561356657600080fd5b818701915087601f83011261357a57600080fd5b81358181111561358c5761358c6133f3565b61359a848260051b0161344b565b81815260069190911b8301840190848101908a8311156135b957600080fd5b938501935b82851015613605576040858c0312156135d75760008081fd5b6135df613422565b85356135ea81612f80565b815285870135878201528252604090940193908501906135be565b96505050604087013592508083111561361d57600080fd5b505061362b8682870161349a565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061365957607f821691505b602082108103613692577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126136fb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261373a57600080fd5b83018035915067ffffffffffffffff82111561375557600080fd5b602001915036819003821315612f2457600080fd5b600082516136fb818460208701612fea565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137b157600080fd5b830160208101925035905067ffffffffffffffff8111156137d157600080fd5b803603821315612f2457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156131ae57813561384c81612f80565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613839565b60208152813560208201526000602083013561389981612ecc565b67ffffffffffffffff80821660408501526138b7604086018661377c565b925060a060608601526138ce60c0860184836137e0565b9250506138de606086018661377c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526139148583856137e0565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261394d57600080fd5b6020928801928301923591508382111561396657600080fd5b8160061b360383131561397857600080fd5b8685030160a0870152612c2e848284613829565b601f821115610e6b576000816000526020600020601f850160051c810160208610156139b55750805b601f850160051c820191505b81811015611a66578281556001016139c1565b67ffffffffffffffff8311156139ec576139ec6133f3565b613a00836139fa8354613645565b8361398c565b6000601f841160018114613a525760008515613a1c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611352565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613aa15786850135825560209485019460019092019101613a81565b5086821015613adc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b2881612f80565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613b8e57613b8e6133f3565b805483825580841015613c1b5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613bcf57613bcf613aee565b8086168614613be057613be0613aee565b5060008360005260206000208360011b81018760011b820191505b80821015613c16578282558284830155600282019150613bfb565b505050505b5060008181526020812083915b85811015611a6657613c3a8383613b1d565b6040929092019160029190910190600101613c28565b81358155600181016020830135613c6681612ecc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613ca66040860186613705565b93509150613cb88383600287016139d4565b613cc56060860186613705565b93509150613cd78383600387016139d4565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d0e57600080fd5b918401918235915080821115613d2357600080fd5b506020820191508060061b3603821315613d3c57600080fd5b612434818360048601613b75565b815167ffffffffffffffff811115613d6457613d646133f3565b613d7881613d728454613645565b8461398c565b602080601f831160018114613dcb5760008415613d955750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a66565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e1857888601518255948401946001909101908401613df9565b5085821015613e5457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610ded57610ded613aee565b67ffffffffffffffff83168152604060208201526000825160a06040840152613ea360e084018261300e565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613edf838361300e565b92506040860151915080858403016080860152613efc838361315c565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506130b5828261300e565b600060208284031215613f4c57600080fd5b5051919050565b600060208284031215613f6557600080fd5b815161255381612f80565b600060208284031215613f8257600080fd5b815161255381612fbf565b81810381811115610ded57610ded613aee565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620046b7380380620046b7833981016040819052620000349162000563565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c4816200013f565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013357620001336001600160a01b03821683600019620001ea565b50505050505062000688565b336001600160a01b03821603620001995760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002629190620005a2565b6200026e9190620005bc565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002ca91869190620002d016565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031f906001600160a01b038516908490620003a6565b805190915015620003a15780806020019051810190620003409190620005e4565b620003a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003b78484600085620003bf565b949350505050565b606082471015620004225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b0316858760405162000440919062000635565b60006040518083038185875af1925050503d80600081146200047f576040519150601f19603f3d011682016040523d82523d6000602084013e62000484565b606091505b5090925090506200049887838387620004a3565b979650505050505050565b60608315620005175782516000036200050f576001600160a01b0385163b6200050f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003b7565b620003b783838151156200052e5781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000653565b6001600160a01b03811681146200056057600080fd5b50565b600080604083850312156200057757600080fd5b825162000584816200054a565b602084015190925062000597816200054a565b809150509250929050565b600060208284031215620005b557600080fd5b5051919050565b80820180821115620005de57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f757600080fd5b815180151581146200060857600080fd5b9392505050565b60005b838110156200062c57818101518382015260200162000612565b50506000910152565b60008251620006498184602087016200060f565b9190910192915050565b6020815260008251806020840152620006748160408501602087016200060f565b601f01601f19169190910160400192915050565b608051613fe9620006ce6000396000818161057e01528181610759015281816107e9015281816113730152818161202b015281816120f401526121cc0152613fe96000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b5a1101111610095578063e4ca875411610064578063e4ca875414610663578063e89b448514610683578063f2fde38b14610696578063ff2deec3146106b657600080fd5b8063b5a11011146105da578063bee518a4146105fa578063cf6730f814610623578063d8469e401461064357600080fd5b80638da5cb5b116100d15780638da5cb5b146105245780639d2aede51461054f578063b0f479a11461056f578063b187bd26146105a257600080fd5b80636fef519e1461048657806379ba5097146104cf5780638462a2b9146104e457806385572ffb1461050457600080fd5b80632b6e5d631161017a5780635075a9d4116101495780635075a9d4146103eb578063536c6bfa146104195780635e35359e146104395780636939cd971461045957600080fd5b80632b6e5d631461032457806335f170ef1461037c5780633a998eaf146103ab57806341eade46146103cb57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004612ede565b60086020526000908152604090205460ff1681565b6040516102259190612ef7565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612f97565b6106e3565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e61027936600461300e565b61072e565b005b34801561028c57600080fd5b5061027e61029b366004613039565b6108a6565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906130c4565b3480156102fb57600080fd5b5061027e61030a3660046130d7565b610900565b34801561031b57600080fd5b5061027e610943565b34801561033057600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046130d7565b61097f565b604051610225939291906130f4565b3480156103b757600080fd5b5061027e6103c636600461312b565b610ab6565b3480156103d757600080fd5b5061027e6103e63660046130d7565b610dd0565b3480156103f757600080fd5b5061040b610406366004612ede565b610e1b565b604051908152602001610225565b34801561042557600080fd5b5061027e61043436600461315b565b610e2e565b34801561044557600080fd5b5061027e610454366004613187565b610e44565b34801561046557600080fd5b50610479610474366004612ede565b610e72565b6040516102259190613225565b34801561049257600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104db57600080fd5b5061027e61107d565b3480156104f057600080fd5b5061027e6104ff366004613307565b61117a565b34801561051057600080fd5b5061027e61051f366004613373565b61135b565b34801561053057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055b57600080fd5b5061027e61056a36600461300e565b611656565b34801561057b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156105ae57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105e657600080fd5b5061027e6105f53660046133ae565b611710565b34801561060657600080fd5b5060095460405167ffffffffffffffff9091168152602001610225565b34801561062f57600080fd5b5061027e61063e366004613373565b611883565b34801561064f57600080fd5b5061027e61065e3660046133dc565b611a70565b34801561066f57600080fd5b5061027e61067e366004612ede565b611aef565b61040b610691366004613594565b611d50565b3480156106a257600080fd5b5061027e6106b136600461300e565b6122d4565b3480156106c257600080fd5b506007546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071290859085906136a1565b9081526040519081900360200190205460ff1690509392505050565b6107366122e8565b60075473ffffffffffffffffffffffffffffffffffffffff1615610799576107997f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000612369565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610848576108487f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612569565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ae6122e8565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109086122e8565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61094b6122e8565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097d600161266d565b565b6002602052600090815260409020805460018201805460ff90921692916109a5906136b1565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906136b1565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806002018054610a33906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f906136b1565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905083565b610abe6122e8565b6001610acb60048461277a565b14610b0a576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b1a8260025b6004919061278d565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610b62906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8e906136b1565b8015610bdb5780601f10610bb057610100808354040283529160200191610bdb565b820191906000526020600020905b815481529060010190602001808311610bbe57829003601f168201915b50505050508152602001600382018054610bf4906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c20906136b1565b8015610c6d5780601f10610c4257610100808354040283529160200191610c6d565b820191906000526020600020905b815481529060010190602001808311610c5057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610cf05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c9b565b5050505081525050905060005b816080015151811015610d7f57610d778383608001518381518110610d2457610d24613704565b60200260200101516020015184608001518481518110610d4657610d46613704565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127a29092919063ffffffff16565b600101610cfd565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b610dd86122e8565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610e2860048361277a565b92915050565b610e366122e8565b610e4082826127f8565b5050565b610e4c6122e8565b610e6d73ffffffffffffffffffffffffffffffffffffffff841683836127a2565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ee1906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0d906136b1565b8015610f5a5780601f10610f2f57610100808354040283529160200191610f5a565b820191906000526020600020905b815481529060010190602001808311610f3d57829003601f168201915b50505050508152602001600382018054610f73906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9f906136b1565b8015610fec5780601f10610fc157610100808354040283529160200191610fec565b820191906000526020600020905b815481529060010190602001808311610fcf57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161101a565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b01565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111826122e8565b60005b8181101561126557600260008484848181106111a3576111a3613704565b90506020028101906111b59190613733565b6111c39060208101906130d7565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111fa576111fa613704565b905060200281019061120c9190613733565b61121a906020810190613771565b6040516112289291906136a1565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611185565b5060005b838110156113545760016002600087878581811061128957611289613704565b905060200281019061129b9190613733565b6112a99060208101906130d7565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112e0576112e0613704565b90506020028101906112f29190613733565b611300906020810190613771565b60405161130e9291906136a1565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611269565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113cc576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b01565b6113dc60408201602083016130d7565b6113e96040830183613771565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061144792508491506137d6565b9081526040519081900360200190205460ff1661149257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b0191906130c4565b6114a260408401602085016130d7565b67ffffffffffffffff811660009081526002602052604090206001810180546114ca906136b1565b159050806114d95750805460ff165b1561151c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b01565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115589088906004016138ea565b600060405180830381600087803b15801561157257600080fd5b505af1925050508015611583575060015b611623573d8080156115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b506115c386356001610b11565b508535600090815260036020526040902086906115e08282613cbc565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116159084906130c4565b60405180910390a250611354565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165e6122e8565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610e409082613db6565b6117186122e8565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d3916137d6565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610e6d9082613db6565b3330146118bc576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118cc60408201602083016130d7565b6118d96040830183613771565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061193792508491506137d6565b9081526040519081900360200190205460ff1661198257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b0191906130c4565b61199260408401602085016130d7565b67ffffffffffffffff811660009081526002602052604090206001810180546119ba906136b1565b159050806119c95750805460ff165b15611a0c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b01565b6000611a1b6060870187613771565b810190611a289190612ede565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6857611a68611a63826001613ed0565b61266d565b505050505050565b611a786122e8565b67ffffffffffffffff8516600090815260026020526040902060018101611aa0858783613a40565b508115611ab85760028101611ab6838583613a40565b505b805460ff1615611a685780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611afc60048361277a565b14611b36576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b01565b611b41816000610b11565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b89906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb5906136b1565b8015611c025780601f10611bd757610100808354040283529160200191611c02565b820191906000526020600020905b815481529060010190602001808311611be557829003601f168201915b50505050508152602001600382018054611c1b906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c47906136b1565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611d175760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611cc2565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611d7c906136b1565b15905080611d8b5750805460ff165b15611dce576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b01565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e01906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2d906136b1565b8015611e7a5780601f10611e4f57610100808354040283529160200191611e7a565b820191906000526020600020905b815481529060010190602001808311611e5d57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611ed9906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f05906136b1565b8015611f525780601f10611f2757610100808354040283529160200191611f52565b820191906000526020600020905b815481529060010190602001808311611f3557829003601f168201915b5050505050815250905060005b86518110156120b357611fcf3330898481518110611f7f57611f7f613704565b6020026020010151602001518a8581518110611f9d57611f9d613704565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612952909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611fff57611fff613704565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120ab576120ab7f000000000000000000000000000000000000000000000000000000000000000088838151811061205c5761205c613704565b60200260200101516020015189848151811061207a5761207a613704565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125699092919063ffffffff16565b600101611f5f565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded9061212b908b908690600401613ee3565b602060405180830381865afa158015612148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216c9190613fa6565b60075490915073ffffffffffffffffffffffffffffffffffffffff16156121b2576007546121b29073ffffffffffffffffffffffffffffffffffffffff16333084612952565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615612201576000612203565b825b8a856040518463ffffffff1660e01b8152600401612222929190613ee3565b60206040518083038185885af1158015612240573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122659190613fa6565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6122dc6122e8565b6122e5816129b0565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b01565b80158061240957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124079190613fa6565b155b612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b01565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610e6d9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612aa5565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126049190613fa6565b61260e9190613ed0565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506126679085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016124e7565b50505050565b806001166001036126b0576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126e4565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b6000816040516020016126f991815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610e6d9267ffffffffffffffff90911691612773565b604080518082019091526000808252602082015281526020019060019003908161274c5790505b5083611d50565b60006127868383612bb1565b9392505050565b600061279a848484612c3b565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610e6d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124e7565b80471015612862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b01565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146128bc576040519150601f19603f3d011682016040523d82523d6000602084013e6128c1565b606091505b5050905080610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b01565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526126679085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016124e7565b3373ffffffffffffffffffffffffffffffffffffffff821603612a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b01565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b07826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c589092919063ffffffff16565b805190915015610e6d5780806020019051810190612b259190613fbf565b610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b01565b600081815260028301602052604081205480151580612bd55750612bd58484612c67565b612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b01565b6000828152600284016020526040812082905561279a8484612c73565b606061279a8484600085612c7f565b60006127868383612d98565b60006127868383612db0565b606082471015612d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b01565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d3a91906137d6565b60006040518083038185875af1925050503d8060008114612d77576040519150601f19603f3d011682016040523d82523d6000602084013e612d7c565b606091505b5091509150612d8d87838387612dff565b979650505050505050565b60008181526001830160205260408120541515612786565b6000818152600183016020526040812054612df757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e28565b506000610e28565b60608315612e95578251600003612e8e5773ffffffffffffffffffffffffffffffffffffffff85163b612e8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b01565b508161279a565b61279a8383815115612eaa5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0191906130c4565b600060208284031215612ef057600080fd5b5035919050565b6020810160038310612f32577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146122e557600080fd5b60008083601f840112612f6057600080fd5b50813567ffffffffffffffff811115612f7857600080fd5b602083019150836020828501011115612f9057600080fd5b9250929050565b600080600060408486031215612fac57600080fd5b8335612fb781612f38565b9250602084013567ffffffffffffffff811115612fd357600080fd5b612fdf86828701612f4e565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122e557600080fd5b60006020828403121561302057600080fd5b813561278681612fec565b80151581146122e557600080fd5b60006020828403121561304b57600080fd5b81356127868161302b565b60005b83811015613071578181015183820152602001613059565b50506000910152565b60008151808452613092816020860160208601613056565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612786602083018461307a565b6000602082840312156130e957600080fd5b813561278681612f38565b831515815260606020820152600061310f606083018561307a565b8281036040840152613121818561307a565b9695505050505050565b6000806040838503121561313e57600080fd5b82359150602083013561315081612fec565b809150509250929050565b6000806040838503121561316e57600080fd5b823561317981612fec565b946020939093013593505050565b60008060006060848603121561319c57600080fd5b83356131a781612fec565b925060208401356131b781612fec565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561321a578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016131dd565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261325f60c084018261307a565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261329b838361307a565b925060808601519150808584030160a0860152506132b982826131c8565b95945050505050565b60008083601f8401126132d457600080fd5b50813567ffffffffffffffff8111156132ec57600080fd5b6020830191508360208260051b8501011115612f9057600080fd5b6000806000806040858703121561331d57600080fd5b843567ffffffffffffffff8082111561333557600080fd5b613341888389016132c2565b9096509450602087013591508082111561335a57600080fd5b50613367878288016132c2565b95989497509550505050565b60006020828403121561338557600080fd5b813567ffffffffffffffff81111561339c57600080fd5b820160a0818503121561278657600080fd5b600080604083850312156133c157600080fd5b82356133cc81612f38565b9150602083013561315081612fec565b6000806000806000606086880312156133f457600080fd5b85356133ff81612f38565b9450602086013567ffffffffffffffff8082111561341c57600080fd5b61342889838a01612f4e565b9096509450604088013591508082111561344157600080fd5b5061344e88828901612f4e565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156134b1576134b161345f565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134fe576134fe61345f565b604052919050565b600082601f83011261351757600080fd5b813567ffffffffffffffff8111156135315761353161345f565b61356260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134b7565b81815284602083860101111561357757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156135a957600080fd5b83356135b481612f38565b925060208481013567ffffffffffffffff808211156135d257600080fd5b818701915087601f8301126135e657600080fd5b8135818111156135f8576135f861345f565b613606848260051b016134b7565b81815260069190911b8301840190848101908a83111561362557600080fd5b938501935b82851015613671576040858c0312156136435760008081fd5b61364b61348e565b853561365681612fec565b8152858701358782015282526040909401939085019061362a565b96505050604087013592508083111561368957600080fd5b505061369786828701613506565b9150509250925092565b8183823760009101908152919050565b600181811c908216806136c557607f821691505b6020821081036136fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261376757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137a657600080fd5b83018035915067ffffffffffffffff8211156137c157600080fd5b602001915036819003821315612f9057600080fd5b60008251613767818460208701613056565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261381d57600080fd5b830160208101925035905067ffffffffffffffff81111561383d57600080fd5b803603821315612f9057600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561321a5781356138b881612fec565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016138a5565b60208152813560208201526000602083013561390581612f38565b67ffffffffffffffff808216604085015261392360408601866137e8565b925060a0606086015261393a60c08601848361384c565b92505061394a60608601866137e8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261398085838561384c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126139b957600080fd5b602092880192830192359150838211156139d257600080fd5b8160061b36038313156139e457600080fd5b8685030160a0870152612d8d848284613895565b601f821115610e6d576000816000526020600020601f850160051c81016020861015613a215750805b601f850160051c820191505b81811015611a6857828155600101613a2d565b67ffffffffffffffff831115613a5857613a5861345f565b613a6c83613a6683546136b1565b836139f8565b6000601f841160018114613abe5760008515613a885750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611354565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b0d5786850135825560209485019460019092019101613aed565b5086821015613b48577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b9481612fec565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613bfa57613bfa61345f565b805483825580841015613c875760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613c3b57613c3b613b5a565b8086168614613c4c57613c4c613b5a565b5060008360005260206000208360011b81018760011b820191505b80821015613c82578282558284830155600282019150613c67565b505050505b5060008181526020812083915b85811015611a6857613ca68383613b89565b6040929092019160029190910190600101613c94565b81358155600181016020830135613cd281612f38565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d126040860186613771565b93509150613d24838360028701613a40565b613d316060860186613771565b93509150613d43838360038701613a40565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d7a57600080fd5b918401918235915080821115613d8f57600080fd5b506020820191508060061b3603821315613da857600080fd5b612667818360048601613be1565b815167ffffffffffffffff811115613dd057613dd061345f565b613de481613dde84546136b1565b846139f8565b602080601f831160018114613e375760008415613e015750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a68565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e8457888601518255948401946001909101908401613e65565b5085821015613ec057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610e2857610e28613b5a565b67ffffffffffffffff83168152604060208201526000825160a06040840152613f0f60e084018261307a565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613f4b838361307a565b92506040860151915080858403016080860152613f6883836131c8565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613121828261307a565b600060208284031215613fb857600080fd5b5051919050565b600060208284031215613fd157600080fd5b81516127868161302b56fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -398,7 +398,7 @@ func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, arg0 return *outstruct, err } - outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Disabled = *abi.ConvertType(out[0], new(bool)).(*bool) outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) @@ -484,6 +484,18 @@ func (_PingPongDemo *PingPongDemoCallerSession) TypeAndVersion() (string, error) return _PingPongDemo.Contract.TypeAndVersion(&_PingPongDemo.CallOpts) } +func (_PingPongDemo *PingPongDemoTransactor) AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "abandonMessage", messageId, receiver) +} + +func (_PingPongDemo *PingPongDemoSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.AbandonMessage(&_PingPongDemo.TransactOpts, messageId, receiver) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.AbandonMessage(&_PingPongDemo.TransactOpts, messageId, receiver) +} + func (_PingPongDemo *PingPongDemoTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "acceptOwnership") } @@ -568,16 +580,16 @@ func (_PingPongDemo *PingPongDemoTransactorSession) ProcessMessage(message Clien return _PingPongDemo.Contract.ProcessMessage(&_PingPongDemo.TransactOpts, message) } -func (_PingPongDemo *PingPongDemoTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "retryFailedMessage", messageId, forwardingAddress) +func (_PingPongDemo *PingPongDemoTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "retryFailedMessage", messageId) } -func (_PingPongDemo *PingPongDemoSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId, forwardingAddress) +func (_PingPongDemo *PingPongDemoSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId) } -func (_PingPongDemo *PingPongDemoTransactorSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId, forwardingAddress) +func (_PingPongDemo *PingPongDemoTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _PingPongDemo.Contract.RetryFailedMessage(&_PingPongDemo.TransactOpts, messageId) } func (_PingPongDemo *PingPongDemoTransactor) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { @@ -628,18 +640,6 @@ func (_PingPongDemo *PingPongDemoTransactorSession) SetPaused(pause bool) (*type return _PingPongDemo.Contract.SetPaused(&_PingPongDemo.TransactOpts, pause) } -func (_PingPongDemo *PingPongDemoTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "setSimRevert", simRevert) -} - -func (_PingPongDemo *PingPongDemoSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetSimRevert(&_PingPongDemo.TransactOpts, simRevert) -} - -func (_PingPongDemo *PingPongDemoTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetSimRevert(&_PingPongDemo.TransactOpts, simRevert) -} - func (_PingPongDemo *PingPongDemoTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "startPingPong") } @@ -664,15 +664,15 @@ func (_PingPongDemo *PingPongDemoTransactorSession) TransferOwnership(to common. return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) } -func (_PingPongDemo *PingPongDemoTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_PingPongDemo *PingPongDemoTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_PingPongDemo *PingPongDemoSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_PingPongDemo *PingPongDemoSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) } -func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) } @@ -700,18 +700,6 @@ func (_PingPongDemo *PingPongDemoTransactorSession) WithdrawTokens(token common. return _PingPongDemo.Contract.WithdrawTokens(&_PingPongDemo.TransactOpts, token, to, amount) } -func (_PingPongDemo *PingPongDemoTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { - return _PingPongDemo.contract.RawTransact(opts, calldata) -} - -func (_PingPongDemo *PingPongDemoSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _PingPongDemo.Contract.Fallback(&_PingPongDemo.TransactOpts, calldata) -} - -func (_PingPongDemo *PingPongDemoTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _PingPongDemo.Contract.Fallback(&_PingPongDemo.TransactOpts, calldata) -} - func (_PingPongDemo *PingPongDemoTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { return _PingPongDemo.contract.RawTransact(opts, nil) } @@ -860,6 +848,134 @@ func (_PingPongDemo *PingPongDemoFilterer) ParseFeeTokenModified(log types.Log) return event, nil } +type PingPongDemoMessageAbandonedIterator struct { + Event *PingPongDemoMessageAbandoned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoMessageAbandonedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoMessageAbandoned) + 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(PingPongDemoMessageAbandoned) + 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 *PingPongDemoMessageAbandonedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoMessageAbandonedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoMessageAbandoned struct { + MessageId [32]byte + TokenReceiver common.Address + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageAbandonedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return &PingPongDemoMessageAbandonedIterator{contract: _PingPongDemo.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAbandoned, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoMessageAbandoned) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageAbandoned", 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 (_PingPongDemo *PingPongDemoFilterer) ParseMessageAbandoned(log types.Log) (*PingPongDemoMessageAbandoned, error) { + event := new(PingPongDemoMessageAbandoned) + if err := _PingPongDemo.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type PingPongDemoMessageAckReceivedIterator struct { Event *PingPongDemoMessageAckReceived @@ -2119,7 +2235,7 @@ func (_PingPongDemo *PingPongDemoFilterer) ParsePong(log types.Log) (*PingPongDe } type SChainConfigs struct { - IsDisabled bool + Disabled bool Recipient []byte ExtraArgsBytes []byte } @@ -2128,6 +2244,8 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, switch log.Topics[0] { case _PingPongDemo.abi.Events["FeeTokenModified"].ID: return _PingPongDemo.ParseFeeTokenModified(log) + case _PingPongDemo.abi.Events["MessageAbandoned"].ID: + return _PingPongDemo.ParseMessageAbandoned(log) case _PingPongDemo.abi.Events["MessageAckReceived"].ID: return _PingPongDemo.ParseMessageAckReceived(log) case _PingPongDemo.abi.Events["MessageAckSent"].ID: @@ -2158,6 +2276,10 @@ func (PingPongDemoFeeTokenModified) Topic() common.Hash { return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") } +func (PingPongDemoMessageAbandoned) Topic() common.Hash { + return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") +} + func (PingPongDemoMessageAckReceived) Topic() common.Hash { return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") } @@ -2231,6 +2353,8 @@ type PingPongDemoInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) + AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) @@ -2245,7 +2369,7 @@ type PingPongDemoInterface interface { ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) @@ -2255,20 +2379,16 @@ type PingPongDemoInterface interface { SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) - SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) - StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) - Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) - Receive(opts *bind.TransactOpts) (*types.Transaction, error) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenModifiedIterator, error) @@ -2277,6 +2397,12 @@ type PingPongDemoInterface interface { ParseFeeTokenModified(log types.Log) (*PingPongDemoFeeTokenModified, error) + FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageAbandonedIterator, error) + + WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAbandoned, messageId [][32]byte) (event.Subscription, error) + + ParseMessageAbandoned(log types.Log) (*PingPongDemoMessageAbandoned, error) + FilterMessageAckReceived(opts *bind.FilterOpts) (*PingPongDemoMessageAckReceivedIterator, error) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAckReceived) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go index fa7a6129a1..148996927d 100644 --- a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go +++ b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go @@ -30,7 +30,7 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseapprovedSenderUpdate struct { +type CCIPClientBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var SelfFundedPingPongMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"forwardingAddress\",\"type\":\"address\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isDisabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"simRevert\",\"type\":\"bool\"}],\"name\":\"setSimRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.approvedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162004c1338038062004c13833981016040819052620000349162000596565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000172565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0390811660805260078054610100600160a81b0319166101009285169283021790551590506200013a576200013a6001600160a01b038216836000196200021d565b5050505050508060026200014f919062000605565b6009601d6101000a81548160ff021916908360ff16021790555050505062000705565b336001600160a01b03821603620001cc5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029591906200062b565b620002a1919062000645565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002fd918691906200030316565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000352906001600160a01b038516908490620003d9565b805190915015620003d4578080602001905181019062000373919062000661565b620003d45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003ea8484600085620003f2565b949350505050565b606082471015620004555760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004739190620006b2565b60006040518083038185875af1925050503d8060008114620004b2576040519150601f19603f3d011682016040523d82523d6000602084013e620004b7565b606091505b509092509050620004cb87838387620004d6565b979650505050505050565b606083156200054a57825160000362000542576001600160a01b0385163b620005425760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003ea565b620003ea8383815115620005615781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006d0565b6001600160a01b03811681146200059357600080fd5b50565b600080600060608486031215620005ac57600080fd5b8351620005b9816200057d565b6020850151909350620005cc816200057d565b604085015190925060ff81168114620005e457600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff8181168382160290811690818114620006245762000624620005ef565b5092915050565b6000602082840312156200063e57600080fd5b5051919050565b808201808211156200065b576200065b620005ef565b92915050565b6000602082840312156200067457600080fd5b815180151581146200068557600080fd5b9392505050565b60005b83811015620006a95781810151838201526020016200068f565b50506000910152565b60008251620006c68184602087016200068c565b9190910192915050565b6020815260008251806020840152620006f18160408501602087016200068c565b601f01601f19169190910160400192915050565b6080516144ba620007596000396000818161060d01528181610838015281816108d60152818161143f015281816117bd0152818161209a0152818161216301528181612245015261294201526144ba6000f3fe60806040526004361061021d5760003560e01c806379ba50971161011d578063b5a11011116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461074b578063f2fde38b1461076b578063ff2deec31461078b57610224565b8063e6c725f5146106f2578063e89b44851461073857610224565b8063b5a1101114610669578063bee518a414610689578063cf6730f8146106b2578063d8469e40146106d257610224565b80638f491cba116100ec5780638f491cba146105be5780639d2aede5146105de578063b0f479a1146105fe578063b187bd261461063157610224565b806379ba50971461053e5780638462a2b91461055357806385572ffb146105735780638da5cb5b1461059357610224565b806335f170ef116101b057806352f813c31161017f5780635e35359e116101645780635e35359e146104a85780636939cd97146104c85780636fef519e146104f557610224565b806352f813c314610468578063536c6bfa1461048857610224565b806335f170ef146103cb578063369f7f66146103fa57806341eade461461041a5780635075a9d41461043a57610224565b8063181f5a77116101ec578063181f5a77146102e85780631892b9061461033e5780632874d8bf1461035e5780632b6e5d631461037357610224565b806305bfe982146102325780630e958d6b1461027857806311e85dff146102a857806316c38b3c146102c857610224565b3661022457005b34801561023057600080fd5b005b34801561023e57600080fd5b5061026261024d3660046132f2565b60086020526000908152604090205460ff1681565b60405161026f919061330b565b60405180910390f35b34801561028457600080fd5b506102986102933660046133ab565b6107bd565b604051901515815260200161026f565b3480156102b457600080fd5b506102306102c3366004613422565b610808565b3480156102d457600080fd5b506102306102e336600461344d565b610998565b3480156102f457600080fd5b506103316040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161026f91906134d8565b34801561034a57600080fd5b506102306103593660046134eb565b6109f2565b34801561036a57600080fd5b50610230610a35565b34801561037f57600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161026f565b3480156103d757600080fd5b506103eb6103e63660046134eb565b610a71565b60405161026f93929190613508565b34801561040657600080fd5b5061023061041536600461353f565b610ba8565b34801561042657600080fd5b506102306104353660046134eb565b610e63565b34801561044657600080fd5b5061045a6104553660046132f2565b610eae565b60405190815260200161026f565b34801561047457600080fd5b5061023061048336600461344d565b610ec1565b34801561049457600080fd5b506102306104a336600461356f565b610efa565b3480156104b457600080fd5b506102306104c336600461359b565b610f10565b3480156104d457600080fd5b506104e86104e33660046132f2565b610f3e565b60405161026f9190613639565b34801561050157600080fd5b506103316040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561054a57600080fd5b50610230611149565b34801561055f57600080fd5b5061023061056e36600461371b565b611246565b34801561057f57600080fd5b5061023061058e366004613787565b611427565b34801561059f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166103a6565b3480156105ca57600080fd5b506102306105d93660046132f2565b611722565b3480156105ea57600080fd5b506102306105f9366004613422565b611906565b34801561060a57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103a6565b34801561063d57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff16610298565b34801561067557600080fd5b506102306106843660046137c2565b6119c0565b34801561069557600080fd5b5060095460405167ffffffffffffffff909116815260200161026f565b3480156106be57600080fd5b506102306106cd366004613787565b611b33565b3480156106de57600080fd5b506102306106ed3660046137f0565b611d20565b3480156106fe57600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161026f565b61045a6107463660046139a8565b611d9f565b34801561075757600080fd5b50610230610766366004613ab5565b612353565b34801561077757600080fd5b50610230610786366004613422565b6123e4565b34801561079757600080fd5b506007546103a690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107ec9085908590613ad8565b9081526040519081900360200190205460ff1690509392505050565b6108106123f5565b600754610100900473ffffffffffffffffffffffffffffffffffffffff161561087d5761087d7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16906000612476565b6007805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff8516179094559290910416901561093a5761093a7f0000000000000000000000000000000000000000000000000000000000000000600754610100900473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612676565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6109a06123f5565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109fa6123f5565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a3d6123f5565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a6f600161277a565b565b6002602052600090815260409020805460018201805460ff9092169291610a9790613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac390613ae8565b8015610b105780601f10610ae557610100808354040283529160200191610b10565b820191906000526020600020905b815481529060010190602001808311610af357829003601f168201915b505050505090806002018054610b2590613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5190613ae8565b8015610b9e5780601f10610b7357610100808354040283529160200191610b9e565b820191906000526020600020905b815481529060010190602001808311610b8157829003601f168201915b5050505050905083565b610bb06123f5565b6001610bbd6004846129c7565b14610bfc576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c0c8260005b600491906129da565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c5490613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8090613ae8565b8015610ccd5780601f10610ca257610100808354040283529160200191610ccd565b820191906000526020600020905b815481529060010190602001808311610cb057829003601f168201915b50505050508152602001600382018054610ce690613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1290613ae8565b8015610d5f5780601f10610d3457610100808354040283529160200191610d5f565b820191906000526020600020905b815481529060010190602001808311610d4257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610de25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d8d565b505050915250506040805173ffffffffffffffffffffffffffffffffffffffff85166020820152919250610e27918391016040516020818303038152906040526129ef565b610e32600484612a8e565b5060405183907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a2505050565b610e6b6123f5565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610ebb6004836129c7565b92915050565b610ec96123f5565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610f026123f5565b610f0c8282612a9a565b5050565b610f186123f5565b610f3973ffffffffffffffffffffffffffffffffffffffff84168383612bf4565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610fad90613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd990613ae8565b80156110265780601f10610ffb57610100808354040283529160200191611026565b820191906000526020600020905b81548152906001019060200180831161100957829003601f168201915b5050505050815260200160038201805461103f90613ae8565b80601f016020809104026020016040519081016040528092919081815260200182805461106b90613ae8565b80156110b85780601f1061108d576101008083540402835291602001916110b8565b820191906000526020600020905b81548152906001019060200180831161109b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561113b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016110e6565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610bf3565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61124e6123f5565b60005b81811015611331576002600084848481811061126f5761126f613b3b565b90506020028101906112819190613b6a565b61128f9060208101906134eb565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c6576112c6613b3b565b90506020028101906112d89190613b6a565b6112e6906020810190613ba8565b6040516112f4929190613ad8565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611251565b5060005b838110156114205760016002600087878581811061135557611355613b3b565b90506020028101906113679190613b6a565b6113759060208101906134eb565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ac576113ac613b3b565b90506020028101906113be9190613b6a565b6113cc906020810190613ba8565b6040516113da929190613ad8565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611335565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611498576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610bf3565b6114a860408201602083016134eb565b6114b56040830183613ba8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115139250849150613c0d565b9081526040519081900360200190205460ff1661155e57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bf391906134d8565b61156e60408401602085016134eb565b67ffffffffffffffff8116600090815260026020526040902060018101805461159690613ae8565b159050806115a55750805460ff165b156115e8576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bf3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611624908890600401613d21565b600060405180830381600087803b15801561163e57600080fd5b505af192505050801561164f575060015b6116ef573d80801561167d576040519150601f19603f3d011682016040523d82523d6000602084013e611682565b606091505b5061168f86356001610c03565b508535600090815260036020526040902086906116ac82826140f3565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e19084906134d8565b60405180910390a250611420565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177a57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117825750565b6009546001906117b6907d010000000000000000000000000000000000000000000000000000000000900460ff16836141ed565b11611903577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187a9190614228565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c157600080fd5b505af11580156118d5573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b61190e6123f5565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610f0c9082614245565b6119c86123f5565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8391613c0d565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610f399082614245565b333014611b6c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7c60408201602083016134eb565b611b896040830183613ba8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be79250849150613c0d565b9081526040519081900360200190205460ff16611c3257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bf391906134d8565b611c4260408401602085016134eb565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6a90613ae8565b15905080611c795750805460ff165b15611cbc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bf3565b6000611ccb6060870187613ba8565b810190611cd891906132f2565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1857611d18611d1382600161435f565b61277a565b505050505050565b611d286123f5565b67ffffffffffffffff8516600090815260026020526040902060018101611d50858783613e77565b508115611d685760028101611d66838583613e77565b505b805460ff1615611d185780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611dcb90613ae8565b15905080611dda5750805460ff165b15611e1d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bf3565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e5090613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7c90613ae8565b8015611ec95780601f10611e9e57610100808354040283529160200191611ec9565b820191906000526020600020905b815481529060010190602001808311611eac57829003601f168201915b5050509183525050602080820188905260408083018a9052600754610100900473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611f2d90613ae8565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5990613ae8565b8015611fa65780601f10611f7b57610100808354040283529160200191611fa6565b820191906000526020600020905b815481529060010190602001808311611f8957829003601f168201915b5050505050815250905060005b8651811015612122576120233330898481518110611fd357611fd3613b3b565b6020026020010151602001518a8581518110611ff157611ff1613b3b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c4a909392919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1687828151811061206e5761206e613b3b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461211a5761211a7f00000000000000000000000000000000000000000000000000000000000000008883815181106120cb576120cb613b3b565b6020026020010151602001518984815181106120e9576120e9613b3b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166126769092919063ffffffff16565b600101611fb3565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded9061219a908b908690600401614372565b602060405180830381865afa1580156121b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121db9190614435565b600754909150610100900473ffffffffffffffffffffffffffffffffffffffff161561222b5760075461222b90610100900473ffffffffffffffffffffffffffffffffffffffff16333084612c4a565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9916101009091041615612280576000612282565b825b8a856040518463ffffffff1660e01b81526004016122a1929190614372565b60206040518083038185885af11580156122bf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122e49190614435565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61235b6123f5565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b6123ec6123f5565b61190381612ca8565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bf3565b80158061251657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125149190614435565b155b6125a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610bf3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610f399084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612d9d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127119190614435565b61271b919061435f565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506127749085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016125f4565b50505050565b806001166001036127bd576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16127f1565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b6127fa81611722565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161285e91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156128d857816020015b60408051808201909152600080825260208201528152602001906001900390816128b15790505b50815260075473ffffffffffffffffffffffffffffffffffffffff6101009091048116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f9916129849167ffffffffffffffff909116908590600401614372565b6020604051808303816000875af11580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f399190614435565b60006129d38383612ea9565b9392505050565b60006129e7848484612f33565b949350505050565b600081806020019051810190612a059190614228565b905060005b83608001515181101561277457600084608001518281518110612a2f57612a2f613b3b565b6020026020010151602001519050600085608001518381518110612a5557612a55613b3b565b6020908102919091010151519050612a8473ffffffffffffffffffffffffffffffffffffffff82168584612bf4565b5050600101612a0a565b60006129d38383612f50565b80471015612b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bf3565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612b5e576040519150601f19603f3d011682016040523d82523d6000602084013e612b63565b606091505b5050905080610f39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bf3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610f399084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016125f4565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526127749085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016125f4565b3373ffffffffffffffffffffffffffffffffffffffff821603612d27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bf3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612dff826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612f6d9092919063ffffffff16565b805190915015610f395780806020019051810190612e1d919061444e565b610f39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bf3565b600081815260028301602052604081205480151580612ecd5750612ecd8484612f7c565b6129d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610bf3565b600082815260028401602052604081208290556129e78484612f88565b600081815260028301602052604081208190556129d38383612f94565b60606129e78484600085612fa0565b60006129d383836130b9565b60006129d383836130d1565b60006129d38383613120565b606082471015613032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bf3565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161305b9190613c0d565b60006040518083038185875af1925050503d8060008114613098576040519150601f19603f3d011682016040523d82523d6000602084013e61309d565b606091505b50915091506130ae87838387613213565b979650505050505050565b600081815260018301602052604081205415156129d3565b600081815260018301602052604081205461311857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ebb565b506000610ebb565b6000818152600183016020526040812054801561320957600061314460018361446b565b85549091506000906131589060019061446b565b90508181146131bd57600086600001828154811061317857613178613b3b565b906000526020600020015490508087600001848154811061319b5761319b613b3b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806131ce576131ce61447e565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ebb565b6000915050610ebb565b606083156132a95782516000036132a25773ffffffffffffffffffffffffffffffffffffffff85163b6132a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bf3565b50816129e7565b6129e783838151156132be5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf391906134d8565b60006020828403121561330457600080fd5b5035919050565b6020810160038310613346577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190357600080fd5b60008083601f84011261337457600080fd5b50813567ffffffffffffffff81111561338c57600080fd5b6020830191508360208285010111156133a457600080fd5b9250929050565b6000806000604084860312156133c057600080fd5b83356133cb8161334c565b9250602084013567ffffffffffffffff8111156133e757600080fd5b6133f386828701613362565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190357600080fd5b60006020828403121561343457600080fd5b81356129d381613400565b801515811461190357600080fd5b60006020828403121561345f57600080fd5b81356129d38161343f565b60005b8381101561348557818101518382015260200161346d565b50506000910152565b600081518084526134a681602086016020860161346a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129d3602083018461348e565b6000602082840312156134fd57600080fd5b81356129d38161334c565b8315158152606060208201526000613523606083018561348e565b8281036040840152613535818561348e565b9695505050505050565b6000806040838503121561355257600080fd5b82359150602083013561356481613400565b809150509250929050565b6000806040838503121561358257600080fd5b823561358d81613400565b946020939093013593505050565b6000806000606084860312156135b057600080fd5b83356135bb81613400565b925060208401356135cb81613400565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561362e578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016135f1565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261367360c084018261348e565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136af838361348e565b925060808601519150808584030160a0860152506136cd82826135dc565b95945050505050565b60008083601f8401126136e857600080fd5b50813567ffffffffffffffff81111561370057600080fd5b6020830191508360208260051b85010111156133a457600080fd5b6000806000806040858703121561373157600080fd5b843567ffffffffffffffff8082111561374957600080fd5b613755888389016136d6565b9096509450602087013591508082111561376e57600080fd5b5061377b878288016136d6565b95989497509550505050565b60006020828403121561379957600080fd5b813567ffffffffffffffff8111156137b057600080fd5b820160a081850312156129d357600080fd5b600080604083850312156137d557600080fd5b82356137e08161334c565b9150602083013561356481613400565b60008060008060006060868803121561380857600080fd5b85356138138161334c565b9450602086013567ffffffffffffffff8082111561383057600080fd5b61383c89838a01613362565b9096509450604088013591508082111561385557600080fd5b5061386288828901613362565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156138c5576138c5613873565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561391257613912613873565b604052919050565b600082601f83011261392b57600080fd5b813567ffffffffffffffff81111561394557613945613873565b61397660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016138cb565b81815284602083860101111561398b57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156139bd57600080fd5b83356139c88161334c565b925060208481013567ffffffffffffffff808211156139e657600080fd5b818701915087601f8301126139fa57600080fd5b813581811115613a0c57613a0c613873565b613a1a848260051b016138cb565b81815260069190911b8301840190848101908a831115613a3957600080fd5b938501935b82851015613a85576040858c031215613a575760008081fd5b613a5f6138a2565b8535613a6a81613400565b81528587013587820152825260409094019390850190613a3e565b965050506040870135925080831115613a9d57600080fd5b5050613aab8682870161391a565b9150509250925092565b600060208284031215613ac757600080fd5b813560ff811681146129d357600080fd5b8183823760009101908152919050565b600181811c90821680613afc57607f821691505b602082108103613b35577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613b9e57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613bdd57600080fd5b83018035915067ffffffffffffffff821115613bf857600080fd5b6020019150368190038213156133a457600080fd5b60008251613b9e81846020870161346a565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5457600080fd5b830160208101925035905067ffffffffffffffff811115613c7457600080fd5b8036038213156133a457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561362e578135613cef81613400565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613cdc565b602081528135602082015260006020830135613d3c8161334c565b67ffffffffffffffff8082166040850152613d5a6040860186613c1f565b925060a06060860152613d7160c086018483613c83565b925050613d816060860186613c1f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613db7858385613c83565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613df057600080fd5b60209288019283019235915083821115613e0957600080fd5b8160061b3603831315613e1b57600080fd5b8685030160a08701526130ae848284613ccc565b601f821115610f39576000816000526020600020601f850160051c81016020861015613e585750805b601f850160051c820191505b81811015611d1857828155600101613e64565b67ffffffffffffffff831115613e8f57613e8f613873565b613ea383613e9d8354613ae8565b83613e2f565b6000601f841160018114613ef55760008515613ebf5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611420565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613f445786850135825560209485019460019092019101613f24565b5086821015613f7f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613fcb81613400565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561403157614031613873565b8054838255808410156140be5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461407257614072613f91565b808616861461408357614083613f91565b5060008360005260206000208360011b81018760011b820191505b808210156140b957828255828483015560028201915061409e565b505050505b5060008181526020812083915b85811015611d18576140dd8383613fc0565b60409290920191600291909101906001016140cb565b813581556001810160208301356141098161334c565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141496040860186613ba8565b9350915061415b838360028701613e77565b6141686060860186613ba8565b9350915061417a838360038701613e77565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126141b157600080fd5b9184019182359150808211156141c657600080fd5b506020820191508060061b36038213156141df57600080fd5b612774818360048601614018565b600082614223577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561423a57600080fd5b81516129d381613400565b815167ffffffffffffffff81111561425f5761425f613873565b6142738161426d8454613ae8565b84613e2f565b602080601f8311600181146142c657600084156142905750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d18565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614313578886015182559484019460019091019084016142f4565b508582101561434f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610ebb57610ebb613f91565b67ffffffffffffffff83168152604060208201526000825160a0604084015261439e60e084018261348e565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526143da838361348e565b925060408601519150808584030160808601526143f783836135dc565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613535828261348e565b60006020828403121561444757600080fd5b5051919050565b60006020828403121561446057600080fd5b81516129d38161343f565b81810381811115610ebb57610ebb613f91565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162004c3338038062004c33833981016040819052620000349162000591565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200016d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013557620001356001600160a01b0382168360001962000218565b5050505050508060026200014a919062000600565b6009601d6101000a81548160ff021916908360ff16021790555050505062000700565b336001600160a01b03821603620001c75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000626565b6200029c919062000640565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002f891869190620002fe16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200034d906001600160a01b038516908490620003d4565b805190915015620003cf57808060200190518101906200036e91906200065c565b620003cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003e58484600085620003ed565b949350505050565b606082471015620004505760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200046e9190620006ad565b60006040518083038185875af1925050503d8060008114620004ad576040519150601f19603f3d011682016040523d82523d6000602084013e620004b2565b606091505b509092509050620004c687838387620004d1565b979650505050505050565b60608315620005455782516000036200053d576001600160a01b0385163b6200053d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003e5565b620003e583838151156200055c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006cb565b6001600160a01b03811681146200058e57600080fd5b50565b600080600060608486031215620005a757600080fd5b8351620005b48162000578565b6020850151909350620005c78162000578565b604085015190925060ff81168114620005df57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200061f576200061f620005ea565b5092915050565b6000602082840312156200063957600080fd5b5051919050565b80820180821115620006565762000656620005ea565b92915050565b6000602082840312156200066f57600080fd5b815180151581146200068057600080fd5b9392505050565b60005b83811015620006a45781810151838201526020016200068a565b50506000910152565b60008251620006c181846020870162000687565b9190910192915050565b6020815260008251806020840152620006ec81604085016020870162000687565b601f01601f19169190910160400192915050565b6080516144df62000754600039600081816105e601528181610827015281816108b701528181611441015281816117bf015281816122dd015281816123a60152818161247e0152612b7001526144df6000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e14610744578063f2fde38b14610764578063ff2deec31461078457600080fd5b8063e6c725f5146106eb578063e89b44851461073157600080fd5b8063bee518a414610662578063cf6730f81461068b578063d8469e40146106ab578063e4ca8754146106cb57600080fd5b80639d2aede5116100ec5780639d2aede5146105b7578063b0f479a1146105d7578063b187bd261461060a578063b5a110111461064257600080fd5b80638462a2b91461052c57806385572ffb1461054c5780638da5cb5b1461056c5780638f491cba1461059757600080fd5b806335f170ef116101b0578063536c6bfa1161017f5780636939cd97116101645780636939cd97146104a15780636fef519e146104ce57806379ba50971461051757600080fd5b8063536c6bfa146104615780635e35359e1461048157600080fd5b806335f170ef146103c45780633a998eaf146103f357806341eade46146104135780635075a9d41461043357600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b50610259610244366004613359565b60086020526000908152604090205460ff1681565b6040516102669190613372565b60405180910390f35b34801561027b57600080fd5b5061028f61028a366004613412565b6107b1565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613489565b6107fc565b005b3480156102cd57600080fd5b506102bf6102dc3660046134b4565b610974565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b604051610266919061353f565b34801561034357600080fd5b506102bf610352366004613552565b6109ce565b34801561036357600080fd5b506102bf610a11565b34801561037857600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613552565b610a4d565b6040516102669392919061356f565b3480156103ff57600080fd5b506102bf61040e3660046135a6565b610b84565b34801561041f57600080fd5b506102bf61042e366004613552565b610e9e565b34801561043f57600080fd5b5061045361044e366004613359565b610ee9565b604051908152602001610266565b34801561046d57600080fd5b506102bf61047c3660046135d6565b610efc565b34801561048d57600080fd5b506102bf61049c366004613602565b610f12565b3480156104ad57600080fd5b506104c16104bc366004613359565b610f40565b60405161026691906136a0565b3480156104da57600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052357600080fd5b506102bf61114b565b34801561053857600080fd5b506102bf610547366004613782565b611248565b34801561055857600080fd5b506102bf6105673660046137ee565b611429565b34801561057857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a357600080fd5b506102bf6105b2366004613359565b611724565b3480156105c357600080fd5b506102bf6105d2366004613489565b611908565b3480156105e357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039f565b34801561061657600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064e57600080fd5b506102bf61065d366004613829565b6119c2565b34801561066e57600080fd5b5060095460405167ffffffffffffffff9091168152602001610266565b34801561069757600080fd5b506102bf6106a63660046137ee565b611b35565b3480156106b757600080fd5b506102bf6106c6366004613857565b611d22565b3480156106d757600080fd5b506102bf6106e6366004613359565b611da1565b3480156106f757600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b61045361073f366004613a0f565b612002565b34801561075057600080fd5b506102bf61075f366004613b1c565b612586565b34801561077057600080fd5b506102bf61077f366004613489565b612617565b34801561079057600080fd5b5060075461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107e09085908590613b3f565b9081526040519081900360200190205460ff1690509392505050565b610804612628565b60075473ffffffffffffffffffffffffffffffffffffffff1615610867576108677f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff169060006126a9565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610916576109167f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128a9565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61097c612628565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109d6612628565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a19612628565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4b60016129ad565b565b6002602052600090815260409020805460018201805460ff9092169291610a7390613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613b4f565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505090806002018054610b0190613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613b4f565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905083565b610b8c612628565b6001610b99600484612bf5565b14610bd8576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610be88260025b60049190612c08565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c3090613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5c90613b4f565b8015610ca95780601f10610c7e57610100808354040283529160200191610ca9565b820191906000526020600020905b815481529060010190602001808311610c8c57829003601f168201915b50505050508152602001600382018054610cc290613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cee90613b4f565b8015610d3b5780601f10610d1057610100808354040283529160200191610d3b565b820191906000526020600020905b815481529060010190602001808311610d1e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610dbe5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d69565b5050505081525050905060005b816080015151811015610e4d57610e458383608001518381518110610df257610df2613ba2565b60200260200101516020015184608001518481518110610e1457610e14613ba2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c1d9092919063ffffffff16565b600101610dcb565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b610ea6612628565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610ef6600483612bf5565b92915050565b610f04612628565b610f0e8282612c73565b5050565b610f1a612628565b610f3b73ffffffffffffffffffffffffffffffffffffffff84168383612c1d565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610faf90613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdb90613b4f565b80156110285780601f10610ffd57610100808354040283529160200191611028565b820191906000526020600020905b81548152906001019060200180831161100b57829003601f168201915b5050505050815260200160038201805461104190613b4f565b80601f016020809104026020016040519081016040528092919081815260200182805461106d90613b4f565b80156110ba5780601f1061108f576101008083540402835291602001916110ba565b820191906000526020600020905b81548152906001019060200180831161109d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561113d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016110e8565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610bcf565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611250612628565b60005b81811015611333576002600084848481811061127157611271613ba2565b90506020028101906112839190613bd1565b611291906020810190613552565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c8576112c8613ba2565b90506020028101906112da9190613bd1565b6112e8906020810190613c0f565b6040516112f6929190613b3f565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611253565b5060005b838110156114225760016002600087878581811061135757611357613ba2565b90506020028101906113699190613bd1565b611377906020810190613552565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ae576113ae613ba2565b90506020028101906113c09190613bd1565b6113ce906020810190613c0f565b6040516113dc929190613b3f565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611337565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461149a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610bcf565b6114aa6040820160208301613552565b6114b76040830183613c0f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115159250849150613c74565b9081526040519081900360200190205460ff1661156057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bcf919061353f565b6115706040840160208501613552565b67ffffffffffffffff8116600090815260026020526040902060018101805461159890613b4f565b159050806115a75750805460ff165b156115ea576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bcf565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611626908890600401613d88565b600060405180830381600087803b15801561164057600080fd5b505af1925050508015611651575060015b6116f1573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5061169186356001610bdf565b508535600090815260036020526040902086906116ae828261415a565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e390849061353f565b60405180910390a250611422565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177c57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117845750565b6009546001906117b8907d010000000000000000000000000000000000000000000000000000000000900460ff1683614254565b11611905577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c919061428f565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c357600080fd5b505af11580156118d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611910612628565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610f0e90826142ac565b6119ca612628565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8591613c74565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610f3b90826142ac565b333014611b6e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e6040820160208301613552565b611b8b6040830183613c0f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be99250849150613c74565b9081526040519081900360200190205460ff16611c3457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bcf919061353f565b611c446040840160208501613552565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6c90613b4f565b15905080611c7b5750805460ff165b15611cbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bcf565b6000611ccd6060870187613c0f565b810190611cda9190613359565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1a57611d1a611d158260016143c6565b6129ad565b505050505050565b611d2a612628565b67ffffffffffffffff8516600090815260026020526040902060018101611d52858783613ede565b508115611d6a5760028101611d68838583613ede565b505b805460ff1615611d1a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611dae600483612bf5565b14611de8576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610bcf565b611df3816000610bdf565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e3b90613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6790613b4f565b8015611eb45780601f10611e8957610100808354040283529160200191611eb4565b820191906000526020600020905b815481529060010190602001808311611e9757829003601f168201915b50505050508152602001600382018054611ecd90613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990613b4f565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fc95760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f74565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061202e90613b4f565b1590508061203d5750805460ff165b15612080576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bcf565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906120b390613b4f565b80601f01602080910402602001604051908101604052809291908181526020018280546120df90613b4f565b801561212c5780601f106121015761010080835404028352916020019161212c565b820191906000526020600020905b81548152906001019060200180831161210f57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526002928390522001805460809092019161218b90613b4f565b80601f01602080910402602001604051908101604052809291908181526020018280546121b790613b4f565b80156122045780601f106121d957610100808354040283529160200191612204565b820191906000526020600020905b8154815290600101906020018083116121e757829003601f168201915b5050505050815250905060005b865181101561236557612281333089848151811061223157612231613ba2565b6020026020010151602001518a858151811061224f5761224f613ba2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dcd909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106122b1576122b1613ba2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461235d5761235d7f000000000000000000000000000000000000000000000000000000000000000088838151811061230e5761230e613ba2565b60200260200101516020015189848151811061232c5761232c613ba2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128a99092919063ffffffff16565b600101612211565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906123dd908b9086906004016143d9565b602060405180830381865afa1580156123fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241e919061449c565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615612464576007546124649073ffffffffffffffffffffffffffffffffffffffff16333084612dcd565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156124b35760006124b5565b825b8a856040518463ffffffff1660e01b81526004016124d49291906143d9565b60206040518083038185885af11580156124f2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612517919061449c565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61258e612628565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b61261f612628565b61190581612e2b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bcf565b80158061274957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612723573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612747919061449c565b155b6127d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610bcf565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610f3b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f20565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612920573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612944919061449c565b61294e91906143c6565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129a79085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612827565b50505050565b806001166001036129f0576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a24565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a2d81611724565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a9191815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612b0b57816020015b6040805180820190915260008082526020820152815260200190600190039081612ae45790505b50815260075473ffffffffffffffffffffffffffffffffffffffff908116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f991612bb29167ffffffffffffffff9091169085906004016143d9565b6020604051808303816000875af1158015612bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b919061449c565b6000612c01838361302c565b9392505050565b6000612c158484846130b6565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610f3b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612827565b80471015612cdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bcf565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612d37576040519150601f19603f3d011682016040523d82523d6000602084013e612d3c565b606091505b5050905080610f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bcf565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129a79085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612827565b3373ffffffffffffffffffffffffffffffffffffffff821603612eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bcf565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612f82826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130d39092919063ffffffff16565b805190915015610f3b5780806020019051810190612fa091906144b5565b610f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bcf565b600081815260028301602052604081205480151580613050575061305084846130e2565b612c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610bcf565b60008281526002840160205260408120829055612c1584846130ee565b6060612c1584846000856130fa565b6000612c018383613213565b6000612c01838361322b565b60608247101561318c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bcf565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131b59190613c74565b60006040518083038185875af1925050503d80600081146131f2576040519150601f19603f3d011682016040523d82523d6000602084013e6131f7565b606091505b50915091506132088783838761327a565b979650505050505050565b60008181526001830160205260408120541515612c01565b600081815260018301602052604081205461327257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ef6565b506000610ef6565b606083156133105782516000036133095773ffffffffffffffffffffffffffffffffffffffff85163b613309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bcf565b5081612c15565b612c1583838151156133255781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf919061353f565b60006020828403121561336b57600080fd5b5035919050565b60208101600383106133ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190557600080fd5b60008083601f8401126133db57600080fd5b50813567ffffffffffffffff8111156133f357600080fd5b60208301915083602082850101111561340b57600080fd5b9250929050565b60008060006040848603121561342757600080fd5b8335613432816133b3565b9250602084013567ffffffffffffffff81111561344e57600080fd5b61345a868287016133c9565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190557600080fd5b60006020828403121561349b57600080fd5b8135612c0181613467565b801515811461190557600080fd5b6000602082840312156134c657600080fd5b8135612c01816134a6565b60005b838110156134ec5781810151838201526020016134d4565b50506000910152565b6000815180845261350d8160208601602086016134d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0160208301846134f5565b60006020828403121561356457600080fd5b8135612c01816133b3565b831515815260606020820152600061358a60608301856134f5565b828103604084015261359c81856134f5565b9695505050505050565b600080604083850312156135b957600080fd5b8235915060208301356135cb81613467565b809150509250929050565b600080604083850312156135e957600080fd5b82356135f481613467565b946020939093013593505050565b60008060006060848603121561361757600080fd5b833561362281613467565b9250602084013561363281613467565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613695578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613658565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136da60c08401826134f5565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261371683836134f5565b925060808601519150808584030160a0860152506137348282613643565b95945050505050565b60008083601f84011261374f57600080fd5b50813567ffffffffffffffff81111561376757600080fd5b6020830191508360208260051b850101111561340b57600080fd5b6000806000806040858703121561379857600080fd5b843567ffffffffffffffff808211156137b057600080fd5b6137bc8883890161373d565b909650945060208701359150808211156137d557600080fd5b506137e28782880161373d565b95989497509550505050565b60006020828403121561380057600080fd5b813567ffffffffffffffff81111561381757600080fd5b820160a08185031215612c0157600080fd5b6000806040838503121561383c57600080fd5b8235613847816133b3565b915060208301356135cb81613467565b60008060008060006060868803121561386f57600080fd5b853561387a816133b3565b9450602086013567ffffffffffffffff8082111561389757600080fd5b6138a389838a016133c9565b909650945060408801359150808211156138bc57600080fd5b506138c9888289016133c9565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561392c5761392c6138da565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613979576139796138da565b604052919050565b600082601f83011261399257600080fd5b813567ffffffffffffffff8111156139ac576139ac6138da565b6139dd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613932565b8181528460208386010111156139f257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a2457600080fd5b8335613a2f816133b3565b925060208481013567ffffffffffffffff80821115613a4d57600080fd5b818701915087601f830112613a6157600080fd5b813581811115613a7357613a736138da565b613a81848260051b01613932565b81815260069190911b8301840190848101908a831115613aa057600080fd5b938501935b82851015613aec576040858c031215613abe5760008081fd5b613ac6613909565b8535613ad181613467565b81528587013587820152825260409094019390850190613aa5565b965050506040870135925080831115613b0457600080fd5b5050613b1286828701613981565b9150509250925092565b600060208284031215613b2e57600080fd5b813560ff81168114612c0157600080fd5b8183823760009101908152919050565b600181811c90821680613b6357607f821691505b602082108103613b9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c0557600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c4457600080fd5b83018035915067ffffffffffffffff821115613c5f57600080fd5b60200191503681900382131561340b57600080fd5b60008251613c058184602087016134d1565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cbb57600080fd5b830160208101925035905067ffffffffffffffff811115613cdb57600080fd5b80360382131561340b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613695578135613d5681613467565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d43565b602081528135602082015260006020830135613da3816133b3565b67ffffffffffffffff8082166040850152613dc16040860186613c86565b925060a06060860152613dd860c086018483613cea565b925050613de86060860186613c86565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e1e858385613cea565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e5757600080fd5b60209288019283019235915083821115613e7057600080fd5b8160061b3603831315613e8257600080fd5b8685030160a0870152613208848284613d33565b601f821115610f3b576000816000526020600020601f850160051c81016020861015613ebf5750805b601f850160051c820191505b81811015611d1a57828155600101613ecb565b67ffffffffffffffff831115613ef657613ef66138da565b613f0a83613f048354613b4f565b83613e96565b6000601f841160018114613f5c5760008515613f265750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611422565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fab5786850135825560209485019460019092019101613f8b565b5086821015613fe6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561403281613467565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115614098576140986138da565b8054838255808410156141255760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140d9576140d9613ff8565b80861686146140ea576140ea613ff8565b5060008360005260206000208360011b81018760011b820191505b80821015614120578282558284830155600282019150614105565b505050505b5060008181526020812083915b85811015611d1a576141448383614027565b6040929092019160029190910190600101614132565b81358155600181016020830135614170816133b3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141b06040860186613c0f565b935091506141c2838360028701613ede565b6141cf6060860186613c0f565b935091506141e1838360038701613ede565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261421857600080fd5b91840191823591508082111561422d57600080fd5b506020820191508060061b360382131561424657600080fd5b6129a781836004860161407f565b60008261428a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142a157600080fd5b8151612c0181613467565b815167ffffffffffffffff8111156142c6576142c66138da565b6142da816142d48454613b4f565b84613e96565b602080601f83116001811461432d57600084156142f75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d1a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561437a5788860151825594840194600190910190840161435b565b50858210156143b657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610ef657610ef6613ff8565b67ffffffffffffffff83168152604060208201526000825160a0604084015261440560e08401826134f5565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261444183836134f5565b9250604086015191508085840301608086015261445e8383613643565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061359c82826134f5565b6000602082840312156144ae57600080fd5b5051919050565b6000602082840312156144c757600080fd5b8151612c01816134a656fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -420,7 +420,7 @@ func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.Ca return *outstruct, err } - outstruct.IsDisabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Disabled = *abi.ConvertType(out[0], new(bool)).(*bool) outstruct.Recipient = *abi.ConvertType(out[1], new([]byte)).(*[]byte) outstruct.ExtraArgsBytes = *abi.ConvertType(out[2], new([]byte)).(*[]byte) @@ -506,6 +506,18 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) TypeAndVersion() (st return _SelfFundedPingPong.Contract.TypeAndVersion(&_SelfFundedPingPong.CallOpts) } +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "abandonMessage", messageId, receiver) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.AbandonMessage(&_SelfFundedPingPong.TransactOpts, messageId, receiver) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.AbandonMessage(&_SelfFundedPingPong.TransactOpts, messageId, receiver) +} + func (_SelfFundedPingPong *SelfFundedPingPongTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "acceptOwnership") } @@ -602,16 +614,16 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ProcessMessage(m return _SelfFundedPingPong.Contract.ProcessMessage(&_SelfFundedPingPong.TransactOpts, message) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "retryFailedMessage", messageId, forwardingAddress) +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "retryFailedMessage", messageId) } -func (_SelfFundedPingPong *SelfFundedPingPongSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId, forwardingAddress) +func (_SelfFundedPingPong *SelfFundedPingPongSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) RetryFailedMessage(messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId, forwardingAddress) +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.RetryFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId) } func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCountIncrBeforeFunding(opts *bind.TransactOpts, countIncrBeforeFunding uint8) (*types.Transaction, error) { @@ -674,18 +686,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetPaused(pause return _SelfFundedPingPong.Contract.SetPaused(&_SelfFundedPingPong.TransactOpts, pause) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "setSimRevert", simRevert) -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetSimRevert(&_SelfFundedPingPong.TransactOpts, simRevert) -} - -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetSimRevert(&_SelfFundedPingPong.TransactOpts, simRevert) -} - func (_SelfFundedPingPong *SelfFundedPingPongTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "startPingPong") } @@ -710,15 +710,15 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) TransferOwnershi return _SelfFundedPingPong.Contract.TransferOwnership(&_SelfFundedPingPong.TransactOpts, to) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) } @@ -746,18 +746,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) WithdrawTokens(t return _SelfFundedPingPong.Contract.WithdrawTokens(&_SelfFundedPingPong.TransactOpts, token, to, amount) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.RawTransact(opts, calldata) -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.Fallback(&_SelfFundedPingPong.TransactOpts, calldata) -} - -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.Fallback(&_SelfFundedPingPong.TransactOpts, calldata) -} - func (_SelfFundedPingPong *SelfFundedPingPongTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { return _SelfFundedPingPong.contract.RawTransact(opts, nil) } @@ -1139,6 +1127,134 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseFunded(log types.Log return event, nil } +type SelfFundedPingPongMessageAbandonedIterator struct { + Event *SelfFundedPingPongMessageAbandoned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongMessageAbandonedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongMessageAbandoned) + 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(SelfFundedPingPongMessageAbandoned) + 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 *SelfFundedPingPongMessageAbandonedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongMessageAbandonedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongMessageAbandoned struct { + MessageId [32]byte + TokenReceiver common.Address + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageAbandonedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongMessageAbandonedIterator{contract: _SelfFundedPingPong.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageAbandoned, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongMessageAbandoned) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageAbandoned", 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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseMessageAbandoned(log types.Log) (*SelfFundedPingPongMessageAbandoned, error) { + event := new(SelfFundedPingPongMessageAbandoned) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type SelfFundedPingPongMessageAckReceivedIterator struct { Event *SelfFundedPingPongMessageAckReceived @@ -2398,7 +2514,7 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePong(log types.Log) } type SChainConfigs struct { - IsDisabled bool + Disabled bool Recipient []byte ExtraArgsBytes []byte } @@ -2411,6 +2527,8 @@ func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generate return _SelfFundedPingPong.ParseFeeTokenModified(log) case _SelfFundedPingPong.abi.Events["Funded"].ID: return _SelfFundedPingPong.ParseFunded(log) + case _SelfFundedPingPong.abi.Events["MessageAbandoned"].ID: + return _SelfFundedPingPong.ParseMessageAbandoned(log) case _SelfFundedPingPong.abi.Events["MessageAckReceived"].ID: return _SelfFundedPingPong.ParseMessageAckReceived(log) case _SelfFundedPingPong.abi.Events["MessageAckSent"].ID: @@ -2449,6 +2567,10 @@ func (SelfFundedPingPongFunded) Topic() common.Hash { return common.HexToHash("0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c") } +func (SelfFundedPingPongMessageAbandoned) Topic() common.Hash { + return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") +} + func (SelfFundedPingPongMessageAckReceived) Topic() common.Hash { return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") } @@ -2524,6 +2646,8 @@ type SelfFundedPingPongInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) + AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) @@ -2540,7 +2664,7 @@ type SelfFundedPingPongInterface interface { ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte, forwardingAddress common.Address) (*types.Transaction, error) + RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) SetCountIncrBeforeFunding(opts *bind.TransactOpts, countIncrBeforeFunding uint8) (*types.Transaction, error) @@ -2552,20 +2676,16 @@ type SelfFundedPingPongInterface interface { SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) - SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) - StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseapprovedSenderUpdate, removes []CCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) - Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) - Receive(opts *bind.TransactOpts) (*types.Transaction, error) FilterCountIncrBeforeFundingSet(opts *bind.FilterOpts) (*SelfFundedPingPongCountIncrBeforeFundingSetIterator, error) @@ -2586,6 +2706,12 @@ type SelfFundedPingPongInterface interface { ParseFunded(log types.Log) (*SelfFundedPingPongFunded, error) + FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageAbandonedIterator, error) + + WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageAbandoned, messageId [][32]byte) (event.Subscription, error) + + ParseMessageAbandoned(log types.Log) (*SelfFundedPingPongMessageAbandoned, error) + FilterMessageAckReceived(opts *bind.FilterOpts) (*SelfFundedPingPongMessageAckReceivedIterator, error) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageAckReceived) (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 488c3a76a3..2170968d97 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,10 +5,10 @@ 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 fee3f82935ce7a26c65e12f19a472a4fccdae62755abdb42d8b0a01f0f06981a burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin c7efa00d2be62a97a814730c8e13aa70794ebfdd38a9f3b3c11554a5dfd70478 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin a0728e186af74968101135a58a483320ced9ab79b22b1b24ac6994254ee79097 -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 18d708c8441701964f3222d78b332d8b973832e260ae29ecf87bf59ee5ddf54a -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 8dd01cb18b917e0481e5a972b2e8f5efac94375170229f3109f46e046de04aaf -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 1d38efe13c3b8ae874e46a6ed98eabd33f77b8b1c96c7efc5c67fa8f5e063c08 -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 90b4fca2b5d20d816f238b679d391a78070d1aa0db967b2fbca5131a6c484414 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin fb523cde481a1cffe8d5c93ea1b57931859a093ba03803034434ecd4183b2c41 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin a57c861ee713741d05c38edc2acfee13aaa037d4fc43f0795e74ece19b294ba9 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin b7fb4d8a3bcefd7a4f355c47199aedb94d78534c540138a69b3e0ebd8654f47e +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin f79420dab435b1c44d695cc1cfb1771e4ba1a7224814198b4818c043219e337a ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c44460757ca0e1b228734b32b9ab03221b93d77bb9f8e2970830779a8be2cb78 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 @@ -27,11 +27,12 @@ mock_usdc_token_transmitter: ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmit mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin 518e19efa2ff52b0fefd8e597b05765317ee7638189bfe34ca43de2f6599faf4 multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 1588313bb5e781d181a825247d30828f59007700f36b4b9b00391592b06ff4b4 +ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin b58dd158eb1504600b3fb4bdb4c24e49f0ae80bcb70f6b9af35904481538acf4 price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 0b3e253684d7085aa11f9179b71453b9db9d11cabea41605d5b4ac4128f85bfb registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin cbe7698bfd811b485ac3856daf073a7bdebeefdf2583403ca4a19d5b7e2d4ae8 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 30ed080262ce13704aea2a84ebda7b025d5859823e44ec2aab450c735a2a6bf5 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 62483ea741c1b1556f16101be8714374bf9f68435fcc5dca1666146d74e75b21 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin 48caf06855a2f60455364d384e5fb2e6ecdf0a9ce4c1fc706b54b9885df76695 From 4b98ecbf3110e60516539e860877ca960ecc452f Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 3 Jul 2024 10:57:34 -0400 Subject: [PATCH 25/31] re add onlyOwner modifier to retryMessage and other coverage gaps fill-ins --- .../applications/external/CCIPReceiver.sol | 4 +- .../external/CCIPReceiverTest.t.sol | 55 ++++++++++++++++++- .../receivers/CCIPReceiverReverting.sol | 1 + 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 9be6db83d5..b95d2cfcb1 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -93,7 +93,7 @@ contract CCIPReceiver is CCIPClientBase { /// @notice This function is called when the initial message delivery has failed but should be attempted again with different logic /// @dev By default this function is callable by anyone, and should be modified if special access control is needed. - function retryFailedMessage(bytes32 messageId) external { + function retryFailedMessage(bytes32 messageId) external onlyOwner { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); // Set the error code to 0 to disallow reentry and retry the same failed message @@ -116,7 +116,7 @@ contract CCIPReceiver is CCIPClientBase { /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried /// @notice function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. /// @dev this function is only callable as the owner, and - function abandonMessage(bytes32 messageId, address receiver) external onlyOwner { + function abandonFailedMessage(bytes32 messageId, address receiver) external onlyOwner { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); s_failedMessages.set(messageId, uint256(ErrorCode.ABANDONED)); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index 4ed15c2dbe..4960be1e35 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -73,7 +73,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit CCIPReceiver.MessageAbandoned(messageId, OWNER); - s_receiver.abandonMessage(messageId, OWNER); + s_receiver.abandonFailedMessage(messageId, OWNER); // Assert the tokens have successfully been rescued from the contract. assertEq( @@ -137,6 +137,59 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { assertGt(IERC20(token).balanceOf(OWNER), 0); } + function test_retryFailedMessage_Success() public { + bytes32 messageId = keccak256("messageId"); + address token = address(s_destFeeToken); + uint256 amount = 111333333777; + Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); + destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); + + // Make sure we give the receiver contract enough tokens like CCIP would. + deal(token, address(s_receiver), amount); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_destRouter)); + + vm.expectEmit(); + emit MessageFailed( + messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(1))) + ); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: sourceChainSelector, + sender: abi.encode(address(1)), + data: "", + destTokenAmounts: destTokenAmounts + }) + ); + + vm.stopPrank(); + + // Check that the message was stored properly by comparing each of the fields. + // There's no way to check that a function internally will revert from a top-level test, so we need to check state differences + Client.Any2EVMMessage memory failedMessage = s_receiver.getMessageContents(messageId); + assertEq(failedMessage.sender, abi.encode(address(1))); + assertEq(failedMessage.sourceChainSelector, sourceChainSelector); + assertEq(failedMessage.destTokenAmounts[0].token, token); + assertEq(failedMessage.destTokenAmounts[0].amount, amount); + + // Check that message status is failed + assertEq(s_receiver.getMessageStatus(messageId), 1); + + uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); + + vm.startPrank(OWNER); + + vm.expectEmit(); + emit CCIPReceiver.MessageRecovered(messageId); + + s_receiver.retryFailedMessage(messageId); + assertEq(s_receiver.getMessageStatus(messageId), 0); + + } + function test_HappyPath_Success() public { bytes32 messageId = keccak256("messageId"); address token = address(s_destFeeToken); diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol index 5466ea19c6..444b066955 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol @@ -18,6 +18,7 @@ contract CCIPReceiverReverting is CCIPReceiver { /// @dev It has to be external because of the try/catch. function processMessage(Client.Any2EVMMessage calldata message) external + view override onlySelf isValidSender(message.sourceChainSelector, message.sender) From 6e1a2272e10a1bc0351ba0742b33c1c74be1df74 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 3 Jul 2024 11:00:59 -0400 Subject: [PATCH 26/31] ccip precommit --- contracts/gas-snapshots/ccip.gas-snapshot | 23 ++++++++++--------- .../external/CCIPReceiverTest.t.sol | 1 - 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 17b3c66e24..c2a26ca75f 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -88,16 +88,17 @@ CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1160583) CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1158919) CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562) -CCIPReceiverTest:test_HappyPath_Success() (gas: 193606) -CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428772) -CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 444827) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205076) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425122) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18785) +CCIPReceiverTest:test_HappyPath_Success() (gas: 193588) +CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428817) +CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 444784) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205094) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425167) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423774) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18806) CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 55172) CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 331323) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437638) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2639685) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437616) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2641285) CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72519) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339182) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224256) @@ -208,7 +209,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181595) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 189957) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47044) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 434527) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1408453) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 248935) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 174421) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193347) @@ -234,8 +235,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207222) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28130) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 158903) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 505081) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2379173) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1479082) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3171008) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209279) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 209853) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 664710) diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index 4960be1e35..375d84d501 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -187,7 +187,6 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { s_receiver.retryFailedMessage(messageId); assertEq(s_receiver.getMessageStatus(messageId), 0); - } function test_HappyPath_Success() public { From e24e5129b144ce8317109753781360713f145fbf Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:08:04 +0000 Subject: [PATCH 27/31] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 18 +++++++++--------- .../generated/ccipReceiver/ccipReceiver.go | 18 +++++++++--------- .../generated/ping_pong_demo/ping_pong_demo.go | 18 +++++++++--------- .../self_funded_ping_pong.go | 18 +++++++++--------- ...wrapper-dependency-versions-do-not-edit.txt | 10 +++++----- 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index dc5e458126..1b906234e0 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200454f3803806200454f83398101604081905262000034916200055f565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200013b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013157620001316001600160a01b03821683600019620001e6565b5050505062000684565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e91906200059e565b6200026a9190620005b8565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002c691869190620002cc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031b906001600160a01b038516908490620003a2565b8051909150156200039d57808060200190518101906200033c9190620005e0565b6200039d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b38484600085620003bb565b949350505050565b6060824710156200041e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200043c919062000631565b60006040518083038185875af1925050503d80600081146200047b576040519150601f19603f3d011682016040523d82523d6000602084013e62000480565b606091505b50909250905062000494878383876200049f565b979650505050505050565b60608315620005135782516000036200050b576001600160a01b0385163b6200050b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b3565b620003b383838151156200052a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200064f565b6001600160a01b03811681146200055c57600080fd5b50565b600080604083850312156200057357600080fd5b8251620005808162000546565b6020840151909250620005938162000546565b809150509250929050565b600060208284031215620005b157600080fd5b5051919050565b80820180821115620005da57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f357600080fd5b815180151581146200060457600080fd5b9392505050565b60005b83811015620006285781810151838201526020016200060e565b50506000910152565b60008251620006458184602087016200060b565b9190910192915050565b6020815260008251806020840152620006708160408501602087016200060b565b601f01601f19169190910160400192915050565b608051613e77620006d86000396000818161047a015281816105d4015281816106640152818161111501528181611bd201528181611c9b01528181611d73015281816125f301526126bf0152613e776000f3fe6080604052600436106101845760003560e01c80636fef519e116100d6578063cf6730f81161007f578063e89b448511610059578063e89b4485146104fe578063f2fde38b14610511578063ff2deec31461053157600080fd5b8063cf6730f81461049e578063d8469e40146104be578063e4ca8754146104de57600080fd5b806385572ffb116100b057806385572ffb146103ff5780638da5cb5b1461041f578063b0f479a11461046b57600080fd5b80636fef519e1461038157806379ba5097146103ca5780638462a2b9146103df57600080fd5b80633a998eaf11610138578063536c6bfa11610112578063536c6bfa146103145780635e35359e146103345780636939cd971461035457600080fd5b80633a998eaf146102a657806341eade46146102c65780635075a9d4146102e657600080fd5b806311e85dff1161016957806311e85dff14610206578063181f5a771461022857806335f170ef1461027757600080fd5b806305bfe982146101905780630e958d6b146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab366004612d2b565b60086020526000908152604090205460ff1681565b6040516101cd9190612d73565b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612e13565b61055e565b60405190151581526020016101cd565b34801561021257600080fd5b50610226610221366004612e8a565b6105a9565b005b34801561023457600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101cd9190612f15565b34801561028357600080fd5b50610297610292366004612f28565b610721565b6040516101cd93929190612f45565b3480156102b257600080fd5b506102266102c1366004612f7c565b610858565b3480156102d257600080fd5b506102266102e1366004612f28565b610b72565b3480156102f257600080fd5b50610306610301366004612d2b565b610bbd565b6040519081526020016101cd565b34801561032057600080fd5b5061022661032f366004612fac565b610bd0565b34801561034057600080fd5b5061022661034f366004612fd8565b610be6565b34801561036057600080fd5b5061037461036f366004612d2b565b610c14565b6040516101cd9190613076565b34801561038d57600080fd5b5061026a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103d657600080fd5b50610226610e1f565b3480156103eb57600080fd5b506102266103fa366004613158565b610f1c565b34801561040b57600080fd5b5061022661041a3660046131c4565b6110fd565b34801561042b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561047757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610446565b3480156104aa57600080fd5b506102266104b93660046131c4565b6113f8565b3480156104ca57600080fd5b506102266104d93660046131ff565b611615565b3480156104ea57600080fd5b506102266104f9366004612d2b565b611696565b61030661050c3660046133e8565b6118f7565b34801561051d57600080fd5b5061022661052c366004612e8a565b611e7b565b34801561053d57600080fd5b506007546104469073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061058d90859085906134f5565b9081526040519081900360200190205460ff1690509392505050565b6105b1611e8f565b60075473ffffffffffffffffffffffffffffffffffffffff1615610614576106147f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000611f12565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106c3576106c37f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612112565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff909216929161074790613505565b80601f016020809104026020016040519081016040528092919081815260200182805461077390613505565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050908060020180546107d590613505565b80601f016020809104026020016040519081016040528092919081815260200182805461080190613505565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905083565b610860611e8f565b600161086d600484612216565b146108ac576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108bc8260025b60049190612229565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161090490613505565b80601f016020809104026020016040519081016040528092919081815260200182805461093090613505565b801561097d5780601f106109525761010080835404028352916020019161097d565b820191906000526020600020905b81548152906001019060200180831161096057829003601f168201915b5050505050815260200160038201805461099690613505565b80601f01602080910402602001604051908101604052809291908181526020018280546109c290613505565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a925760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a3d565b5050505081525050905060005b816080015151811015610b2157610b198383608001518381518110610ac657610ac6613558565b60200260200101516020015184608001518481518110610ae857610ae8613558565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661223e9092919063ffffffff16565b600101610a9f565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b610b7a611e8f565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610bca600483612216565b92915050565b610bd8611e8f565b610be28282612294565b5050565b610bee611e8f565b610c0f73ffffffffffffffffffffffffffffffffffffffff8416838361223e565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c8390613505565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf90613505565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b50505050508152602001600382018054610d1590613505565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4190613505565b8015610d8e5780601f10610d6357610100808354040283529160200191610d8e565b820191906000526020600020905b815481529060010190602001808311610d7157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e115760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dbc565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108a3565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f24611e8f565b60005b818110156110075760026000848484818110610f4557610f45613558565b9050602002810190610f579190613587565b610f65906020810190612f28565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9c57610f9c613558565b9050602002810190610fae9190613587565b610fbc9060208101906135c5565b604051610fca9291906134f5565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f27565b5060005b838110156110f65760016002600087878581811061102b5761102b613558565b905060200281019061103d9190613587565b61104b906020810190612f28565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061108257611082613558565b90506020028101906110949190613587565b6110a29060208101906135c5565b6040516110b09291906134f5565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161100b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116e576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108a3565b61117e6040820160208301612f28565b61118b60408301836135c5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e9925084915061362a565b9081526040519081900360200190205460ff1661123457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108a39190612f15565b6112446040840160208501612f28565b67ffffffffffffffff8116600090815260026020526040902060018101805461126c90613505565b1590508061127b5750805460ff165b156112be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108a3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112fa90889060040161373e565b600060405180830381600087803b15801561131457600080fd5b505af1925050508015611325575060015b6113c5573d808015611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b50611365863560016108b3565b508535600090815260036020526040902086906113828282613b10565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b7908490612f15565b60405180910390a2506110f6565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b333014611431576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061144060608301836135c5565b81019061144d9190613c0a565b905060008160400151600181111561146757611467612d44565b0361147557610be2826123ee565b60018160400151600181111561148d5761148d612d44565b03610be25760008082602001518060200190518101906114ad9190613cb6565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611545576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156a5761156a612d44565b146115a4576040517f3ec87700000000000000000000000000000000000000000000000000000000008152600481018290526024016108a3565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161d611e8f565b67ffffffffffffffff8516600090815260026020526040902060018101611645858783613894565b50811561165d576002810161165b838583613894565b505b805460ff161561168e5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016116a3600483612216565b146116dd576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016108a3565b6116e88160006108b3565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161173090613505565b80601f016020809104026020016040519081016040528092919081815260200182805461175c90613505565b80156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b505050505081526020016003820180546117c290613505565b80601f01602080910402602001604051908101604052809291908181526020018280546117ee90613505565b801561183b5780601f106118105761010080835404028352916020019161183b565b820191906000526020600020905b81548152906001019060200180831161181e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118be5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611869565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061192390613505565b159050806119325750805460ff165b15611975576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108a3565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906119a890613505565b80601f01602080910402602001604051908101604052809291908181526020018280546119d490613505565b8015611a215780601f106119f657610100808354040283529160200191611a21565b820191906000526020600020905b815481529060010190602001808311611a0457829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611a8090613505565b80601f0160208091040260200160405190810160405280929190818152602001828054611aac90613505565b8015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b5050505050815250905060005b8651811015611c5a57611b763330898481518110611b2657611b26613558565b6020026020010151602001518a8581518110611b4457611b44613558565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661279f909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611ba657611ba6613558565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611c5257611c527f0000000000000000000000000000000000000000000000000000000000000000888381518110611c0357611c03613558565b602002602001015160200151898481518110611c2157611c21613558565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166121129092919063ffffffff16565b600101611b06565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611cd2908b908690600401613d37565b602060405180830381865afa158015611cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d139190613dfa565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615611d5957600754611d599073ffffffffffffffffffffffffffffffffffffffff1633308461279f565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615611da8576000611daa565b825b8a856040518463ffffffff1660e01b8152600401611dc9929190613d37565b60206040518083038185885af1158015611de7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e0c9190613dfa565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611e83611e8f565b611e8c816127fd565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108a3565b565b801580611fb257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb09190613dfa565b155b61203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108a3565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c0f9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526128f2565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad9190613dfa565b6121b79190613e13565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506122109085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612090565b50505050565b600061222283836129fe565b9392505050565b6000612236848484612a88565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c0f9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612090565b804710156122fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108a3565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612358576040519150601f19603f3d011682016040523d82523d6000602084013e61235d565b606091505b5050905080610c0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108a3565b604080516000808252602082019092528161242b565b60408051808201909152600080825260208201528152602001906001900390816124045790505b50905060006040518060a0016040528084806040019061244b91906135c5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124cc9288359101613e26565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260075473ffffffffffffffffffffffffffffffffffffffff168383015260609092019160029160009161253c918901908901612f28565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201805461256c90613505565b80601f016020809104026020016040519081016040528092919081815260200182805461259890613505565b80156125e55780601f106125ba576101008083540402835291602001916125e5565b820191906000526020600020905b8154815290600101906020018083116125c857829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906126409190612f28565b846040518363ffffffff1660e01b815260040161265e929190613d37565b602060405180830381865afa15801561267b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269f9190613dfa565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156126f45760006126f6565b835b6127066040890160208a01612f28565b866040518463ffffffff1660e01b8152600401612724929190613d37565b60206040518083038185885af1158015612742573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127679190613dfa565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526122109085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612090565b3373ffffffffffffffffffffffffffffffffffffffff82160361287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108a3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612954826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aa59092919063ffffffff16565b805190915015610c0f57808060200190518101906129729190613e48565b610c0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108a3565b600081815260028301602052604081205480151580612a225750612a228484612ab4565b612222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016108a3565b600082815260028401602052604081208290556122368484612ac0565b60606122368484600085612acc565b60006122228383612be5565b60006122228383612bfd565b606082471015612b5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108a3565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b87919061362a565b60006040518083038185875af1925050503d8060008114612bc4576040519150601f19603f3d011682016040523d82523d6000602084013e612bc9565b606091505b5091509150612bda87838387612c4c565b979650505050505050565b60008181526001830160205260408120541515612222565b6000818152600183016020526040812054612c4457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bca565b506000610bca565b60608315612ce2578251600003612cdb5773ffffffffffffffffffffffffffffffffffffffff85163b612cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108a3565b5081612236565b6122368383815115612cf75781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a39190612f15565b600060208284031215612d3d57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612dae577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e8c57600080fd5b60008083601f840112612ddc57600080fd5b50813567ffffffffffffffff811115612df457600080fd5b602083019150836020828501011115612e0c57600080fd5b9250929050565b600080600060408486031215612e2857600080fd5b8335612e3381612db4565b9250602084013567ffffffffffffffff811115612e4f57600080fd5b612e5b86828701612dca565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e8c57600080fd5b600060208284031215612e9c57600080fd5b813561222281612e68565b60005b83811015612ec2578181015183820152602001612eaa565b50506000910152565b60008151808452612ee3816020860160208601612ea7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006122226020830184612ecb565b600060208284031215612f3a57600080fd5b813561222281612db4565b8315158152606060208201526000612f606060830185612ecb565b8281036040840152612f728185612ecb565b9695505050505050565b60008060408385031215612f8f57600080fd5b823591506020830135612fa181612e68565b809150509250929050565b60008060408385031215612fbf57600080fd5b8235612fca81612e68565b946020939093013593505050565b600080600060608486031215612fed57600080fd5b8335612ff881612e68565b9250602084013561300881612e68565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561306b578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161302e565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526130b060c0840182612ecb565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130ec8383612ecb565b925060808601519150808584030160a08601525061310a8282613019565b95945050505050565b60008083601f84011261312557600080fd5b50813567ffffffffffffffff81111561313d57600080fd5b6020830191508360208260051b8501011115612e0c57600080fd5b6000806000806040858703121561316e57600080fd5b843567ffffffffffffffff8082111561318657600080fd5b61319288838901613113565b909650945060208701359150808211156131ab57600080fd5b506131b887828801613113565b95989497509550505050565b6000602082840312156131d657600080fd5b813567ffffffffffffffff8111156131ed57600080fd5b820160a0818503121561222257600080fd5b60008060008060006060868803121561321757600080fd5b853561322281612db4565b9450602086013567ffffffffffffffff8082111561323f57600080fd5b61324b89838a01612dca565b9096509450604088013591508082111561326457600080fd5b5061327188828901612dca565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156132d4576132d4613282565b60405290565b6040516060810167ffffffffffffffff811182821017156132d4576132d4613282565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561334457613344613282565b604052919050565b600067ffffffffffffffff82111561336657613366613282565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126133a357600080fd5b81356133b66133b18261334c565b6132fd565b8181528460208386010111156133cb57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156133fd57600080fd5b833561340881612db4565b925060208481013567ffffffffffffffff8082111561342657600080fd5b818701915087601f83011261343a57600080fd5b81358181111561344c5761344c613282565b61345a848260051b016132fd565b81815260069190911b8301840190848101908a83111561347957600080fd5b938501935b828510156134c5576040858c0312156134975760008081fd5b61349f6132b1565b85356134aa81612e68565b8152858701358782015282526040909401939085019061347e565b9650505060408701359250808311156134dd57600080fd5b50506134eb86828701613392565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061351957607f821691505b602082108103613552577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126135bb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135fa57600080fd5b83018035915067ffffffffffffffff82111561361557600080fd5b602001915036819003821315612e0c57600080fd5b600082516135bb818460208701612ea7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261367157600080fd5b830160208101925035905067ffffffffffffffff81111561369157600080fd5b803603821315612e0c57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561306b57813561370c81612e68565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016136f9565b60208152813560208201526000602083013561375981612db4565b67ffffffffffffffff8082166040850152613777604086018661363c565b925060a0606086015261378e60c0860184836136a0565b92505061379e606086018661363c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526137d48583856136a0565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261380d57600080fd5b6020928801928301923591508382111561382657600080fd5b8160061b360383131561383857600080fd5b8685030160a0870152612bda8482846136e9565b601f821115610c0f576000816000526020600020601f850160051c810160208610156138755750805b601f850160051c820191505b8181101561168e57828155600101613881565b67ffffffffffffffff8311156138ac576138ac613282565b6138c0836138ba8354613505565b8361384c565b6000601f84116001811461391257600085156138dc5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139615786850135825560209485019460019092019101613941565b508682101561399c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139e881612e68565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a4e57613a4e613282565b805483825580841015613adb5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a8f57613a8f6139ae565b8086168614613aa057613aa06139ae565b5060008360005260206000208360011b81018760011b820191505b80821015613ad6578282558284830155600282019150613abb565b505050505b5060008181526020812083915b8581101561168e57613afa83836139dd565b6040929092019160029190910190600101613ae8565b81358155600181016020830135613b2681612db4565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b6660408601866135c5565b93509150613b78838360028701613894565b613b8560608601866135c5565b93509150613b97838360038701613894565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613bce57600080fd5b918401918235915080821115613be357600080fd5b506020820191508060061b3603821315613bfc57600080fd5b612210818360048601613a35565b600060208284031215613c1c57600080fd5b813567ffffffffffffffff80821115613c3457600080fd5b9083019060608286031215613c4857600080fd5b613c506132da565b823582811115613c5f57600080fd5b613c6b87828601613392565b825250602083013582811115613c8057600080fd5b613c8c87828601613392565b6020830152506040830135925060028310613ca657600080fd5b6040810192909252509392505050565b60008060408385031215613cc957600080fd5b825167ffffffffffffffff811115613ce057600080fd5b8301601f81018513613cf157600080fd5b8051613cff6133b18261334c565b818152866020838501011115613d1457600080fd5b613d25826020830160208601612ea7565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d6360e0840182612ecb565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613d9f8383612ecb565b92506040860151915080858403016080860152613dbc8383613019565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f728282612ecb565b600060208284031215613e0c57600080fd5b5051919050565b80820180821115610bca57610bca6139ae565b604081526000613e396040830185612ecb565b90508260208301529392505050565b600060208284031215613e5a57600080fd5b8151801515811461222257600080fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620045573803806200455783398101604081905262000034916200055f565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200013b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013157620001316001600160a01b03821683600019620001e6565b5050505062000684565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e91906200059e565b6200026a9190620005b8565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002c691869190620002cc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031b906001600160a01b038516908490620003a2565b8051909150156200039d57808060200190518101906200033c9190620005e0565b6200039d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b38484600085620003bb565b949350505050565b6060824710156200041e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200043c919062000631565b60006040518083038185875af1925050503d80600081146200047b576040519150601f19603f3d011682016040523d82523d6000602084013e62000480565b606091505b50909250905062000494878383876200049f565b979650505050505050565b60608315620005135782516000036200050b576001600160a01b0385163b6200050b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b3565b620003b383838151156200052a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200064f565b6001600160a01b03811681146200055c57600080fd5b50565b600080604083850312156200057357600080fd5b8251620005808162000546565b6020840151909250620005938162000546565b809150509250929050565b600060208284031215620005b157600080fd5b5051919050565b80820180821115620005da57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f357600080fd5b815180151581146200060457600080fd5b9392505050565b60005b83811015620006285781810151838201526020016200060e565b50506000910152565b60008251620006458184602087016200060b565b9190910192915050565b6020815260008251806020840152620006708160408501602087016200060b565b601f01601f19169190910160400192915050565b608051613e7f620006d86000396000818161047a015281816105d4015281816106640152818161111501528181611bda01528181611ca301528181611d7b015281816125fb01526126c70152613e7f6000f3fe6080604052600436106101845760003560e01c80636fef519e116100d6578063cf6730f81161007f578063e89b448511610059578063e89b4485146104fe578063f2fde38b14610511578063ff2deec31461053157600080fd5b8063cf6730f81461049e578063d8469e40146104be578063e4ca8754146104de57600080fd5b806385572ffb116100b057806385572ffb146103ff5780638da5cb5b1461041f578063b0f479a11461046b57600080fd5b80636fef519e1461038157806379ba5097146103ca5780638462a2b9146103df57600080fd5b806341eade46116101385780635e35359e116101125780635e35359e146103145780636939cd97146103345780636d62d6331461036157600080fd5b806341eade46146102a65780635075a9d4146102c6578063536c6bfa146102f457600080fd5b806311e85dff1161016957806311e85dff14610206578063181f5a771461022857806335f170ef1461027757600080fd5b806305bfe982146101905780630e958d6b146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab366004612d33565b60086020526000908152604090205460ff1681565b6040516101cd9190612d7b565b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612e1b565b61055e565b60405190151581526020016101cd565b34801561021257600080fd5b50610226610221366004612e92565b6105a9565b005b34801561023457600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101cd9190612f1d565b34801561028357600080fd5b50610297610292366004612f30565b610721565b6040516101cd93929190612f4d565b3480156102b257600080fd5b506102266102c1366004612f30565b610858565b3480156102d257600080fd5b506102e66102e1366004612d33565b6108a3565b6040519081526020016101cd565b34801561030057600080fd5b5061022661030f366004612f84565b6108b6565b34801561032057600080fd5b5061022661032f366004612fb0565b6108cc565b34801561034057600080fd5b5061035461034f366004612d33565b6108fa565b6040516101cd919061304e565b34801561036d57600080fd5b5061022661037c3660046130eb565b610b05565b34801561038d57600080fd5b5061026a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103d657600080fd5b50610226610e1f565b3480156103eb57600080fd5b506102266103fa366004613160565b610f1c565b34801561040b57600080fd5b5061022661041a3660046131cc565b6110fd565b34801561042b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561047757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610446565b3480156104aa57600080fd5b506102266104b93660046131cc565b6113f8565b3480156104ca57600080fd5b506102266104d9366004613207565b611615565b3480156104ea57600080fd5b506102266104f9366004612d33565b611696565b6102e661050c3660046133f0565b6118ff565b34801561051d57600080fd5b5061022661052c366004612e92565b611e83565b34801561053d57600080fd5b506007546104469073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061058d90859085906134fd565b9081526040519081900360200190205460ff1690509392505050565b6105b1611e97565b60075473ffffffffffffffffffffffffffffffffffffffff1615610614576106147f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000611f1a565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106c3576106c37f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61211a565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff90921692916107479061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546107739061350d565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050908060020180546107d59061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546108019061350d565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905083565b610860611e97565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006108b060048361221e565b92915050565b6108be611e97565b6108c88282612231565b5050565b6108d4611e97565b6108f573ffffffffffffffffffffffffffffffffffffffff8416838361238b565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109699061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546109959061350d565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b505050505081526020016003820180546109fb9061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a279061350d565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610af75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610aa2565b505050915250909392505050565b610b0d611e97565b6001610b1a60048461221e565b14610b59576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b698260025b600491906123e1565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610bb19061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd9061350d565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b50505050508152602001600382018054610c439061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f9061350d565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d3f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cea565b5050505081525050905060005b816080015151811015610dce57610dc68383608001518381518110610d7357610d73613560565b60200260200101516020015184608001518481518110610d9557610d95613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661238b9092919063ffffffff16565b600101610d4c565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b50565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f24611e97565b60005b818110156110075760026000848484818110610f4557610f45613560565b9050602002810190610f57919061358f565b610f65906020810190612f30565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9c57610f9c613560565b9050602002810190610fae919061358f565b610fbc9060208101906135cd565b604051610fca9291906134fd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f27565b5060005b838110156110f65760016002600087878581811061102b5761102b613560565b905060200281019061103d919061358f565b61104b906020810190612f30565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061108257611082613560565b9050602002810190611094919061358f565b6110a29060208101906135cd565b6040516110b09291906134fd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161100b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b50565b61117e6040820160208301612f30565b61118b60408301836135cd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e99250849150613632565b9081526040519081900360200190205460ff1661123457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b509190612f1d565b6112446040840160208501612f30565b67ffffffffffffffff8116600090815260026020526040902060018101805461126c9061350d565b1590508061127b5750805460ff165b156112be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112fa908890600401613746565b600060405180830381600087803b15801561131457600080fd5b505af1925050508015611325575060015b6113c5573d808015611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b5061136586356001610b60565b508535600090815260036020526040902086906113828282613b18565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b7908490612f1d565b60405180910390a2506110f6565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b333014611431576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061144060608301836135cd565b81019061144d9190613c12565b905060008160400151600181111561146757611467612d4c565b03611475576108c8826123f6565b60018160400151600181111561148d5761148d612d4c565b036108c85760008082602001518060200190518101906114ad9190613cbe565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611545576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156a5761156a612d4c565b146115a4576040517f3ec8770000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161d611e97565b67ffffffffffffffff851660009081526002602052604090206001810161164585878361389c565b50811561165d576002810161165b83858361389c565b505b805460ff161561168e5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b61169e611e97565b60016116ab60048361221e565b146116e5576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b6116f0816000610b60565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117389061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546117649061350d565b80156117b15780601f10611786576101008083540402835291602001916117b1565b820191906000526020600020905b81548152906001019060200180831161179457829003601f168201915b505050505081526020016003820180546117ca9061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546117f69061350d565b80156118435780601f1061181857610100808354040283529160200191611843565b820191906000526020600020905b81548152906001019060200180831161182657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118c65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611871565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061192b9061350d565b1590508061193a5750805460ff165b1561197d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906119b09061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc9061350d565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611a889061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab49061350d565b8015611b015780601f10611ad657610100808354040283529160200191611b01565b820191906000526020600020905b815481529060010190602001808311611ae457829003601f168201915b5050505050815250905060005b8651811015611c6257611b7e3330898481518110611b2e57611b2e613560565b6020026020010151602001518a8581518110611b4c57611b4c613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127a7909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611bae57611bae613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611c5a57611c5a7f0000000000000000000000000000000000000000000000000000000000000000888381518110611c0b57611c0b613560565b602002602001015160200151898481518110611c2957611c29613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661211a9092919063ffffffff16565b600101611b0e565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611cda908b908690600401613d3f565b602060405180830381865afa158015611cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1b9190613e02565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615611d6157600754611d619073ffffffffffffffffffffffffffffffffffffffff163330846127a7565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615611db0576000611db2565b825b8a856040518463ffffffff1660e01b8152600401611dd1929190613d3f565b60206040518083038185885af1158015611def573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e149190613e02565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611e8b611e97565b611e9481612805565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b50565b565b801580611fba57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613e02565b155b612046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526128fa565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b59190613e02565b6121bf9190613e1b565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506122189085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612098565b50505050565b600061222a8383612a06565b9392505050565b8047101561229b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b50565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122f5576040519150601f19603f3d011682016040523d82523d6000602084013e6122fa565b606091505b50509050806108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612098565b60006123ee848484612a90565b949350505050565b6040805160008082526020820190925281612433565b604080518082019091526000808252602082015281526020019060019003908161240c5790505b50905060006040518060a0016040528084806040019061245391906135cd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124d49288359101613e2e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260075473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600291600091612544918901908901612f30565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020180546125749061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546125a09061350d565b80156125ed5780601f106125c2576101008083540402835291602001916125ed565b820191906000526020600020905b8154815290600101906020018083116125d057829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906126489190612f30565b846040518363ffffffff1660e01b8152600401612666929190613d3f565b602060405180830381865afa158015612683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a79190613e02565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156126fc5760006126fe565b835b61270e6040890160208a01612f30565b866040518463ffffffff1660e01b815260040161272c929190613d3f565b60206040518083038185885af115801561274a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061276f9190613e02565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526122189085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612098565b3373ffffffffffffffffffffffffffffffffffffffff821603612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b50565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061295c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aad9092919063ffffffff16565b8051909150156108f5578080602001905181019061297a9190613e50565b6108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b50565b600081815260028301602052604081205480151580612a2a5750612a2a8484612abc565b61222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b50565b600082815260028401602052604081208290556123ee8484612ac8565b60606123ee8484600085612ad4565b600061222a8383612bed565b600061222a8383612c05565b606082471015612b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b50565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b8f9190613632565b60006040518083038185875af1925050503d8060008114612bcc576040519150601f19603f3d011682016040523d82523d6000602084013e612bd1565b606091505b5091509150612be287838387612c54565b979650505050505050565b6000818152600183016020526040812054151561222a565b6000818152600183016020526040812054612c4c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b0565b5060006108b0565b60608315612cea578251600003612ce35773ffffffffffffffffffffffffffffffffffffffff85163b612ce3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b50565b50816123ee565b6123ee8383815115612cff5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509190612f1d565b600060208284031215612d4557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e9457600080fd5b60008083601f840112612de457600080fd5b50813567ffffffffffffffff811115612dfc57600080fd5b602083019150836020828501011115612e1457600080fd5b9250929050565b600080600060408486031215612e3057600080fd5b8335612e3b81612dbc565b9250602084013567ffffffffffffffff811115612e5757600080fd5b612e6386828701612dd2565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e9457600080fd5b600060208284031215612ea457600080fd5b813561222a81612e70565b60005b83811015612eca578181015183820152602001612eb2565b50506000910152565b60008151808452612eeb816020860160208601612eaf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061222a6020830184612ed3565b600060208284031215612f4257600080fd5b813561222a81612dbc565b8315158152606060208201526000612f686060830185612ed3565b8281036040840152612f7a8185612ed3565b9695505050505050565b60008060408385031215612f9757600080fd5b8235612fa281612e70565b946020939093013593505050565b600080600060608486031215612fc557600080fd5b8335612fd081612e70565b92506020840135612fe081612e70565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613043578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613006565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261308860c0840182612ed3565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130c48383612ed3565b925060808601519150808584030160a0860152506130e28282612ff1565b95945050505050565b600080604083850312156130fe57600080fd5b82359150602083013561311081612e70565b809150509250929050565b60008083601f84011261312d57600080fd5b50813567ffffffffffffffff81111561314557600080fd5b6020830191508360208260051b8501011115612e1457600080fd5b6000806000806040858703121561317657600080fd5b843567ffffffffffffffff8082111561318e57600080fd5b61319a8883890161311b565b909650945060208701359150808211156131b357600080fd5b506131c08782880161311b565b95989497509550505050565b6000602082840312156131de57600080fd5b813567ffffffffffffffff8111156131f557600080fd5b820160a0818503121561222a57600080fd5b60008060008060006060868803121561321f57600080fd5b853561322a81612dbc565b9450602086013567ffffffffffffffff8082111561324757600080fd5b61325389838a01612dd2565b9096509450604088013591508082111561326c57600080fd5b5061327988828901612dd2565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156132dc576132dc61328a565b60405290565b6040516060810167ffffffffffffffff811182821017156132dc576132dc61328a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561334c5761334c61328a565b604052919050565b600067ffffffffffffffff82111561336e5761336e61328a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126133ab57600080fd5b81356133be6133b982613354565b613305565b8181528460208386010111156133d357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561340557600080fd5b833561341081612dbc565b925060208481013567ffffffffffffffff8082111561342e57600080fd5b818701915087601f83011261344257600080fd5b8135818111156134545761345461328a565b613462848260051b01613305565b81815260069190911b8301840190848101908a83111561348157600080fd5b938501935b828510156134cd576040858c03121561349f5760008081fd5b6134a76132b9565b85356134b281612e70565b81528587013587820152825260409094019390850190613486565b9650505060408701359250808311156134e557600080fd5b50506134f38682870161339a565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061352157607f821691505b60208210810361355a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126135c357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261360257600080fd5b83018035915067ffffffffffffffff82111561361d57600080fd5b602001915036819003821315612e1457600080fd5b600082516135c3818460208701612eaf565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261367957600080fd5b830160208101925035905067ffffffffffffffff81111561369957600080fd5b803603821315612e1457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561304357813561371481612e70565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613701565b60208152813560208201526000602083013561376181612dbc565b67ffffffffffffffff808216604085015261377f6040860186613644565b925060a0606086015261379660c0860184836136a8565b9250506137a66060860186613644565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526137dc8583856136a8565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261381557600080fd5b6020928801928301923591508382111561382e57600080fd5b8160061b360383131561384057600080fd5b8685030160a0870152612be28482846136f1565b601f8211156108f5576000816000526020600020601f850160051c8101602086101561387d5750805b601f850160051c820191505b8181101561168e57828155600101613889565b67ffffffffffffffff8311156138b4576138b461328a565b6138c8836138c2835461350d565b83613854565b6000601f84116001811461391a57600085156138e45750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139695786850135825560209485019460019092019101613949565b50868210156139a4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139f081612e70565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a5657613a5661328a565b805483825580841015613ae35760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a9757613a976139b6565b8086168614613aa857613aa86139b6565b5060008360005260206000208360011b81018760011b820191505b80821015613ade578282558284830155600282019150613ac3565b505050505b5060008181526020812083915b8581101561168e57613b0283836139e5565b6040929092019160029190910190600101613af0565b81358155600181016020830135613b2e81612dbc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b6e60408601866135cd565b93509150613b8083836002870161389c565b613b8d60608601866135cd565b93509150613b9f83836003870161389c565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613bd657600080fd5b918401918235915080821115613beb57600080fd5b506020820191508060061b3603821315613c0457600080fd5b612218818360048601613a3d565b600060208284031215613c2457600080fd5b813567ffffffffffffffff80821115613c3c57600080fd5b9083019060608286031215613c5057600080fd5b613c586132e2565b823582811115613c6757600080fd5b613c738782860161339a565b825250602083013582811115613c8857600080fd5b613c948782860161339a565b6020830152506040830135925060028310613cae57600080fd5b6040810192909252509392505050565b60008060408385031215613cd157600080fd5b825167ffffffffffffffff811115613ce857600080fd5b8301601f81018513613cf957600080fd5b8051613d076133b982613354565b818152866020838501011115613d1c57600080fd5b613d2d826020830160208601612eaf565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d6b60e0840182612ed3565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613da78383612ed3565b92506040860151915080858403016080860152613dc48383612ff1565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f7a8282612ed3565b600060208284031215613e1457600080fd5b5051919050565b808201808211156108b0576108b06139b6565b604081526000613e416040830185612ed3565b90508260208301529392505050565b600060208284031215613e6257600080fd5b8151801515811461222a57600080fdfea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -418,16 +418,16 @@ func (_CCIPClient *CCIPClientCallerSession) TypeAndVersion() (string, error) { return _CCIPClient.Contract.TypeAndVersion(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientTransactor) AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "abandonMessage", messageId, receiver) +func (_CCIPClient *CCIPClientTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } -func (_CCIPClient *CCIPClientSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.AbandonMessage(&_CCIPClient.TransactOpts, messageId, receiver) +func (_CCIPClient *CCIPClientSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.AbandonFailedMessage(&_CCIPClient.TransactOpts, messageId, receiver) } -func (_CCIPClient *CCIPClientTransactorSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.AbandonMessage(&_CCIPClient.TransactOpts, messageId, receiver) +func (_CCIPClient *CCIPClientTransactorSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.AbandonFailedMessage(&_CCIPClient.TransactOpts, messageId, receiver) } func (_CCIPClient *CCIPClientTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { @@ -1975,7 +1975,7 @@ type CCIPClientInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) - AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go index 14fb609d47..a7920aa1ff 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var CCIPReceiverMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002a7638038062002a768339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051612879620001fd600039600081816103760152610e5901526128796000f3fe60806040526004361061012d5760003560e01c806379ba5097116100a5578063b0f479a111610074578063d8469e4011610059578063d8469e40146103ba578063e4ca8754146103da578063f2fde38b146103fa57600080fd5b8063b0f479a114610367578063cf6730f81461039a57600080fd5b806379ba5097146102c65780638462a2b9146102db57806385572ffb146102fb5780638da5cb5b1461031b57600080fd5b806341eade46116100fc578063536c6bfa116100e1578063536c6bfa146102595780635e35359e146102795780636939cd971461029957600080fd5b806341eade461461020b5780635075a9d41461022b57600080fd5b80630e958d6b14610139578063181f5a771461016e57806335f170ef146101ba5780633a998eaf146101e957600080fd5b3661013457005b600080fd5b34801561014557600080fd5b50610159610154366004611c88565b61041a565b60405190151581526020015b60405180910390f35b34801561017a57600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101659190611d4b565b3480156101c657600080fd5b506101da6101d5366004611d5e565b610465565b60405161016593929190611d7b565b3480156101f557600080fd5b50610209610204366004611dd4565b61059c565b005b34801561021757600080fd5b50610209610226366004611d5e565b6108b6565b34801561023757600080fd5b5061024b610246366004611e04565b610901565b604051908152602001610165565b34801561026557600080fd5b50610209610274366004611e1d565b610914565b34801561028557600080fd5b50610209610294366004611e49565b61092a565b3480156102a557600080fd5b506102b96102b4366004611e04565b610958565b6040516101659190611e8a565b3480156102d257600080fd5b50610209610b63565b3480156102e757600080fd5b506102096102f6366004611fb6565b610c60565b34801561030757600080fd5b50610209610316366004612022565b610e41565b34801561032757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610165565b34801561037357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610342565b3480156103a657600080fd5b506102096103b5366004612022565b611074565b3480156103c657600080fd5b506102096103d536600461205d565b611173565b3480156103e657600080fd5b506102096103f5366004611e04565b6111f4565b34801561040657600080fd5b506102096104153660046120e0565b611455565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061044990859085906120fd565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161048b9061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546104b79061210d565b80156105045780601f106104d957610100808354040283529160200191610504565b820191906000526020600020905b8154815290600101906020018083116104e757829003601f168201915b5050505050908060020180546105199061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546105459061210d565b80156105925780601f1061056757610100808354040283529160200191610592565b820191906000526020600020905b81548152906001019060200180831161057557829003601f168201915b5050505050905083565b6105a4611469565b60016105b16004846114ec565b146105f0576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6106008260025b600491906114ff565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916106489061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546106749061210d565b80156106c15780601f10610696576101008083540402835291602001916106c1565b820191906000526020600020905b8154815290600101906020018083116106a457829003601f168201915b505050505081526020016003820180546106da9061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546107069061210d565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107d65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610781565b5050505081525050905060005b8160800151518110156108655761085d838360800151838151811061080a5761080a612160565b6020026020010151602001518460800151848151811061082c5761082c612160565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166115149092919063ffffffff16565b6001016107e3565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b6108be611469565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061090e6004836114ec565b92915050565b61091c611469565b61092682826115a1565b5050565b610932611469565b61095373ffffffffffffffffffffffffffffffffffffffff84168383611514565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109c79061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546109f39061210d565b8015610a405780601f10610a1557610100808354040283529160200191610a40565b820191906000526020600020905b815481529060010190602001808311610a2357829003601f168201915b50505050508152602001600382018054610a599061210d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a859061210d565b8015610ad25780601f10610aa757610100808354040283529160200191610ad2565b820191906000526020600020905b815481529060010190602001808311610ab557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b555760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b00565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016105e7565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c68611469565b60005b81811015610d4b5760026000848484818110610c8957610c89612160565b9050602002810190610c9b919061218f565b610ca9906020810190611d5e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610ce057610ce0612160565b9050602002810190610cf2919061218f565b610d009060208101906121cd565b604051610d0e9291906120fd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c6b565b5060005b83811015610e3a57600160026000878785818110610d6f57610d6f612160565b9050602002810190610d81919061218f565b610d8f906020810190611d5e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610dc657610dc6612160565b9050602002810190610dd8919061218f565b610de69060208101906121cd565b604051610df49291906120fd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d4f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb2576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016105e7565b610ec26040820160208301611d5e565b67ffffffffffffffff81166000908152600260205260409020600181018054610eea9061210d565b15905080610ef95750805460ff165b15610f3c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016105e7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f7890869060040161233f565b600060405180830381600087803b158015610f9257600080fd5b505af1925050508015610fa3575060015b611043573d808015610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50610fe3843560016105f7565b508335600090815260036020526040902084906110008282612738565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611035908490611d4b565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b3330146110ad576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110bd6040820160208301611d5e565b6110ca60408301836121cd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111289250849150612838565b9081526040519081900360200190205460ff1661095357806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016105e79190611d4b565b61117b611469565b67ffffffffffffffff85166000908152600260205260409020600181016111a38587836124c4565b5081156111bb57600281016111b98385836124c4565b505b805460ff16156111ec5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016112016004836114ec565b1461123b576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016105e7565b6112468160006105f7565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161128e9061210d565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba9061210d565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b505050505081526020016003820180546113209061210d565b80601f016020809104026020016040519081016040528092919081815260200182805461134c9061210d565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561141c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016113c7565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b61145d611469565b611466816116fb565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105e7565b565b60006114f883836117f0565b9392505050565b600061150c84848461187a565b949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610953908490611897565b8047101561160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016105e7565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611665576040519150601f19603f3d011682016040523d82523d6000602084013e61166a565b606091505b5050905080610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016105e7565b3373ffffffffffffffffffffffffffffffffffffffff82160361177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105e7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611814575061181484846119a3565b6114f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016105e7565b6000828152600284016020526040812082905561150c84846119af565b60006118f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119bb9092919063ffffffff16565b8051909150156109535780806020019051810190611917919061284a565b610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016105e7565b60006114f883836119ca565b60006114f883836119e2565b606061150c8484600085611a31565b600081815260018301602052604081205415156114f8565b6000818152600183016020526040812054611a295750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561090e565b50600061090e565b606082471015611ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016105e7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611aec9190612838565b60006040518083038185875af1925050503d8060008114611b29576040519150601f19603f3d011682016040523d82523d6000602084013e611b2e565b606091505b5091509150611b3f87838387611b4a565b979650505050505050565b60608315611be0578251600003611bd95773ffffffffffffffffffffffffffffffffffffffff85163b611bd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105e7565b508161150c565b61150c8383815115611bf55781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e79190611d4b565b67ffffffffffffffff8116811461146657600080fd5b60008083601f840112611c5157600080fd5b50813567ffffffffffffffff811115611c6957600080fd5b602083019150836020828501011115611c8157600080fd5b9250929050565b600080600060408486031215611c9d57600080fd5b8335611ca881611c29565b9250602084013567ffffffffffffffff811115611cc457600080fd5b611cd086828701611c3f565b9497909650939450505050565b60005b83811015611cf8578181015183820152602001611ce0565b50506000910152565b60008151808452611d19816020860160208601611cdd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006114f86020830184611d01565b600060208284031215611d7057600080fd5b81356114f881611c29565b8315158152606060208201526000611d966060830185611d01565b8281036040840152611da88185611d01565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461146657600080fd5b60008060408385031215611de757600080fd5b823591506020830135611df981611db2565b809150509250929050565b600060208284031215611e1657600080fd5b5035919050565b60008060408385031215611e3057600080fd5b8235611e3b81611db2565b946020939093013593505050565b600080600060608486031215611e5e57600080fd5b8335611e6981611db2565b92506020840135611e7981611db2565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611ec860c0860183611d01565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611f048483611d01565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f65578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611f26565b50979650505050505050565b60008083601f840112611f8357600080fd5b50813567ffffffffffffffff811115611f9b57600080fd5b6020830191508360208260051b8501011115611c8157600080fd5b60008060008060408587031215611fcc57600080fd5b843567ffffffffffffffff80821115611fe457600080fd5b611ff088838901611f71565b9096509450602087013591508082111561200957600080fd5b5061201687828801611f71565b95989497509550505050565b60006020828403121561203457600080fd5b813567ffffffffffffffff81111561204b57600080fd5b820160a081850312156114f857600080fd5b60008060008060006060868803121561207557600080fd5b853561208081611c29565b9450602086013567ffffffffffffffff8082111561209d57600080fd5b6120a989838a01611c3f565b909650945060408801359150808211156120c257600080fd5b506120cf88828901611c3f565b969995985093965092949392505050565b6000602082840312156120f257600080fd5b81356114f881611db2565b8183823760009101908152919050565b600181811c9082168061212157607f821691505b60208210810361215a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126121c357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261220257600080fd5b83018035915067ffffffffffffffff82111561221d57600080fd5b602001915036819003821315611c8157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261226757600080fd5b830160208101925035905067ffffffffffffffff81111561228757600080fd5b803603821315611c8157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561233457813561230281611db2565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016122ef565b509495945050505050565b60208152813560208201526000602083013561235a81611c29565b67ffffffffffffffff80821660408501526123786040860186612232565b925060a0606086015261238f60c086018483612296565b92505061239f6060860186612232565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123d5858385612296565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261240e57600080fd5b6020928801928301923591508382111561242757600080fd5b8160061b360383131561243957600080fd5b8685030160a0870152611b3f8482846122df565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610953576000816000526020600020601f850160051c810160208610156124a55750805b601f850160051c820191505b818110156111ec578281556001016124b1565b67ffffffffffffffff8311156124dc576124dc61244d565b6124f0836124ea835461210d565b8361247c565b6000601f841160018114612542576000851561250c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e3a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125915786850135825560209485019460019092019101612571565b50868210156125cc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216821461263b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561264b81611db2565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156126b1576126b161244d565b805483825580841015612703576126c7816125de565b6126d0856125de565b6000848152602081209283019291909101905b828210156126ff578082558060018301556002820191506126e3565b5050505b5060008181526020812083915b858110156111ec576127228383612640565b6040929092019160029190910190600101612710565b8135815560018101602083013561274e81611c29565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561278e60408601866121cd565b935091506127a08383600287016124c4565b6127ad60608601866121cd565b935091506127bf8383600387016124c4565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126127f657600080fd5b91840191823591508082111561280b57600080fd5b506020820191508060061b360382131561282457600080fd5b612832818360048601612698565b50505050565b600082516121c3818460208701611cdd565b60006020828403121561285c57600080fd5b815180151581146114f857600080fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002a7e38038062002a7e8339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051612881620001fd600039600081816103760152610e5901526128816000f3fe60806040526004361061012d5760003560e01c806379ba5097116100a5578063b0f479a111610074578063d8469e4011610059578063d8469e40146103ba578063e4ca8754146103da578063f2fde38b146103fa57600080fd5b8063b0f479a114610367578063cf6730f81461039a57600080fd5b806379ba5097146102c65780638462a2b9146102db57806385572ffb146102fb5780638da5cb5b1461031b57600080fd5b80635075a9d4116100fc5780635e35359e116100e15780635e35359e146102595780636939cd97146102795780636d62d633146102a657600080fd5b80635075a9d41461020b578063536c6bfa1461023957600080fd5b80630e958d6b14610139578063181f5a771461016e57806335f170ef146101ba57806341eade46146101e957600080fd5b3661013457005b600080fd5b34801561014557600080fd5b50610159610154366004611c90565b61041a565b60405190151581526020015b60405180910390f35b34801561017a57600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101659190611d53565b3480156101c657600080fd5b506101da6101d5366004611d66565b610465565b60405161016593929190611d83565b3480156101f557600080fd5b50610209610204366004611d66565b61059c565b005b34801561021757600080fd5b5061022b610226366004611dba565b6105e7565b604051908152602001610165565b34801561024557600080fd5b50610209610254366004611df5565b6105fa565b34801561026557600080fd5b50610209610274366004611e21565b610610565b34801561028557600080fd5b50610299610294366004611dba565b61063e565b6040516101659190611e62565b3480156102b257600080fd5b506102096102c1366004611f49565b610849565b3480156102d257600080fd5b50610209610b63565b3480156102e757600080fd5b506102096102f6366004611fbe565b610c60565b34801561030757600080fd5b5061020961031636600461202a565b610e41565b34801561032757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610165565b34801561037357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610342565b3480156103a657600080fd5b506102096103b536600461202a565b611074565b3480156103c657600080fd5b506102096103d5366004612065565b611173565b3480156103e657600080fd5b506102096103f5366004611dba565b6111f4565b34801561040657600080fd5b506102096104153660046120e8565b61145d565b67ffffffffffffffff831660009081526002602052604080822090516003909101906104499085908590612105565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161048b90612115565b80601f01602080910402602001604051908101604052809291908181526020018280546104b790612115565b80156105045780601f106104d957610100808354040283529160200191610504565b820191906000526020600020905b8154815290600101906020018083116104e757829003601f168201915b50505050509080600201805461051990612115565b80601f016020809104026020016040519081016040528092919081815260200182805461054590612115565b80156105925780601f1061056757610100808354040283529160200191610592565b820191906000526020600020905b81548152906001019060200180831161057557829003601f168201915b5050505050905083565b6105a4611471565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006105f46004836114f4565b92915050565b610602611471565b61060c8282611507565b5050565b610618611471565b61063973ffffffffffffffffffffffffffffffffffffffff84168383611661565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106ad90612115565b80601f01602080910402602001604051908101604052809291908181526020018280546106d990612115565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050815260200160038201805461073f90612115565b80601f016020809104026020016040519081016040528092919081815260200182805461076b90612115565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561083b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107e6565b505050915250909392505050565b610851611471565b600161085e6004846114f4565b1461089d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108ad8260025b600491906116ee565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916108f590612115565b80601f016020809104026020016040519081016040528092919081815260200182805461092190612115565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b5050505050815260200160038201805461098790612115565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390612115565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a835760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a2e565b5050505081525050905060005b816080015151811015610b1257610b0a8383608001518381518110610ab757610ab7612168565b60200260200101516020015184608001518481518110610ad957610ad9612168565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166116619092919063ffffffff16565b600101610a90565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610894565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c68611471565b60005b81811015610d4b5760026000848484818110610c8957610c89612168565b9050602002810190610c9b9190612197565b610ca9906020810190611d66565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610ce057610ce0612168565b9050602002810190610cf29190612197565b610d009060208101906121d5565b604051610d0e929190612105565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c6b565b5060005b83811015610e3a57600160026000878785818110610d6f57610d6f612168565b9050602002810190610d819190612197565b610d8f906020810190611d66565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610dc657610dc6612168565b9050602002810190610dd89190612197565b610de69060208101906121d5565b604051610df4929190612105565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d4f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb2576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610894565b610ec26040820160208301611d66565b67ffffffffffffffff81166000908152600260205260409020600181018054610eea90612115565b15905080610ef95750805460ff165b15610f3c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610894565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f78908690600401612347565b600060405180830381600087803b158015610f9257600080fd5b505af1925050508015610fa3575060015b611043573d808015610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50610fe3843560016108a4565b508335600090815260036020526040902084906110008282612740565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611035908490611d53565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b3330146110ad576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110bd6040820160208301611d66565b6110ca60408301836121d5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111289250849150612840565b9081526040519081900360200190205460ff1661063957806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108949190611d53565b61117b611471565b67ffffffffffffffff85166000908152600260205260409020600181016111a38587836124cc565b5081156111bb57600281016111b98385836124cc565b505b805460ff16156111ec5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b6111fc611471565b60016112096004836114f4565b14611243576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610894565b61124e8160006108a4565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161129690612115565b80601f01602080910402602001604051908101604052809291908181526020018280546112c290612115565b801561130f5780601f106112e45761010080835404028352916020019161130f565b820191906000526020600020905b8154815290600101906020018083116112f257829003601f168201915b5050505050815260200160038201805461132890612115565b80601f016020809104026020016040519081016040528092919081815260200182805461135490612115565b80156113a15780601f10611376576101008083540402835291602001916113a1565b820191906000526020600020905b81548152906001019060200180831161138457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156114245760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016113cf565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611465611471565b61146e81611703565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610894565b565b600061150083836117f8565b9392505050565b80471015611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610894565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146115cb576040519150601f19603f3d011682016040523d82523d6000602084013e6115d0565b606091505b5050905080610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610894565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610639908490611882565b60006116fb84848461198e565b949350505050565b3373ffffffffffffffffffffffffffffffffffffffff821603611782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610894565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061181c575061181c84846119ab565b611500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610894565b60006118e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119b79092919063ffffffff16565b80519091501561063957808060200190518101906119029190612852565b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610894565b600082815260028401602052604081208290556116fb84846119c6565b600061150083836119d2565b60606116fb84846000856119ea565b60006115008383611b03565b60008181526001830160205260408120541515611500565b606082471015611a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610894565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611aa59190612840565b60006040518083038185875af1925050503d8060008114611ae2576040519150601f19603f3d011682016040523d82523d6000602084013e611ae7565b606091505b5091509150611af887838387611b52565b979650505050505050565b6000818152600183016020526040812054611b4a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f4565b5060006105f4565b60608315611be8578251600003611be15773ffffffffffffffffffffffffffffffffffffffff85163b611be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610894565b50816116fb565b6116fb8383815115611bfd5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108949190611d53565b67ffffffffffffffff8116811461146e57600080fd5b60008083601f840112611c5957600080fd5b50813567ffffffffffffffff811115611c7157600080fd5b602083019150836020828501011115611c8957600080fd5b9250929050565b600080600060408486031215611ca557600080fd5b8335611cb081611c31565b9250602084013567ffffffffffffffff811115611ccc57600080fd5b611cd886828701611c47565b9497909650939450505050565b60005b83811015611d00578181015183820152602001611ce8565b50506000910152565b60008151808452611d21816020860160208601611ce5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115006020830184611d09565b600060208284031215611d7857600080fd5b813561150081611c31565b8315158152606060208201526000611d9e6060830185611d09565b8281036040840152611db08185611d09565b9695505050505050565b600060208284031215611dcc57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461146e57600080fd5b60008060408385031215611e0857600080fd5b8235611e1381611dd3565b946020939093013593505050565b600080600060608486031215611e3657600080fd5b8335611e4181611dd3565b92506020840135611e5181611dd3565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611ea060c0860183611d09565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611edc8483611d09565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f3d578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611efe565b50979650505050505050565b60008060408385031215611f5c57600080fd5b823591506020830135611f6e81611dd3565b809150509250929050565b60008083601f840112611f8b57600080fd5b50813567ffffffffffffffff811115611fa357600080fd5b6020830191508360208260051b8501011115611c8957600080fd5b60008060008060408587031215611fd457600080fd5b843567ffffffffffffffff80821115611fec57600080fd5b611ff888838901611f79565b9096509450602087013591508082111561201157600080fd5b5061201e87828801611f79565b95989497509550505050565b60006020828403121561203c57600080fd5b813567ffffffffffffffff81111561205357600080fd5b820160a0818503121561150057600080fd5b60008060008060006060868803121561207d57600080fd5b853561208881611c31565b9450602086013567ffffffffffffffff808211156120a557600080fd5b6120b189838a01611c47565b909650945060408801359150808211156120ca57600080fd5b506120d788828901611c47565b969995985093965092949392505050565b6000602082840312156120fa57600080fd5b813561150081611dd3565b8183823760009101908152919050565b600181811c9082168061212957607f821691505b602082108103612162577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126121cb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261220a57600080fd5b83018035915067ffffffffffffffff82111561222557600080fd5b602001915036819003821315611c8957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261226f57600080fd5b830160208101925035905067ffffffffffffffff81111561228f57600080fd5b803603821315611c8957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561233c57813561230a81611dd3565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016122f7565b509495945050505050565b60208152813560208201526000602083013561236281611c31565b67ffffffffffffffff8082166040850152612380604086018661223a565b925060a0606086015261239760c08601848361229e565b9250506123a7606086018661223a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123dd85838561229e565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261241657600080fd5b6020928801928301923591508382111561242f57600080fd5b8160061b360383131561244157600080fd5b8685030160a0870152611af88482846122e7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610639576000816000526020600020601f850160051c810160208610156124ad5750805b601f850160051c820191505b818110156111ec578281556001016124b9565b67ffffffffffffffff8311156124e4576124e4612455565b6124f8836124f28354612115565b83612484565b6000601f84116001811461254a57600085156125145750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e3a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125995786850135825560209485019460019092019101612579565b50868210156125d4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612643577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561265381611dd3565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156126b9576126b9612455565b80548382558084101561270b576126cf816125e6565b6126d8856125e6565b6000848152602081209283019291909101905b82821015612707578082558060018301556002820191506126eb565b5050505b5060008181526020812083915b858110156111ec5761272a8383612648565b6040929092019160029190910190600101612718565b8135815560018101602083013561275681611c31565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561279660408601866121d5565b935091506127a88383600287016124cc565b6127b560608601866121d5565b935091506127c78383600387016124cc565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126127fe57600080fd5b91840191823591508082111561281357600080fd5b506020820191508060061b360382131561282c57600080fd5b61283a8183600486016126a0565b50505050565b600082516121cb818460208701611ce5565b60006020828403121561286457600080fd5b8151801515811461150057600080fdfea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -352,16 +352,16 @@ func (_CCIPReceiver *CCIPReceiverCallerSession) TypeAndVersion() (string, error) return _CCIPReceiver.Contract.TypeAndVersion(&_CCIPReceiver.CallOpts) } -func (_CCIPReceiver *CCIPReceiverTransactor) AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _CCIPReceiver.contract.Transact(opts, "abandonMessage", messageId, receiver) +func (_CCIPReceiver *CCIPReceiverTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } -func (_CCIPReceiver *CCIPReceiverSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _CCIPReceiver.Contract.AbandonMessage(&_CCIPReceiver.TransactOpts, messageId, receiver) +func (_CCIPReceiver *CCIPReceiverSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.AbandonFailedMessage(&_CCIPReceiver.TransactOpts, messageId, receiver) } -func (_CCIPReceiver *CCIPReceiverTransactorSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _CCIPReceiver.Contract.AbandonMessage(&_CCIPReceiver.TransactOpts, messageId, receiver) +func (_CCIPReceiver *CCIPReceiverTransactorSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.AbandonFailedMessage(&_CCIPReceiver.TransactOpts, messageId, receiver) } func (_CCIPReceiver *CCIPReceiverTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { @@ -1349,7 +1349,7 @@ type CCIPReceiverInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) - AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index d8f1e57c05..cba0ab7ac8 100644 --- a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go +++ b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var PingPongDemoMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620046b7380380620046b7833981016040819052620000349162000563565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c4816200013f565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013357620001336001600160a01b03821683600019620001ea565b50505050505062000688565b336001600160a01b03821603620001995760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002629190620005a2565b6200026e9190620005bc565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002ca91869190620002d016565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031f906001600160a01b038516908490620003a6565b805190915015620003a15780806020019051810190620003409190620005e4565b620003a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003b78484600085620003bf565b949350505050565b606082471015620004225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b0316858760405162000440919062000635565b60006040518083038185875af1925050503d80600081146200047f576040519150601f19603f3d011682016040523d82523d6000602084013e62000484565b606091505b5090925090506200049887838387620004a3565b979650505050505050565b60608315620005175782516000036200050f576001600160a01b0385163b6200050f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003b7565b620003b783838151156200052e5781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000653565b6001600160a01b03811681146200056057600080fd5b50565b600080604083850312156200057757600080fd5b825162000584816200054a565b602084015190925062000597816200054a565b809150509250929050565b600060208284031215620005b557600080fd5b5051919050565b80820180821115620005de57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f757600080fd5b815180151581146200060857600080fd5b9392505050565b60005b838110156200062c57818101518382015260200162000612565b50506000910152565b60008251620006498184602087016200060f565b9190910192915050565b6020815260008251806020840152620006748160408501602087016200060f565b601f01601f19169190910160400192915050565b608051613fe9620006ce6000396000818161057e01528181610759015281816107e9015281816113730152818161202b015281816120f401526121cc0152613fe96000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b5a1101111610095578063e4ca875411610064578063e4ca875414610663578063e89b448514610683578063f2fde38b14610696578063ff2deec3146106b657600080fd5b8063b5a11011146105da578063bee518a4146105fa578063cf6730f814610623578063d8469e401461064357600080fd5b80638da5cb5b116100d15780638da5cb5b146105245780639d2aede51461054f578063b0f479a11461056f578063b187bd26146105a257600080fd5b80636fef519e1461048657806379ba5097146104cf5780638462a2b9146104e457806385572ffb1461050457600080fd5b80632b6e5d631161017a5780635075a9d4116101495780635075a9d4146103eb578063536c6bfa146104195780635e35359e146104395780636939cd971461045957600080fd5b80632b6e5d631461032457806335f170ef1461037c5780633a998eaf146103ab57806341eade46146103cb57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004612ede565b60086020526000908152604090205460ff1681565b6040516102259190612ef7565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612f97565b6106e3565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e61027936600461300e565b61072e565b005b34801561028c57600080fd5b5061027e61029b366004613039565b6108a6565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906130c4565b3480156102fb57600080fd5b5061027e61030a3660046130d7565b610900565b34801561031b57600080fd5b5061027e610943565b34801561033057600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046130d7565b61097f565b604051610225939291906130f4565b3480156103b757600080fd5b5061027e6103c636600461312b565b610ab6565b3480156103d757600080fd5b5061027e6103e63660046130d7565b610dd0565b3480156103f757600080fd5b5061040b610406366004612ede565b610e1b565b604051908152602001610225565b34801561042557600080fd5b5061027e61043436600461315b565b610e2e565b34801561044557600080fd5b5061027e610454366004613187565b610e44565b34801561046557600080fd5b50610479610474366004612ede565b610e72565b6040516102259190613225565b34801561049257600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104db57600080fd5b5061027e61107d565b3480156104f057600080fd5b5061027e6104ff366004613307565b61117a565b34801561051057600080fd5b5061027e61051f366004613373565b61135b565b34801561053057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055b57600080fd5b5061027e61056a36600461300e565b611656565b34801561057b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156105ae57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105e657600080fd5b5061027e6105f53660046133ae565b611710565b34801561060657600080fd5b5060095460405167ffffffffffffffff9091168152602001610225565b34801561062f57600080fd5b5061027e61063e366004613373565b611883565b34801561064f57600080fd5b5061027e61065e3660046133dc565b611a70565b34801561066f57600080fd5b5061027e61067e366004612ede565b611aef565b61040b610691366004613594565b611d50565b3480156106a257600080fd5b5061027e6106b136600461300e565b6122d4565b3480156106c257600080fd5b506007546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071290859085906136a1565b9081526040519081900360200190205460ff1690509392505050565b6107366122e8565b60075473ffffffffffffffffffffffffffffffffffffffff1615610799576107997f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000612369565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610848576108487f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612569565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ae6122e8565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109086122e8565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61094b6122e8565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097d600161266d565b565b6002602052600090815260409020805460018201805460ff90921692916109a5906136b1565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906136b1565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806002018054610a33906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f906136b1565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905083565b610abe6122e8565b6001610acb60048461277a565b14610b0a576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b1a8260025b6004919061278d565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610b62906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8e906136b1565b8015610bdb5780601f10610bb057610100808354040283529160200191610bdb565b820191906000526020600020905b815481529060010190602001808311610bbe57829003601f168201915b50505050508152602001600382018054610bf4906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c20906136b1565b8015610c6d5780601f10610c4257610100808354040283529160200191610c6d565b820191906000526020600020905b815481529060010190602001808311610c5057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610cf05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c9b565b5050505081525050905060005b816080015151811015610d7f57610d778383608001518381518110610d2457610d24613704565b60200260200101516020015184608001518481518110610d4657610d46613704565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127a29092919063ffffffff16565b600101610cfd565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b610dd86122e8565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610e2860048361277a565b92915050565b610e366122e8565b610e4082826127f8565b5050565b610e4c6122e8565b610e6d73ffffffffffffffffffffffffffffffffffffffff841683836127a2565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ee1906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0d906136b1565b8015610f5a5780601f10610f2f57610100808354040283529160200191610f5a565b820191906000526020600020905b815481529060010190602001808311610f3d57829003601f168201915b50505050508152602001600382018054610f73906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9f906136b1565b8015610fec5780601f10610fc157610100808354040283529160200191610fec565b820191906000526020600020905b815481529060010190602001808311610fcf57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161101a565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b01565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111826122e8565b60005b8181101561126557600260008484848181106111a3576111a3613704565b90506020028101906111b59190613733565b6111c39060208101906130d7565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111fa576111fa613704565b905060200281019061120c9190613733565b61121a906020810190613771565b6040516112289291906136a1565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611185565b5060005b838110156113545760016002600087878581811061128957611289613704565b905060200281019061129b9190613733565b6112a99060208101906130d7565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112e0576112e0613704565b90506020028101906112f29190613733565b611300906020810190613771565b60405161130e9291906136a1565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611269565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113cc576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b01565b6113dc60408201602083016130d7565b6113e96040830183613771565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061144792508491506137d6565b9081526040519081900360200190205460ff1661149257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b0191906130c4565b6114a260408401602085016130d7565b67ffffffffffffffff811660009081526002602052604090206001810180546114ca906136b1565b159050806114d95750805460ff165b1561151c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b01565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115589088906004016138ea565b600060405180830381600087803b15801561157257600080fd5b505af1925050508015611583575060015b611623573d8080156115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b506115c386356001610b11565b508535600090815260036020526040902086906115e08282613cbc565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116159084906130c4565b60405180910390a250611354565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165e6122e8565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610e409082613db6565b6117186122e8565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d3916137d6565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610e6d9082613db6565b3330146118bc576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118cc60408201602083016130d7565b6118d96040830183613771565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061193792508491506137d6565b9081526040519081900360200190205460ff1661198257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b0191906130c4565b61199260408401602085016130d7565b67ffffffffffffffff811660009081526002602052604090206001810180546119ba906136b1565b159050806119c95750805460ff165b15611a0c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b01565b6000611a1b6060870187613771565b810190611a289190612ede565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6857611a68611a63826001613ed0565b61266d565b505050505050565b611a786122e8565b67ffffffffffffffff8516600090815260026020526040902060018101611aa0858783613a40565b508115611ab85760028101611ab6838583613a40565b505b805460ff1615611a685780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611afc60048361277a565b14611b36576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b01565b611b41816000610b11565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b89906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb5906136b1565b8015611c025780601f10611bd757610100808354040283529160200191611c02565b820191906000526020600020905b815481529060010190602001808311611be557829003601f168201915b50505050508152602001600382018054611c1b906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c47906136b1565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611d175760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611cc2565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611d7c906136b1565b15905080611d8b5750805460ff165b15611dce576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b01565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e01906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2d906136b1565b8015611e7a5780601f10611e4f57610100808354040283529160200191611e7a565b820191906000526020600020905b815481529060010190602001808311611e5d57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611ed9906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f05906136b1565b8015611f525780601f10611f2757610100808354040283529160200191611f52565b820191906000526020600020905b815481529060010190602001808311611f3557829003601f168201915b5050505050815250905060005b86518110156120b357611fcf3330898481518110611f7f57611f7f613704565b6020026020010151602001518a8581518110611f9d57611f9d613704565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612952909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611fff57611fff613704565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120ab576120ab7f000000000000000000000000000000000000000000000000000000000000000088838151811061205c5761205c613704565b60200260200101516020015189848151811061207a5761207a613704565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125699092919063ffffffff16565b600101611f5f565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded9061212b908b908690600401613ee3565b602060405180830381865afa158015612148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216c9190613fa6565b60075490915073ffffffffffffffffffffffffffffffffffffffff16156121b2576007546121b29073ffffffffffffffffffffffffffffffffffffffff16333084612952565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615612201576000612203565b825b8a856040518463ffffffff1660e01b8152600401612222929190613ee3565b60206040518083038185885af1158015612240573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122659190613fa6565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6122dc6122e8565b6122e5816129b0565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b01565b80158061240957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124079190613fa6565b155b612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b01565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610e6d9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612aa5565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126049190613fa6565b61260e9190613ed0565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506126679085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016124e7565b50505050565b806001166001036126b0576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126e4565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b6000816040516020016126f991815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610e6d9267ffffffffffffffff90911691612773565b604080518082019091526000808252602082015281526020019060019003908161274c5790505b5083611d50565b60006127868383612bb1565b9392505050565b600061279a848484612c3b565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610e6d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124e7565b80471015612862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b01565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146128bc576040519150601f19603f3d011682016040523d82523d6000602084013e6128c1565b606091505b5050905080610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b01565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526126679085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016124e7565b3373ffffffffffffffffffffffffffffffffffffffff821603612a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b01565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b07826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c589092919063ffffffff16565b805190915015610e6d5780806020019051810190612b259190613fbf565b610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b01565b600081815260028301602052604081205480151580612bd55750612bd58484612c67565b612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b01565b6000828152600284016020526040812082905561279a8484612c73565b606061279a8484600085612c7f565b60006127868383612d98565b60006127868383612db0565b606082471015612d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b01565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d3a91906137d6565b60006040518083038185875af1925050503d8060008114612d77576040519150601f19603f3d011682016040523d82523d6000602084013e612d7c565b606091505b5091509150612d8d87838387612dff565b979650505050505050565b60008181526001830160205260408120541515612786565b6000818152600183016020526040812054612df757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e28565b506000610e28565b60608315612e95578251600003612e8e5773ffffffffffffffffffffffffffffffffffffffff85163b612e8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b01565b508161279a565b61279a8383815115612eaa5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0191906130c4565b600060208284031215612ef057600080fd5b5035919050565b6020810160038310612f32577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146122e557600080fd5b60008083601f840112612f6057600080fd5b50813567ffffffffffffffff811115612f7857600080fd5b602083019150836020828501011115612f9057600080fd5b9250929050565b600080600060408486031215612fac57600080fd5b8335612fb781612f38565b9250602084013567ffffffffffffffff811115612fd357600080fd5b612fdf86828701612f4e565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122e557600080fd5b60006020828403121561302057600080fd5b813561278681612fec565b80151581146122e557600080fd5b60006020828403121561304b57600080fd5b81356127868161302b565b60005b83811015613071578181015183820152602001613059565b50506000910152565b60008151808452613092816020860160208601613056565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612786602083018461307a565b6000602082840312156130e957600080fd5b813561278681612f38565b831515815260606020820152600061310f606083018561307a565b8281036040840152613121818561307a565b9695505050505050565b6000806040838503121561313e57600080fd5b82359150602083013561315081612fec565b809150509250929050565b6000806040838503121561316e57600080fd5b823561317981612fec565b946020939093013593505050565b60008060006060848603121561319c57600080fd5b83356131a781612fec565b925060208401356131b781612fec565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561321a578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016131dd565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261325f60c084018261307a565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261329b838361307a565b925060808601519150808584030160a0860152506132b982826131c8565b95945050505050565b60008083601f8401126132d457600080fd5b50813567ffffffffffffffff8111156132ec57600080fd5b6020830191508360208260051b8501011115612f9057600080fd5b6000806000806040858703121561331d57600080fd5b843567ffffffffffffffff8082111561333557600080fd5b613341888389016132c2565b9096509450602087013591508082111561335a57600080fd5b50613367878288016132c2565b95989497509550505050565b60006020828403121561338557600080fd5b813567ffffffffffffffff81111561339c57600080fd5b820160a0818503121561278657600080fd5b600080604083850312156133c157600080fd5b82356133cc81612f38565b9150602083013561315081612fec565b6000806000806000606086880312156133f457600080fd5b85356133ff81612f38565b9450602086013567ffffffffffffffff8082111561341c57600080fd5b61342889838a01612f4e565b9096509450604088013591508082111561344157600080fd5b5061344e88828901612f4e565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156134b1576134b161345f565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134fe576134fe61345f565b604052919050565b600082601f83011261351757600080fd5b813567ffffffffffffffff8111156135315761353161345f565b61356260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134b7565b81815284602083860101111561357757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156135a957600080fd5b83356135b481612f38565b925060208481013567ffffffffffffffff808211156135d257600080fd5b818701915087601f8301126135e657600080fd5b8135818111156135f8576135f861345f565b613606848260051b016134b7565b81815260069190911b8301840190848101908a83111561362557600080fd5b938501935b82851015613671576040858c0312156136435760008081fd5b61364b61348e565b853561365681612fec565b8152858701358782015282526040909401939085019061362a565b96505050604087013592508083111561368957600080fd5b505061369786828701613506565b9150509250925092565b8183823760009101908152919050565b600181811c908216806136c557607f821691505b6020821081036136fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261376757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137a657600080fd5b83018035915067ffffffffffffffff8211156137c157600080fd5b602001915036819003821315612f9057600080fd5b60008251613767818460208701613056565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261381d57600080fd5b830160208101925035905067ffffffffffffffff81111561383d57600080fd5b803603821315612f9057600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561321a5781356138b881612fec565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016138a5565b60208152813560208201526000602083013561390581612f38565b67ffffffffffffffff808216604085015261392360408601866137e8565b925060a0606086015261393a60c08601848361384c565b92505061394a60608601866137e8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261398085838561384c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126139b957600080fd5b602092880192830192359150838211156139d257600080fd5b8160061b36038313156139e457600080fd5b8685030160a0870152612d8d848284613895565b601f821115610e6d576000816000526020600020601f850160051c81016020861015613a215750805b601f850160051c820191505b81811015611a6857828155600101613a2d565b67ffffffffffffffff831115613a5857613a5861345f565b613a6c83613a6683546136b1565b836139f8565b6000601f841160018114613abe5760008515613a885750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611354565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b0d5786850135825560209485019460019092019101613aed565b5086821015613b48577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b9481612fec565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613bfa57613bfa61345f565b805483825580841015613c875760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613c3b57613c3b613b5a565b8086168614613c4c57613c4c613b5a565b5060008360005260206000208360011b81018760011b820191505b80821015613c82578282558284830155600282019150613c67565b505050505b5060008181526020812083915b85811015611a6857613ca68383613b89565b6040929092019160029190910190600101613c94565b81358155600181016020830135613cd281612f38565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d126040860186613771565b93509150613d24838360028701613a40565b613d316060860186613771565b93509150613d43838360038701613a40565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d7a57600080fd5b918401918235915080821115613d8f57600080fd5b506020820191508060061b3603821315613da857600080fd5b612667818360048601613be1565b815167ffffffffffffffff811115613dd057613dd061345f565b613de481613dde84546136b1565b846139f8565b602080601f831160018114613e375760008415613e015750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a68565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e8457888601518255948401946001909101908401613e65565b5085821015613ec057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610e2857610e28613b5a565b67ffffffffffffffff83168152604060208201526000825160a06040840152613f0f60e084018261307a565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613f4b838361307a565b92506040860151915080858403016080860152613f6883836131c8565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613121828261307a565b600060208284031215613fb857600080fd5b5051919050565b600060208284031215613fd157600080fd5b81516127868161302b56fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620046bf380380620046bf833981016040819052620000349162000563565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c4816200013f565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013357620001336001600160a01b03821683600019620001ea565b50505050505062000688565b336001600160a01b03821603620001995760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002629190620005a2565b6200026e9190620005bc565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002ca91869190620002d016565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031f906001600160a01b038516908490620003a6565b805190915015620003a15780806020019051810190620003409190620005e4565b620003a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003b78484600085620003bf565b949350505050565b606082471015620004225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b0316858760405162000440919062000635565b60006040518083038185875af1925050503d80600081146200047f576040519150601f19603f3d011682016040523d82523d6000602084013e62000484565b606091505b5090925090506200049887838387620004a3565b979650505050505050565b60608315620005175782516000036200050f576001600160a01b0385163b6200050f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003b7565b620003b783838151156200052e5781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000653565b6001600160a01b03811681146200056057600080fd5b50565b600080604083850312156200057757600080fd5b825162000584816200054a565b602084015190925062000597816200054a565b809150509250929050565b600060208284031215620005b557600080fd5b5051919050565b80820180821115620005de57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f757600080fd5b815180151581146200060857600080fd5b9392505050565b60005b838110156200062c57818101518382015260200162000612565b50506000910152565b60008251620006498184602087016200060f565b9190910192915050565b6020815260008251806020840152620006748160408501602087016200060f565b601f01601f19169190910160400192915050565b608051613ff1620006ce6000396000818161057e01528181610759015281816107e90152818161137301528181612033015281816120fc01526121d40152613ff16000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b5a1101111610095578063e4ca875411610064578063e4ca875414610663578063e89b448514610683578063f2fde38b14610696578063ff2deec3146106b657600080fd5b8063b5a11011146105da578063bee518a4146105fa578063cf6730f814610623578063d8469e401461064357600080fd5b80638da5cb5b116100d15780638da5cb5b146105245780639d2aede51461054f578063b0f479a11461056f578063b187bd26146105a257600080fd5b80636fef519e1461048657806379ba5097146104cf5780638462a2b9146104e457806385572ffb1461050457600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f95780635e35359e146104195780636939cd97146104395780636d62d6331461046657600080fd5b80632b6e5d631461032457806335f170ef1461037c57806341eade46146103ab5780635075a9d4146103cb57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004612ee6565b60086020526000908152604090205460ff1681565b6040516102259190612eff565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612f9f565b6106e3565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e610279366004613016565b61072e565b005b34801561028c57600080fd5b5061027e61029b366004613041565b6108a6565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906130cc565b3480156102fb57600080fd5b5061027e61030a3660046130df565b610900565b34801561031b57600080fd5b5061027e610943565b34801561033057600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046130df565b61097f565b604051610225939291906130fc565b3480156103b757600080fd5b5061027e6103c63660046130df565b610ab6565b3480156103d757600080fd5b506103eb6103e6366004612ee6565b610b01565b604051908152602001610225565b34801561040557600080fd5b5061027e610414366004613133565b610b14565b34801561042557600080fd5b5061027e61043436600461315f565b610b2a565b34801561044557600080fd5b50610459610454366004612ee6565b610b58565b60405161022591906131fd565b34801561047257600080fd5b5061027e61048136600461329a565b610d63565b34801561049257600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104db57600080fd5b5061027e61107d565b3480156104f057600080fd5b5061027e6104ff36600461330f565b61117a565b34801561051057600080fd5b5061027e61051f36600461337b565b61135b565b34801561053057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055b57600080fd5b5061027e61056a366004613016565b611656565b34801561057b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156105ae57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105e657600080fd5b5061027e6105f53660046133b6565b611710565b34801561060657600080fd5b5060095460405167ffffffffffffffff9091168152602001610225565b34801561062f57600080fd5b5061027e61063e36600461337b565b611883565b34801561064f57600080fd5b5061027e61065e3660046133e4565b611a70565b34801561066f57600080fd5b5061027e61067e366004612ee6565b611aef565b6103eb61069136600461359c565b611d58565b3480156106a257600080fd5b5061027e6106b1366004613016565b6122dc565b3480156106c257600080fd5b506007546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071290859085906136a9565b9081526040519081900360200190205460ff1690509392505050565b6107366122f0565b60075473ffffffffffffffffffffffffffffffffffffffff1615610799576107997f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000612371565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610848576108487f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612571565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ae6122f0565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109086122f0565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61094b6122f0565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097d6001612675565b565b6002602052600090815260409020805460018201805460ff90921692916109a5906136b9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906136b9565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806002018054610a33906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f906136b9565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905083565b610abe6122f0565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610b0e600483612782565b92915050565b610b1c6122f0565b610b268282612795565b5050565b610b326122f0565b610b5373ffffffffffffffffffffffffffffffffffffffff841683836128ef565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610bc7906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf3906136b9565b8015610c405780601f10610c1557610100808354040283529160200191610c40565b820191906000526020600020905b815481529060010190602001808311610c2357829003601f168201915b50505050508152602001600382018054610c59906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c85906136b9565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d555760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d00565b505050915250909392505050565b610d6b6122f0565b6001610d78600484612782565b14610db7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610dc78260025b60049190612945565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610e0f906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b906136b9565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b50505050508152602001600382018054610ea1906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecd906136b9565b8015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f9d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f48565b5050505081525050905060005b81608001515181101561102c576110248383608001518381518110610fd157610fd161370c565b60200260200101516020015184608001518481518110610ff357610ff361370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128ef9092919063ffffffff16565b600101610faa565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610dae565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111826122f0565b60005b8181101561126557600260008484848181106111a3576111a361370c565b90506020028101906111b5919061373b565b6111c39060208101906130df565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111fa576111fa61370c565b905060200281019061120c919061373b565b61121a906020810190613779565b6040516112289291906136a9565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611185565b5060005b83811015611354576001600260008787858181106112895761128961370c565b905060200281019061129b919061373b565b6112a99060208101906130df565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112e0576112e061370c565b90506020028101906112f2919061373b565b611300906020810190613779565b60405161130e9291906136a9565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611269565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113cc576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610dae565b6113dc60408201602083016130df565b6113e96040830183613779565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061144792508491506137de565b9081526040519081900360200190205460ff1661149257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b6114a260408401602085016130df565b67ffffffffffffffff811660009081526002602052604090206001810180546114ca906136b9565b159050806114d95750805460ff165b1561151c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115589088906004016138f2565b600060405180830381600087803b15801561157257600080fd5b505af1925050508015611583575060015b611623573d8080156115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b506115c386356001610dbe565b508535600090815260036020526040902086906115e08282613cc4565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116159084906130cc565b60405180910390a250611354565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165e6122f0565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610b269082613dbe565b6117186122f0565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d3916137de565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610b539082613dbe565b3330146118bc576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118cc60408201602083016130df565b6118d96040830183613779565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061193792508491506137de565b9081526040519081900360200190205460ff1661198257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b61199260408401602085016130df565b67ffffffffffffffff811660009081526002602052604090206001810180546119ba906136b9565b159050806119c95750805460ff165b15611a0c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6000611a1b6060870187613779565b810190611a289190612ee6565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6857611a68611a63826001613ed8565b612675565b505050505050565b611a786122f0565b67ffffffffffffffff8516600090815260026020526040902060018101611aa0858783613a48565b508115611ab85760028101611ab6838583613a48565b505b805460ff1615611a685780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b611af76122f0565b6001611b04600483612782565b14611b3e576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610dae565b611b49816000610dbe565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b91906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbd906136b9565b8015611c0a5780601f10611bdf57610100808354040283529160200191611c0a565b820191906000526020600020905b815481529060010190602001808311611bed57829003601f168201915b50505050508152602001600382018054611c23906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f906136b9565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611d1f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611cca565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611d84906136b9565b15905080611d935750805460ff165b15611dd6576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e09906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e35906136b9565b8015611e825780601f10611e5757610100808354040283529160200191611e82565b820191906000526020600020905b815481529060010190602001808311611e6557829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611ee1906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0d906136b9565b8015611f5a5780601f10611f2f57610100808354040283529160200191611f5a565b820191906000526020600020905b815481529060010190602001808311611f3d57829003601f168201915b5050505050815250905060005b86518110156120bb57611fd73330898481518110611f8757611f8761370c565b6020026020010151602001518a8581518110611fa557611fa561370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661295a909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106120075761200761370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120b3576120b37f00000000000000000000000000000000000000000000000000000000000000008883815181106120645761206461370c565b6020026020010151602001518984815181106120825761208261370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125719092919063ffffffff16565b600101611f67565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90612133908b908690600401613eeb565b602060405180830381865afa158015612150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121749190613fae565b60075490915073ffffffffffffffffffffffffffffffffffffffff16156121ba576007546121ba9073ffffffffffffffffffffffffffffffffffffffff1633308461295a565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f991161561220957600061220b565b825b8a856040518463ffffffff1660e01b815260040161222a929190613eeb565b60206040518083038185885af1158015612248573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061226d9190613fae565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6122e46122f0565b6122ed816129b8565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610dae565b80158061241157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190613fae565b155b61249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612aad565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260c9190613fae565b6126169190613ed8565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061266f9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016124ef565b50505050565b806001166001036126b8576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126ec565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161270191815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610b539267ffffffffffffffff9091169161277b565b60408051808201909152600080825260208201528152602001906001900390816127545790505b5083611d58565b600061278e8383612bb9565b9392505050565b804710156127ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dae565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612859576040519150601f19603f3d011682016040523d82523d6000602084013e61285e565b606091505b5050905080610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124ef565b6000612952848484612c43565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261266f9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016124ef565b3373ffffffffffffffffffffffffffffffffffffffff821603612a37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610dae565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c609092919063ffffffff16565b805190915015610b535780806020019051810190612b2d9190613fc7565b610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dae565b600081815260028301602052604081205480151580612bdd5750612bdd8484612c6f565b61278e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610dae565b600082815260028401602052604081208290556129528484612c7b565b60606129528484600085612c87565b600061278e8383612da0565b600061278e8383612db8565b606082471015612d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dae565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d4291906137de565b60006040518083038185875af1925050503d8060008114612d7f576040519150601f19603f3d011682016040523d82523d6000602084013e612d84565b606091505b5091509150612d9587838387612e07565b979650505050505050565b6000818152600183016020526040812054151561278e565b6000818152600183016020526040812054612dff57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0e565b506000610b0e565b60608315612e9d578251600003612e965773ffffffffffffffffffffffffffffffffffffffff85163b612e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dae565b5081612952565b6129528383815115612eb25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b600060208284031215612ef857600080fd5b5035919050565b6020810160038310612f3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146122ed57600080fd5b60008083601f840112612f6857600080fd5b50813567ffffffffffffffff811115612f8057600080fd5b602083019150836020828501011115612f9857600080fd5b9250929050565b600080600060408486031215612fb457600080fd5b8335612fbf81612f40565b9250602084013567ffffffffffffffff811115612fdb57600080fd5b612fe786828701612f56565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122ed57600080fd5b60006020828403121561302857600080fd5b813561278e81612ff4565b80151581146122ed57600080fd5b60006020828403121561305357600080fd5b813561278e81613033565b60005b83811015613079578181015183820152602001613061565b50506000910152565b6000815180845261309a81602086016020860161305e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061278e6020830184613082565b6000602082840312156130f157600080fd5b813561278e81612f40565b83151581526060602082015260006131176060830185613082565b82810360408401526131298185613082565b9695505050505050565b6000806040838503121561314657600080fd5b823561315181612ff4565b946020939093013593505050565b60008060006060848603121561317457600080fd5b833561317f81612ff4565b9250602084013561318f81612ff4565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156131f2578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016131b5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261323760c0840182613082565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526132738383613082565b925060808601519150808584030160a08601525061329182826131a0565b95945050505050565b600080604083850312156132ad57600080fd5b8235915060208301356132bf81612ff4565b809150509250929050565b60008083601f8401126132dc57600080fd5b50813567ffffffffffffffff8111156132f457600080fd5b6020830191508360208260051b8501011115612f9857600080fd5b6000806000806040858703121561332557600080fd5b843567ffffffffffffffff8082111561333d57600080fd5b613349888389016132ca565b9096509450602087013591508082111561336257600080fd5b5061336f878288016132ca565b95989497509550505050565b60006020828403121561338d57600080fd5b813567ffffffffffffffff8111156133a457600080fd5b820160a0818503121561278e57600080fd5b600080604083850312156133c957600080fd5b82356133d481612f40565b915060208301356132bf81612ff4565b6000806000806000606086880312156133fc57600080fd5b853561340781612f40565b9450602086013567ffffffffffffffff8082111561342457600080fd5b61343089838a01612f56565b9096509450604088013591508082111561344957600080fd5b5061345688828901612f56565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156134b9576134b9613467565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561350657613506613467565b604052919050565b600082601f83011261351f57600080fd5b813567ffffffffffffffff81111561353957613539613467565b61356a60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134bf565b81815284602083860101111561357f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156135b157600080fd5b83356135bc81612f40565b925060208481013567ffffffffffffffff808211156135da57600080fd5b818701915087601f8301126135ee57600080fd5b81358181111561360057613600613467565b61360e848260051b016134bf565b81815260069190911b8301840190848101908a83111561362d57600080fd5b938501935b82851015613679576040858c03121561364b5760008081fd5b613653613496565b853561365e81612ff4565b81528587013587820152825260409094019390850190613632565b96505050604087013592508083111561369157600080fd5b505061369f8682870161350e565b9150509250925092565b8183823760009101908152919050565b600181811c908216806136cd57607f821691505b602082108103613706577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261376f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137ae57600080fd5b83018035915067ffffffffffffffff8211156137c957600080fd5b602001915036819003821315612f9857600080fd5b6000825161376f81846020870161305e565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261382557600080fd5b830160208101925035905067ffffffffffffffff81111561384557600080fd5b803603821315612f9857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156131f25781356138c081612ff4565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016138ad565b60208152813560208201526000602083013561390d81612f40565b67ffffffffffffffff808216604085015261392b60408601866137f0565b925060a0606086015261394260c086018483613854565b92505061395260608601866137f0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613988858385613854565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126139c157600080fd5b602092880192830192359150838211156139da57600080fd5b8160061b36038313156139ec57600080fd5b8685030160a0870152612d9584828461389d565b601f821115610b53576000816000526020600020601f850160051c81016020861015613a295750805b601f850160051c820191505b81811015611a6857828155600101613a35565b67ffffffffffffffff831115613a6057613a60613467565b613a7483613a6e83546136b9565b83613a00565b6000601f841160018114613ac65760008515613a905750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611354565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b155786850135825560209485019460019092019101613af5565b5086821015613b50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b9c81612ff4565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c0257613c02613467565b805483825580841015613c8f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613c4357613c43613b62565b8086168614613c5457613c54613b62565b5060008360005260206000208360011b81018760011b820191505b80821015613c8a578282558284830155600282019150613c6f565b505050505b5060008181526020812083915b85811015611a6857613cae8383613b91565b6040929092019160029190910190600101613c9c565b81358155600181016020830135613cda81612f40565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d1a6040860186613779565b93509150613d2c838360028701613a48565b613d396060860186613779565b93509150613d4b838360038701613a48565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d8257600080fd5b918401918235915080821115613d9757600080fd5b506020820191508060061b3603821315613db057600080fd5b61266f818360048601613be9565b815167ffffffffffffffff811115613dd857613dd8613467565b613dec81613de684546136b9565b84613a00565b602080601f831160018114613e3f5760008415613e095750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a68565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e8c57888601518255948401946001909101908401613e6d565b5085821015613ec857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610b0e57610b0e613b62565b67ffffffffffffffff83168152604060208201526000825160a06040840152613f1760e0840182613082565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613f538383613082565b92506040860151915080858403016080860152613f7083836131a0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506131298282613082565b600060208284031215613fc057600080fd5b5051919050565b600060208284031215613fd957600080fd5b815161278e8161303356fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -484,16 +484,16 @@ func (_PingPongDemo *PingPongDemoCallerSession) TypeAndVersion() (string, error) return _PingPongDemo.Contract.TypeAndVersion(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoTransactor) AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "abandonMessage", messageId, receiver) +func (_PingPongDemo *PingPongDemoTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } -func (_PingPongDemo *PingPongDemoSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.AbandonMessage(&_PingPongDemo.TransactOpts, messageId, receiver) +func (_PingPongDemo *PingPongDemoSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.AbandonFailedMessage(&_PingPongDemo.TransactOpts, messageId, receiver) } -func (_PingPongDemo *PingPongDemoTransactorSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.AbandonMessage(&_PingPongDemo.TransactOpts, messageId, receiver) +func (_PingPongDemo *PingPongDemoTransactorSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.AbandonFailedMessage(&_PingPongDemo.TransactOpts, messageId, receiver) } func (_PingPongDemo *PingPongDemoTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { @@ -2353,7 +2353,7 @@ type PingPongDemoInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) - AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go index 148996927d..19865a5b71 100644 --- a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go +++ b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var SelfFundedPingPongMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162004c3338038062004c33833981016040819052620000349162000591565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200016d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013557620001356001600160a01b0382168360001962000218565b5050505050508060026200014a919062000600565b6009601d6101000a81548160ff021916908360ff16021790555050505062000700565b336001600160a01b03821603620001c75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000626565b6200029c919062000640565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002f891869190620002fe16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200034d906001600160a01b038516908490620003d4565b805190915015620003cf57808060200190518101906200036e91906200065c565b620003cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003e58484600085620003ed565b949350505050565b606082471015620004505760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200046e9190620006ad565b60006040518083038185875af1925050503d8060008114620004ad576040519150601f19603f3d011682016040523d82523d6000602084013e620004b2565b606091505b509092509050620004c687838387620004d1565b979650505050505050565b60608315620005455782516000036200053d576001600160a01b0385163b6200053d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003e5565b620003e583838151156200055c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006cb565b6001600160a01b03811681146200058e57600080fd5b50565b600080600060608486031215620005a757600080fd5b8351620005b48162000578565b6020850151909350620005c78162000578565b604085015190925060ff81168114620005df57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200061f576200061f620005ea565b5092915050565b6000602082840312156200063957600080fd5b5051919050565b80820180821115620006565762000656620005ea565b92915050565b6000602082840312156200066f57600080fd5b815180151581146200068057600080fd5b9392505050565b60005b83811015620006a45781810151838201526020016200068a565b50506000910152565b60008251620006c181846020870162000687565b9190910192915050565b6020815260008251806020840152620006ec81604085016020870162000687565b601f01601f19169190910160400192915050565b6080516144df62000754600039600081816105e601528181610827015281816108b701528181611441015281816117bf015281816122dd015281816123a60152818161247e0152612b7001526144df6000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e14610744578063f2fde38b14610764578063ff2deec31461078457600080fd5b8063e6c725f5146106eb578063e89b44851461073157600080fd5b8063bee518a414610662578063cf6730f81461068b578063d8469e40146106ab578063e4ca8754146106cb57600080fd5b80639d2aede5116100ec5780639d2aede5146105b7578063b0f479a1146105d7578063b187bd261461060a578063b5a110111461064257600080fd5b80638462a2b91461052c57806385572ffb1461054c5780638da5cb5b1461056c5780638f491cba1461059757600080fd5b806335f170ef116101b0578063536c6bfa1161017f5780636939cd97116101645780636939cd97146104a15780636fef519e146104ce57806379ba50971461051757600080fd5b8063536c6bfa146104615780635e35359e1461048157600080fd5b806335f170ef146103c45780633a998eaf146103f357806341eade46146104135780635075a9d41461043357600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b50610259610244366004613359565b60086020526000908152604090205460ff1681565b6040516102669190613372565b60405180910390f35b34801561027b57600080fd5b5061028f61028a366004613412565b6107b1565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613489565b6107fc565b005b3480156102cd57600080fd5b506102bf6102dc3660046134b4565b610974565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b604051610266919061353f565b34801561034357600080fd5b506102bf610352366004613552565b6109ce565b34801561036357600080fd5b506102bf610a11565b34801561037857600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613552565b610a4d565b6040516102669392919061356f565b3480156103ff57600080fd5b506102bf61040e3660046135a6565b610b84565b34801561041f57600080fd5b506102bf61042e366004613552565b610e9e565b34801561043f57600080fd5b5061045361044e366004613359565b610ee9565b604051908152602001610266565b34801561046d57600080fd5b506102bf61047c3660046135d6565b610efc565b34801561048d57600080fd5b506102bf61049c366004613602565b610f12565b3480156104ad57600080fd5b506104c16104bc366004613359565b610f40565b60405161026691906136a0565b3480156104da57600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052357600080fd5b506102bf61114b565b34801561053857600080fd5b506102bf610547366004613782565b611248565b34801561055857600080fd5b506102bf6105673660046137ee565b611429565b34801561057857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a357600080fd5b506102bf6105b2366004613359565b611724565b3480156105c357600080fd5b506102bf6105d2366004613489565b611908565b3480156105e357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039f565b34801561061657600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064e57600080fd5b506102bf61065d366004613829565b6119c2565b34801561066e57600080fd5b5060095460405167ffffffffffffffff9091168152602001610266565b34801561069757600080fd5b506102bf6106a63660046137ee565b611b35565b3480156106b757600080fd5b506102bf6106c6366004613857565b611d22565b3480156106d757600080fd5b506102bf6106e6366004613359565b611da1565b3480156106f757600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b61045361073f366004613a0f565b612002565b34801561075057600080fd5b506102bf61075f366004613b1c565b612586565b34801561077057600080fd5b506102bf61077f366004613489565b612617565b34801561079057600080fd5b5060075461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107e09085908590613b3f565b9081526040519081900360200190205460ff1690509392505050565b610804612628565b60075473ffffffffffffffffffffffffffffffffffffffff1615610867576108677f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff169060006126a9565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610916576109167f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128a9565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61097c612628565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109d6612628565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a19612628565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4b60016129ad565b565b6002602052600090815260409020805460018201805460ff9092169291610a7390613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613b4f565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505090806002018054610b0190613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613b4f565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905083565b610b8c612628565b6001610b99600484612bf5565b14610bd8576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610be88260025b60049190612c08565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c3090613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5c90613b4f565b8015610ca95780601f10610c7e57610100808354040283529160200191610ca9565b820191906000526020600020905b815481529060010190602001808311610c8c57829003601f168201915b50505050508152602001600382018054610cc290613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cee90613b4f565b8015610d3b5780601f10610d1057610100808354040283529160200191610d3b565b820191906000526020600020905b815481529060010190602001808311610d1e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610dbe5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d69565b5050505081525050905060005b816080015151811015610e4d57610e458383608001518381518110610df257610df2613ba2565b60200260200101516020015184608001518481518110610e1457610e14613ba2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c1d9092919063ffffffff16565b600101610dcb565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b610ea6612628565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610ef6600483612bf5565b92915050565b610f04612628565b610f0e8282612c73565b5050565b610f1a612628565b610f3b73ffffffffffffffffffffffffffffffffffffffff84168383612c1d565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610faf90613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdb90613b4f565b80156110285780601f10610ffd57610100808354040283529160200191611028565b820191906000526020600020905b81548152906001019060200180831161100b57829003601f168201915b5050505050815260200160038201805461104190613b4f565b80601f016020809104026020016040519081016040528092919081815260200182805461106d90613b4f565b80156110ba5780601f1061108f576101008083540402835291602001916110ba565b820191906000526020600020905b81548152906001019060200180831161109d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561113d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016110e8565b505050915250909392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610bcf565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611250612628565b60005b81811015611333576002600084848481811061127157611271613ba2565b90506020028101906112839190613bd1565b611291906020810190613552565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c8576112c8613ba2565b90506020028101906112da9190613bd1565b6112e8906020810190613c0f565b6040516112f6929190613b3f565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611253565b5060005b838110156114225760016002600087878581811061135757611357613ba2565b90506020028101906113699190613bd1565b611377906020810190613552565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ae576113ae613ba2565b90506020028101906113c09190613bd1565b6113ce906020810190613c0f565b6040516113dc929190613b3f565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611337565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461149a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610bcf565b6114aa6040820160208301613552565b6114b76040830183613c0f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115159250849150613c74565b9081526040519081900360200190205460ff1661156057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bcf919061353f565b6115706040840160208501613552565b67ffffffffffffffff8116600090815260026020526040902060018101805461159890613b4f565b159050806115a75750805460ff165b156115ea576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bcf565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611626908890600401613d88565b600060405180830381600087803b15801561164057600080fd5b505af1925050508015611651575060015b6116f1573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5061169186356001610bdf565b508535600090815260036020526040902086906116ae828261415a565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e390849061353f565b60405180910390a250611422565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177c57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117845750565b6009546001906117b8907d010000000000000000000000000000000000000000000000000000000000900460ff1683614254565b11611905577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c919061428f565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c357600080fd5b505af11580156118d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611910612628565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610f0e90826142ac565b6119ca612628565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8591613c74565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610f3b90826142ac565b333014611b6e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e6040820160208301613552565b611b8b6040830183613c0f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be99250849150613c74565b9081526040519081900360200190205460ff16611c3457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bcf919061353f565b611c446040840160208501613552565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6c90613b4f565b15905080611c7b5750805460ff165b15611cbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bcf565b6000611ccd6060870187613c0f565b810190611cda9190613359565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1a57611d1a611d158260016143c6565b6129ad565b505050505050565b611d2a612628565b67ffffffffffffffff8516600090815260026020526040902060018101611d52858783613ede565b508115611d6a5760028101611d68838583613ede565b505b805460ff1615611d1a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611dae600483612bf5565b14611de8576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610bcf565b611df3816000610bdf565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e3b90613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6790613b4f565b8015611eb45780601f10611e8957610100808354040283529160200191611eb4565b820191906000526020600020905b815481529060010190602001808311611e9757829003601f168201915b50505050508152602001600382018054611ecd90613b4f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990613b4f565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fc95760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f74565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061202e90613b4f565b1590508061203d5750805460ff165b15612080576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bcf565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906120b390613b4f565b80601f01602080910402602001604051908101604052809291908181526020018280546120df90613b4f565b801561212c5780601f106121015761010080835404028352916020019161212c565b820191906000526020600020905b81548152906001019060200180831161210f57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526002928390522001805460809092019161218b90613b4f565b80601f01602080910402602001604051908101604052809291908181526020018280546121b790613b4f565b80156122045780601f106121d957610100808354040283529160200191612204565b820191906000526020600020905b8154815290600101906020018083116121e757829003601f168201915b5050505050815250905060005b865181101561236557612281333089848151811061223157612231613ba2565b6020026020010151602001518a858151811061224f5761224f613ba2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dcd909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106122b1576122b1613ba2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461235d5761235d7f000000000000000000000000000000000000000000000000000000000000000088838151811061230e5761230e613ba2565b60200260200101516020015189848151811061232c5761232c613ba2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128a99092919063ffffffff16565b600101612211565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906123dd908b9086906004016143d9565b602060405180830381865afa1580156123fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241e919061449c565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615612464576007546124649073ffffffffffffffffffffffffffffffffffffffff16333084612dcd565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156124b35760006124b5565b825b8a856040518463ffffffff1660e01b81526004016124d49291906143d9565b60206040518083038185885af11580156124f2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612517919061449c565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61258e612628565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b61261f612628565b61190581612e2b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bcf565b80158061274957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612723573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612747919061449c565b155b6127d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610bcf565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610f3b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f20565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612920573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612944919061449c565b61294e91906143c6565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129a79085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612827565b50505050565b806001166001036129f0576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a24565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a2d81611724565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a9191815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612b0b57816020015b6040805180820190915260008082526020820152815260200190600190039081612ae45790505b50815260075473ffffffffffffffffffffffffffffffffffffffff908116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f991612bb29167ffffffffffffffff9091169085906004016143d9565b6020604051808303816000875af1158015612bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b919061449c565b6000612c01838361302c565b9392505050565b6000612c158484846130b6565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610f3b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612827565b80471015612cdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bcf565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612d37576040519150601f19603f3d011682016040523d82523d6000602084013e612d3c565b606091505b5050905080610f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bcf565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129a79085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612827565b3373ffffffffffffffffffffffffffffffffffffffff821603612eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bcf565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612f82826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130d39092919063ffffffff16565b805190915015610f3b5780806020019051810190612fa091906144b5565b610f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bcf565b600081815260028301602052604081205480151580613050575061305084846130e2565b612c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610bcf565b60008281526002840160205260408120829055612c1584846130ee565b6060612c1584846000856130fa565b6000612c018383613213565b6000612c01838361322b565b60608247101561318c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bcf565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131b59190613c74565b60006040518083038185875af1925050503d80600081146131f2576040519150601f19603f3d011682016040523d82523d6000602084013e6131f7565b606091505b50915091506132088783838761327a565b979650505050505050565b60008181526001830160205260408120541515612c01565b600081815260018301602052604081205461327257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ef6565b506000610ef6565b606083156133105782516000036133095773ffffffffffffffffffffffffffffffffffffffff85163b613309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bcf565b5081612c15565b612c1583838151156133255781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf919061353f565b60006020828403121561336b57600080fd5b5035919050565b60208101600383106133ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190557600080fd5b60008083601f8401126133db57600080fd5b50813567ffffffffffffffff8111156133f357600080fd5b60208301915083602082850101111561340b57600080fd5b9250929050565b60008060006040848603121561342757600080fd5b8335613432816133b3565b9250602084013567ffffffffffffffff81111561344e57600080fd5b61345a868287016133c9565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190557600080fd5b60006020828403121561349b57600080fd5b8135612c0181613467565b801515811461190557600080fd5b6000602082840312156134c657600080fd5b8135612c01816134a6565b60005b838110156134ec5781810151838201526020016134d4565b50506000910152565b6000815180845261350d8160208601602086016134d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0160208301846134f5565b60006020828403121561356457600080fd5b8135612c01816133b3565b831515815260606020820152600061358a60608301856134f5565b828103604084015261359c81856134f5565b9695505050505050565b600080604083850312156135b957600080fd5b8235915060208301356135cb81613467565b809150509250929050565b600080604083850312156135e957600080fd5b82356135f481613467565b946020939093013593505050565b60008060006060848603121561361757600080fd5b833561362281613467565b9250602084013561363281613467565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613695578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613658565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136da60c08401826134f5565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261371683836134f5565b925060808601519150808584030160a0860152506137348282613643565b95945050505050565b60008083601f84011261374f57600080fd5b50813567ffffffffffffffff81111561376757600080fd5b6020830191508360208260051b850101111561340b57600080fd5b6000806000806040858703121561379857600080fd5b843567ffffffffffffffff808211156137b057600080fd5b6137bc8883890161373d565b909650945060208701359150808211156137d557600080fd5b506137e28782880161373d565b95989497509550505050565b60006020828403121561380057600080fd5b813567ffffffffffffffff81111561381757600080fd5b820160a08185031215612c0157600080fd5b6000806040838503121561383c57600080fd5b8235613847816133b3565b915060208301356135cb81613467565b60008060008060006060868803121561386f57600080fd5b853561387a816133b3565b9450602086013567ffffffffffffffff8082111561389757600080fd5b6138a389838a016133c9565b909650945060408801359150808211156138bc57600080fd5b506138c9888289016133c9565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561392c5761392c6138da565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613979576139796138da565b604052919050565b600082601f83011261399257600080fd5b813567ffffffffffffffff8111156139ac576139ac6138da565b6139dd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613932565b8181528460208386010111156139f257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a2457600080fd5b8335613a2f816133b3565b925060208481013567ffffffffffffffff80821115613a4d57600080fd5b818701915087601f830112613a6157600080fd5b813581811115613a7357613a736138da565b613a81848260051b01613932565b81815260069190911b8301840190848101908a831115613aa057600080fd5b938501935b82851015613aec576040858c031215613abe5760008081fd5b613ac6613909565b8535613ad181613467565b81528587013587820152825260409094019390850190613aa5565b965050506040870135925080831115613b0457600080fd5b5050613b1286828701613981565b9150509250925092565b600060208284031215613b2e57600080fd5b813560ff81168114612c0157600080fd5b8183823760009101908152919050565b600181811c90821680613b6357607f821691505b602082108103613b9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c0557600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c4457600080fd5b83018035915067ffffffffffffffff821115613c5f57600080fd5b60200191503681900382131561340b57600080fd5b60008251613c058184602087016134d1565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cbb57600080fd5b830160208101925035905067ffffffffffffffff811115613cdb57600080fd5b80360382131561340b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613695578135613d5681613467565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d43565b602081528135602082015260006020830135613da3816133b3565b67ffffffffffffffff8082166040850152613dc16040860186613c86565b925060a06060860152613dd860c086018483613cea565b925050613de86060860186613c86565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e1e858385613cea565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e5757600080fd5b60209288019283019235915083821115613e7057600080fd5b8160061b3603831315613e8257600080fd5b8685030160a0870152613208848284613d33565b601f821115610f3b576000816000526020600020601f850160051c81016020861015613ebf5750805b601f850160051c820191505b81811015611d1a57828155600101613ecb565b67ffffffffffffffff831115613ef657613ef66138da565b613f0a83613f048354613b4f565b83613e96565b6000601f841160018114613f5c5760008515613f265750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611422565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fab5786850135825560209485019460019092019101613f8b565b5086821015613fe6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561403281613467565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115614098576140986138da565b8054838255808410156141255760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140d9576140d9613ff8565b80861686146140ea576140ea613ff8565b5060008360005260206000208360011b81018760011b820191505b80821015614120578282558284830155600282019150614105565b505050505b5060008181526020812083915b85811015611d1a576141448383614027565b6040929092019160029190910190600101614132565b81358155600181016020830135614170816133b3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141b06040860186613c0f565b935091506141c2838360028701613ede565b6141cf6060860186613c0f565b935091506141e1838360038701613ede565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261421857600080fd5b91840191823591508082111561422d57600080fd5b506020820191508060061b360382131561424657600080fd5b6129a781836004860161407f565b60008261428a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142a157600080fd5b8151612c0181613467565b815167ffffffffffffffff8111156142c6576142c66138da565b6142da816142d48454613b4f565b84613e96565b602080601f83116001811461432d57600084156142f75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d1a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561437a5788860151825594840194600190910190840161435b565b50858210156143b657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610ef657610ef6613ff8565b67ffffffffffffffff83168152604060208201526000825160a0604084015261440560e08401826134f5565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261444183836134f5565b9250604086015191508085840301608086015261445e8383613643565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061359c82826134f5565b6000602082840312156144ae57600080fd5b5051919050565b6000602082840312156144c757600080fd5b8151612c01816134a656fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162004c3b38038062004c3b833981016040819052620000349162000591565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200016d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013557620001356001600160a01b0382168360001962000218565b5050505050508060026200014a919062000600565b6009601d6101000a81548160ff021916908360ff16021790555050505062000700565b336001600160a01b03821603620001c75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000626565b6200029c919062000640565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002f891869190620002fe16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200034d906001600160a01b038516908490620003d4565b805190915015620003cf57808060200190518101906200036e91906200065c565b620003cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003e58484600085620003ed565b949350505050565b606082471015620004505760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200046e9190620006ad565b60006040518083038185875af1925050503d8060008114620004ad576040519150601f19603f3d011682016040523d82523d6000602084013e620004b2565b606091505b509092509050620004c687838387620004d1565b979650505050505050565b60608315620005455782516000036200053d576001600160a01b0385163b6200053d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003e5565b620003e583838151156200055c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006cb565b6001600160a01b03811681146200058e57600080fd5b50565b600080600060608486031215620005a757600080fd5b8351620005b48162000578565b6020850151909350620005c78162000578565b604085015190925060ff81168114620005df57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200061f576200061f620005ea565b5092915050565b6000602082840312156200063957600080fd5b5051919050565b80820180821115620006565762000656620005ea565b92915050565b6000602082840312156200066f57600080fd5b815180151581146200068057600080fd5b9392505050565b60005b83811015620006a45781810151838201526020016200068a565b50506000910152565b60008251620006c181846020870162000687565b9190910192915050565b6020815260008251806020840152620006ec81604085016020870162000687565b601f01601f19169190910160400192915050565b6080516144e762000754600039600081816105e601528181610827015281816108b701528181611441015281816117bf015281816122e5015281816123ae015281816124860152612b7801526144e76000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e14610744578063f2fde38b14610764578063ff2deec31461078457600080fd5b8063e6c725f5146106eb578063e89b44851461073157600080fd5b8063bee518a414610662578063cf6730f81461068b578063d8469e40146106ab578063e4ca8754146106cb57600080fd5b80639d2aede5116100ec5780639d2aede5146105b7578063b0f479a1146105d7578063b187bd261461060a578063b5a110111461064257600080fd5b80638462a2b91461052c57806385572ffb1461054c5780638da5cb5b1461056c5780638f491cba1461059757600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ae5780636fef519e146104ce57806379ba50971461051757600080fd5b80635e35359e146104615780636939cd971461048157600080fd5b806335f170ef146103c457806341eade46146103f35780635075a9d414610413578063536c6bfa1461044157600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b50610259610244366004613361565b60086020526000908152604090205460ff1681565b604051610266919061337a565b60405180910390f35b34801561027b57600080fd5b5061028f61028a36600461341a565b6107b1565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613491565b6107fc565b005b3480156102cd57600080fd5b506102bf6102dc3660046134bc565b610974565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613547565b34801561034357600080fd5b506102bf61035236600461355a565b6109ce565b34801561036357600080fd5b506102bf610a11565b34801561037857600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df36600461355a565b610a4d565b60405161026693929190613577565b3480156103ff57600080fd5b506102bf61040e36600461355a565b610b84565b34801561041f57600080fd5b5061043361042e366004613361565b610bcf565b604051908152602001610266565b34801561044d57600080fd5b506102bf61045c3660046135ae565b610be2565b34801561046d57600080fd5b506102bf61047c3660046135da565b610bf8565b34801561048d57600080fd5b506104a161049c366004613361565b610c26565b6040516102669190613678565b3480156104ba57600080fd5b506102bf6104c9366004613715565b610e31565b3480156104da57600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052357600080fd5b506102bf61114b565b34801561053857600080fd5b506102bf61054736600461378a565b611248565b34801561055857600080fd5b506102bf6105673660046137f6565b611429565b34801561057857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a357600080fd5b506102bf6105b2366004613361565b611724565b3480156105c357600080fd5b506102bf6105d2366004613491565b611908565b3480156105e357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039f565b34801561061657600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064e57600080fd5b506102bf61065d366004613831565b6119c2565b34801561066e57600080fd5b5060095460405167ffffffffffffffff9091168152602001610266565b34801561069757600080fd5b506102bf6106a63660046137f6565b611b35565b3480156106b757600080fd5b506102bf6106c636600461385f565b611d22565b3480156106d757600080fd5b506102bf6106e6366004613361565b611da1565b3480156106f757600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b61043361073f366004613a17565b61200a565b34801561075057600080fd5b506102bf61075f366004613b24565b61258e565b34801561077057600080fd5b506102bf61077f366004613491565b61261f565b34801561079057600080fd5b5060075461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107e09085908590613b47565b9081526040519081900360200190205460ff1690509392505050565b610804612630565b60075473ffffffffffffffffffffffffffffffffffffffff1615610867576108677f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff169060006126b1565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610916576109167f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128b1565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61097c612630565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109d6612630565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a19612630565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4b60016129b5565b565b6002602052600090815260409020805460018201805460ff9092169291610a7390613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613b57565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505090806002018054610b0190613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613b57565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905083565b610b8c612630565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610bdc600483612bfd565b92915050565b610bea612630565b610bf48282612c10565b5050565b610c00612630565b610c2173ffffffffffffffffffffffffffffffffffffffff84168383612d6a565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c9590613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613b57565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b50505050508152602001600382018054610d2790613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5390613b57565b8015610da05780601f10610d7557610100808354040283529160200191610da0565b820191906000526020600020905b815481529060010190602001808311610d8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dce565b505050915250909392505050565b610e39612630565b6001610e46600484612bfd565b14610e85576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610e958260025b60049190612dc0565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610edd90613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990613b57565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b50505050508152602001600382018054610f6f90613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b90613b57565b8015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611016565b5050505081525050905060005b8160800151518110156110fa576110f2838360800151838151811061109f5761109f613baa565b602002602001015160200151846080015184815181106110c1576110c1613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d6a9092919063ffffffff16565b600101611078565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e7c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611250612630565b60005b81811015611333576002600084848481811061127157611271613baa565b90506020028101906112839190613bd9565b61129190602081019061355a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c8576112c8613baa565b90506020028101906112da9190613bd9565b6112e8906020810190613c17565b6040516112f6929190613b47565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611253565b5060005b838110156114225760016002600087878581811061135757611357613baa565b90506020028101906113699190613bd9565b61137790602081019061355a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ae576113ae613baa565b90506020028101906113c09190613bd9565b6113ce906020810190613c17565b6040516113dc929190613b47565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611337565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461149a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e7c565b6114aa604082016020830161355a565b6114b76040830183613c17565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115159250849150613c7c565b9081526040519081900360200190205460ff1661156057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b611570604084016020850161355a565b67ffffffffffffffff8116600090815260026020526040902060018101805461159890613b57565b159050806115a75750805460ff165b156115ea576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611626908890600401613d90565b600060405180830381600087803b15801561164057600080fd5b505af1925050508015611651575060015b6116f1573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5061169186356001610e8c565b508535600090815260036020526040902086906116ae8282614162565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e3908490613547565b60405180910390a250611422565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177c57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117845750565b6009546001906117b8907d010000000000000000000000000000000000000000000000000000000000900460ff168361425c565b11611905577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c9190614297565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c357600080fd5b505af11580156118d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611910612630565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610bf490826142b4565b6119ca612630565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8591613c7c565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610c2190826142b4565b333014611b6e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e604082016020830161355a565b611b8b6040830183613c17565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be99250849150613c7c565b9081526040519081900360200190205460ff16611c3457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b611c44604084016020850161355a565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6c90613b57565b15905080611c7b5750805460ff165b15611cbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6000611ccd6060870187613c17565b810190611cda9190613361565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1a57611d1a611d158260016143ce565b6129b5565b505050505050565b611d2a612630565b67ffffffffffffffff8516600090815260026020526040902060018101611d52858783613ee6565b508115611d6a5760028101611d68838583613ee6565b505b805460ff1615611d1a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b611da9612630565b6001611db6600483612bfd565b14611df0576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e7c565b611dfb816000610e8c565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e4390613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6f90613b57565b8015611ebc5780601f10611e9157610100808354040283529160200191611ebc565b820191906000526020600020905b815481529060010190602001808311611e9f57829003601f168201915b50505050508152602001600382018054611ed590613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0190613b57565b8015611f4e5780601f10611f2357610100808354040283529160200191611f4e565b820191906000526020600020905b815481529060010190602001808311611f3157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fd15760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f7c565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061203690613b57565b159050806120455750805460ff165b15612088576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906120bb90613b57565b80601f01602080910402602001604051908101604052809291908181526020018280546120e790613b57565b80156121345780601f1061210957610100808354040283529160200191612134565b820191906000526020600020905b81548152906001019060200180831161211757829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526002928390522001805460809092019161219390613b57565b80601f01602080910402602001604051908101604052809291908181526020018280546121bf90613b57565b801561220c5780601f106121e15761010080835404028352916020019161220c565b820191906000526020600020905b8154815290600101906020018083116121ef57829003601f168201915b5050505050815250905060005b865181101561236d57612289333089848151811061223957612239613baa565b6020026020010151602001518a858151811061225757612257613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dd5909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106122b9576122b9613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614612365576123657f000000000000000000000000000000000000000000000000000000000000000088838151811061231657612316613baa565b60200260200101516020015189848151811061233457612334613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128b19092919063ffffffff16565b600101612219565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906123e5908b9086906004016143e1565b602060405180830381865afa158015612402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242691906144a4565b60075490915073ffffffffffffffffffffffffffffffffffffffff161561246c5760075461246c9073ffffffffffffffffffffffffffffffffffffffff16333084612dd5565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156124bb5760006124bd565b825b8a856040518463ffffffff1660e01b81526004016124dc9291906143e1565b60206040518083038185885af11580156124fa573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061251f91906144a4565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612596612630565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612627612630565b61190581612e33565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e7c565b80158061275157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561272b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274f91906144a4565b155b6127dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f28565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294c91906144a4565b61295691906143ce565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129af9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161282f565b50505050565b806001166001036129f8576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a2c565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a3581611724565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a9991815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612b1357816020015b6040805180820190915260008082526020820152815260200190600190039081612aec5790505b50815260075473ffffffffffffffffffffffffffffffffffffffff908116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f991612bba9167ffffffffffffffff9091169085906004016143e1565b6020604051808303816000875af1158015612bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2191906144a4565b6000612c098383613034565b9392505050565b80471015612c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e7c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612cd4576040519150601f19603f3d011682016040523d82523d6000602084013e612cd9565b606091505b5050905080610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161282f565b6000612dcd8484846130be565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129af9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161282f565b3373ffffffffffffffffffffffffffffffffffffffff821603612eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e7c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612f8a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130db9092919063ffffffff16565b805190915015610c215780806020019051810190612fa891906144bd565b610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e7c565b600081815260028301602052604081205480151580613058575061305884846130ea565b612c09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610e7c565b60008281526002840160205260408120829055612dcd84846130f6565b6060612dcd8484600085613102565b6000612c09838361321b565b6000612c098383613233565b606082471015613194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e7c565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131bd9190613c7c565b60006040518083038185875af1925050503d80600081146131fa576040519150601f19603f3d011682016040523d82523d6000602084013e6131ff565b606091505b509150915061321087838387613282565b979650505050505050565b60008181526001830160205260408120541515612c09565b600081815260018301602052604081205461327a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bdc565b506000610bdc565b606083156133185782516000036133115773ffffffffffffffffffffffffffffffffffffffff85163b613311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e7c565b5081612dcd565b612dcd838381511561332d5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b60006020828403121561337357600080fd5b5035919050565b60208101600383106133b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190557600080fd5b60008083601f8401126133e357600080fd5b50813567ffffffffffffffff8111156133fb57600080fd5b60208301915083602082850101111561341357600080fd5b9250929050565b60008060006040848603121561342f57600080fd5b833561343a816133bb565b9250602084013567ffffffffffffffff81111561345657600080fd5b613462868287016133d1565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190557600080fd5b6000602082840312156134a357600080fd5b8135612c098161346f565b801515811461190557600080fd5b6000602082840312156134ce57600080fd5b8135612c09816134ae565b60005b838110156134f45781810151838201526020016134dc565b50506000910152565b600081518084526135158160208601602086016134d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0960208301846134fd565b60006020828403121561356c57600080fd5b8135612c09816133bb565b831515815260606020820152600061359260608301856134fd565b82810360408401526135a481856134fd565b9695505050505050565b600080604083850312156135c157600080fd5b82356135cc8161346f565b946020939093013593505050565b6000806000606084860312156135ef57600080fd5b83356135fa8161346f565b9250602084013561360a8161346f565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561366d578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613630565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136b260c08401826134fd565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136ee83836134fd565b925060808601519150808584030160a08601525061370c828261361b565b95945050505050565b6000806040838503121561372857600080fd5b82359150602083013561373a8161346f565b809150509250929050565b60008083601f84011261375757600080fd5b50813567ffffffffffffffff81111561376f57600080fd5b6020830191508360208260051b850101111561341357600080fd5b600080600080604085870312156137a057600080fd5b843567ffffffffffffffff808211156137b857600080fd5b6137c488838901613745565b909650945060208701359150808211156137dd57600080fd5b506137ea87828801613745565b95989497509550505050565b60006020828403121561380857600080fd5b813567ffffffffffffffff81111561381f57600080fd5b820160a08185031215612c0957600080fd5b6000806040838503121561384457600080fd5b823561384f816133bb565b9150602083013561373a8161346f565b60008060008060006060868803121561387757600080fd5b8535613882816133bb565b9450602086013567ffffffffffffffff8082111561389f57600080fd5b6138ab89838a016133d1565b909650945060408801359150808211156138c457600080fd5b506138d1888289016133d1565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613934576139346138e2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613981576139816138e2565b604052919050565b600082601f83011261399a57600080fd5b813567ffffffffffffffff8111156139b4576139b46138e2565b6139e560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161393a565b8181528460208386010111156139fa57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a2c57600080fd5b8335613a37816133bb565b925060208481013567ffffffffffffffff80821115613a5557600080fd5b818701915087601f830112613a6957600080fd5b813581811115613a7b57613a7b6138e2565b613a89848260051b0161393a565b81815260069190911b8301840190848101908a831115613aa857600080fd5b938501935b82851015613af4576040858c031215613ac65760008081fd5b613ace613911565b8535613ad98161346f565b81528587013587820152825260409094019390850190613aad565b965050506040870135925080831115613b0c57600080fd5b5050613b1a86828701613989565b9150509250925092565b600060208284031215613b3657600080fd5b813560ff81168114612c0957600080fd5b8183823760009101908152919050565b600181811c90821680613b6b57607f821691505b602082108103613ba4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c0d57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c4c57600080fd5b83018035915067ffffffffffffffff821115613c6757600080fd5b60200191503681900382131561341357600080fd5b60008251613c0d8184602087016134d9565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cc357600080fd5b830160208101925035905067ffffffffffffffff811115613ce357600080fd5b80360382131561341357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561366d578135613d5e8161346f565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d4b565b602081528135602082015260006020830135613dab816133bb565b67ffffffffffffffff8082166040850152613dc96040860186613c8e565b925060a06060860152613de060c086018483613cf2565b925050613df06060860186613c8e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e26858385613cf2565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e5f57600080fd5b60209288019283019235915083821115613e7857600080fd5b8160061b3603831315613e8a57600080fd5b8685030160a0870152613210848284613d3b565b601f821115610c21576000816000526020600020601f850160051c81016020861015613ec75750805b601f850160051c820191505b81811015611d1a57828155600101613ed3565b67ffffffffffffffff831115613efe57613efe6138e2565b613f1283613f0c8354613b57565b83613e9e565b6000601f841160018114613f645760008515613f2e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611422565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fb35786850135825560209485019460019092019101613f93565b5086821015613fee577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561403a8161346f565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140a0576140a06138e2565b80548382558084101561412d5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140e1576140e1614000565b80861686146140f2576140f2614000565b5060008360005260206000208360011b81018760011b820191505b8082101561412857828255828483015560028201915061410d565b505050505b5060008181526020812083915b85811015611d1a5761414c838361402f565b604092909201916002919091019060010161413a565b81358155600181016020830135614178816133bb565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141b86040860186613c17565b935091506141ca838360028701613ee6565b6141d76060860186613c17565b935091506141e9838360038701613ee6565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261422057600080fd5b91840191823591508082111561423557600080fd5b506020820191508060061b360382131561424e57600080fd5b6129af818360048601614087565b600082614292577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142a957600080fd5b8151612c098161346f565b815167ffffffffffffffff8111156142ce576142ce6138e2565b6142e2816142dc8454613b57565b84613e9e565b602080601f83116001811461433557600084156142ff5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d1a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561438257888601518255948401946001909101908401614363565b50858210156143be57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610bdc57610bdc614000565b67ffffffffffffffff83168152604060208201526000825160a0604084015261440d60e08401826134fd565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261444983836134fd565b92506040860151915080858403016080860152614466838361361b565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506135a482826134fd565b6000602082840312156144b657600080fd5b5051919050565b6000602082840312156144cf57600080fd5b8151612c09816134ae56fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -506,16 +506,16 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) TypeAndVersion() (st return _SelfFundedPingPong.Contract.TypeAndVersion(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "abandonMessage", messageId, receiver) +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } -func (_SelfFundedPingPong *SelfFundedPingPongSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.AbandonMessage(&_SelfFundedPingPong.TransactOpts, messageId, receiver) +func (_SelfFundedPingPong *SelfFundedPingPongSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.AbandonFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId, receiver) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) AbandonMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.AbandonMessage(&_SelfFundedPingPong.TransactOpts, messageId, receiver) +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.AbandonFailedMessage(&_SelfFundedPingPong.TransactOpts, messageId, receiver) } func (_SelfFundedPingPong *SelfFundedPingPongTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { @@ -2646,7 +2646,7 @@ type SelfFundedPingPongInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) - AbandonMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, 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 2170968d97..4f53971262 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,9 +5,9 @@ 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 fee3f82935ce7a26c65e12f19a472a4fccdae62755abdb42d8b0a01f0f06981a burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin c7efa00d2be62a97a814730c8e13aa70794ebfdd38a9f3b3c11554a5dfd70478 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin a0728e186af74968101135a58a483320ced9ab79b22b1b24ac6994254ee79097 -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin fb523cde481a1cffe8d5c93ea1b57931859a093ba03803034434ecd4183b2c41 -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin a57c861ee713741d05c38edc2acfee13aaa037d4fc43f0795e74ece19b294ba9 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin b7fb4d8a3bcefd7a4f355c47199aedb94d78534c540138a69b3e0ebd8654f47e +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 7a02b5e5da9f1ec593e6916d45a2972330dfe8d4a40eeb3d76fd57b852a7d230 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 4ff0f5166791975a28c8cca820d5b23636877a39db90090aa18ad7d2d122b785 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 8f0cb5cff5611460db2527342ac74723ffc2c57afb3866eefe862b0dad2e75bc ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin f79420dab435b1c44d695cc1cfb1771e4ba1a7224814198b4818c043219e337a ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c44460757ca0e1b228734b32b9ab03221b93d77bb9f8e2970830779a8be2cb78 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 @@ -28,11 +28,11 @@ 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 abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin b58dd158eb1504600b3fb4bdb4c24e49f0ae80bcb70f6b9af35904481538acf4 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin fa113052eafd644fd9d25558bf13ebf0be15e51de93477d74eea913801d0f752 price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 0b3e253684d7085aa11f9179b71453b9db9d11cabea41605d5b4ac4128f85bfb registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin cbe7698bfd811b485ac3856daf073a7bdebeefdf2583403ca4a19d5b7e2d4ae8 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 62483ea741c1b1556f16101be8714374bf9f68435fcc5dca1666146d74e75b21 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin eedfacbd19d13edfbddae5a693aa58c31595732ecb54f371d3155da244b65344 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin 48caf06855a2f60455364d384e5fb2e6ecdf0a9ce4c1fc706b54b9885df76695 From 64d1ec8d554bc70188562d819189c6be5132390a Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 3 Jul 2024 20:37:51 -0400 Subject: [PATCH 28/31] additional comments --- contracts/gas-snapshots/ccip.gas-snapshot | 4 +-- .../ccip/applications/external/CCIPClient.sol | 5 +-- .../applications/external/CCIPClientBase.sol | 36 ++++++++++++++----- .../applications/external/CCIPReceiver.sol | 22 ++++++------ .../external/CCIPReceiverWithACK.sol | 11 +++--- .../ccip/applications/external/CCIPSender.sol | 3 +- .../external/CCIPReceiverTest.t.sol | 2 -- 7 files changed, 51 insertions(+), 32 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index c2a26ca75f..04def4f478 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -93,12 +93,12 @@ CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428817) CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 444784) CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205094) CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425167) -CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423774) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 420799) CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18806) CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 55172) CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 331323) CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437616) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2641285) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2643085) CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72519) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339182) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224256) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 98d5b0772e..7376a3cabf 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -22,6 +22,7 @@ contract CCIPClient is CCIPReceiverWithACK { return "CCIPClient 1.0.0-dev"; } + /// @notice sends a message through CCIP to the router function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, @@ -64,8 +65,8 @@ contract CCIPClient is CCIPReceiverWithACK { return messageId; } - /// CCIPReceiver processMessage to make easier to modify - /// @notice function requres that + /// @notice Implementation of arbitrary logic to be executed when a CCIP message is received + /// @dev is only invoked by self on CCIPReceive, and should implement arbitrary dapp-specific logic function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 6b0844ed3f..09a532c20e 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -25,16 +25,14 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { struct ChainConfig { bool disabled; - bytes recipient; - // Includes additional configs such as manual gas limit, and OOO-execution. - // Should not be supplied at runtime to prevent unexpected contract behavior - bytes extraArgsBytes; - mapping(bytes => bool) approvedSender; + bytes recipient; // The address to send messages to on the destination-chain, abi.encode(addr) if an EVM-compatible networks + bytes extraArgsBytes; // Includes additional configs such as manual gas limit, and out-of-order-execution. Should not be supplied at runtime to prevent unexpected contract behavior + mapping(bytes recipient => bool isApproved) approvedSender; } address internal immutable i_ccipRouter; - mapping(uint64 => ChainConfig) public s_chainConfigs; + mapping(uint64 destChainSelector => ChainConfig) public s_chainConfigs; constructor(address router) { if (router == address(0)) revert ZeroAddressNotAllowed(); @@ -60,6 +58,8 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Sender/Receiver Management │ // ================================================================ + /// @notice modify the list of approved source-chain contracts which can send messages to this contract through CCIP + /// @dev removes are executed before additions, so a contract present in both will be approved at the end of execution function updateApprovedSenders( ApprovedSenderUpdate[] calldata adds, ApprovedSenderUpdate[] calldata removes @@ -73,6 +73,10 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { } } + /// @notice Return whether a contract on the specified source chain is authorized to send messages to this contract through CCIP + /// @param sourceChainSelector A unique CCIP-specific identifier for the source chain + /// @param senderAddr The address which sent the message on the source-chain, abi-encoded if evm-compatible + /// @return bool Whether the address is approved or not to invoke functions on this contract function isApprovedSender(uint64 sourceChainSelector, bytes calldata senderAddr) external view returns (bool) { return s_chainConfigs[sourceChainSelector].approvedSender[senderAddr]; } @@ -81,14 +85,21 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Fee Token Management │ // =============================================================== - /// @notice function is set in client base to support native-fee-token pre-funding in all children implemending CCIPSend + /// @notice function support native-fee-token pre-funding in all children implementing the ccipSend function receive() external payable {} + /// @notice Allow the owner to recover any native-tokens sent to this contract out of error. + /// @dev Function should not be used to recover tokens from failed-messages, abandonFailedMessage() should be used instead + /// @param to A payable address to send the recovered tokens to + /// @param amount the amount of native tokens to recover, denominated in wei function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { Address.sendValue(to, amount); } - /// @notice Function should NEVER be used for transfering tokens from a failed message, only for recovering tokens sent in error + /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error. + /// @dev Function should not be used to recover tokens from failed-messages, abandonFailedMessage() should be used instead + /// @param to A payable address to send the recovered tokens to + /// @param amount the amount of native tokens to recover, denominated in wei function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).safeTransfer(to, amount); } @@ -97,6 +108,10 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Chain Management │ // ================================================================ + /// @notice Enable a remote-chain to send and receive messages to/from this contract via CCIP + /// @param chainSelector A unique CCIP-specific identifier for the source chain + /// @param recipient The address a message should be sent to on the destination chain. There should only be one per-chain, and is abi-encoded if EVM-compatible. + /// @param _extraArgsBytes additional optional ccipSend parameters. Do not need to be set unless necessary based on the application-logic function enableChain( uint64 chainSelector, bytes calldata recipient, @@ -106,18 +121,21 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { currentConfig.recipient = recipient; + // Set any additional args such as enabling out-of-order execution or manual gas-limit if (_extraArgsBytes.length != 0) currentConfig.extraArgsBytes = _extraArgsBytes; // If config was previously disabled, then re-enable it; if (currentConfig.disabled) currentConfig.disabled = false; } + /// @notice Mark a chain as not supported for sending-receiving messages to/from this contract via CCIP. + /// @dev If a chain needs to be re-enabled after being disabled, the owner must call enableChain() to support it again. function disableChain(uint64 chainSelector) external onlyOwner { s_chainConfigs[chainSelector].disabled = true; } modifier isValidChain(uint64 chainSelector) { - // Must be storage and not memory because the struct contains a nested mapping + // Must be storage and not memory because the struct contains a nested mapping which is not capable of being copied to memory ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; if (currentConfig.recipient.length == 0 || currentConfig.disabled) revert InvalidChain(chainSelector); _; diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index b95d2cfcb1..b6dc6fc8b0 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -24,7 +24,6 @@ contract CCIPReceiver is CCIPClientBase { enum ErrorCode { // RESOLVED is first so that the default value is resolved. RESOLVED, - // Could have any number of error codes here. FAILED, ABANDONED } @@ -75,11 +74,8 @@ contract CCIPReceiver is CCIPClientBase { emit MessageSucceeded(message.messageId); } - /// @notice This function the entrypoint for this contract to process messages. - /// @param message The message to process. - /// @dev This example just sends the tokens to the owner of this contracts. More - /// interesting functions could be implemented. - /// @dev It has to be external because of the try/catch. + /// @notice Contains arbitrary application-logic for incoming CCIP messages. + /// @dev It has to be external because of the try/catch of ccipReceive() which invokes it function processMessage(Client.Any2EVMMessage calldata message) external virtual @@ -91,9 +87,11 @@ contract CCIPReceiver is CCIPClientBase { // │ Failed Message Processing | // ================== ============================================== - /// @notice This function is called when the initial message delivery has failed but should be attempted again with different logic - /// @dev By default this function is callable by anyone, and should be modified if special access control is needed. - function retryFailedMessage(bytes32 messageId) external onlyOwner { + /// @notice Execute a message that failed initial delivery, but with different logic specifically for re-execution. + /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. + /// @dev function will revert if the messageId was not already stored as having failed its initial execution + /// @param messageId the unique ID of the CCIP-message which failed initial-execution. + function retryFailedMessage(bytes32 messageId) external { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); // Set the error code to 0 to disallow reentry and retry the same failed message @@ -109,9 +107,10 @@ contract CCIPReceiver is CCIPClientBase { emit MessageRecovered(messageId); } - /// @notice Function should contain any special logic needed to "retry" processing of a previously failed message. + /// @notice A function that should contain any special logic needed to "retry" processing of a previously failed message. /// @dev if the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead - function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual {} + /// @dev function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden + function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner {} /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried /// @notice function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. @@ -134,6 +133,7 @@ contract CCIPReceiver is CCIPClientBase { // ================================================================ /// @param messageId the ID of the message delivered by the CCIP Router + /// @return Any2EVMMessage a standard CCIP message for EVM-compatible networks function getMessageContents(bytes32 messageId) public view returns (Client.Any2EVMMessage memory) { return s_messageContents[messageId]; } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 310182b311..aee2b4686d 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -76,8 +76,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit FeeTokenModified(oldFeeToken, token); } - /// @notice The entrypoint for the CCIP router to call. This function should - /// never revert, all errors should be handled internally in this contract. + /// @notice The entrypoint for the CCIP router to call. This function should never revert, all errors should be handled internally in this contract. /// @param message The message to process. /// @dev Extremely important to ensure only router calls this. function ccipReceive(Client.Any2EVMMessage calldata message) @@ -101,15 +100,16 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit MessageSucceeded(message.messageId); } - /// CCIPReceiver processMessage to make easier to modify - /// @notice Function does NOT require the status of an incoming ACK be "sent" because this implementation does not send, only receives + /// @notice Application-specific logic for incoming ccip-messages. + /// @dev Function does NOT require the status of an incoming ACK be "sent" because this implementation does not send, only receives + /// @dev Any MessageType encoding is implemented by the sender-contract, and is not natively part of CCIP-messages. function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); if (payload.messageType == MessageType.OUTGOING) { // Insert Processing workflow here. - // If the message was outgoing, then send an ack response. + // If the message was outgoing on the source-chain, then send an ack response. _sendAck(message); } else if (payload.messageType == MessageType.ACK) { // Decode message into the message header and the messageId to ensure the message is encoded correctly @@ -132,6 +132,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { function _sendAck(Client.Any2EVMMessage calldata incomingMessage) internal { Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + // Build the outgoing ACK message, with no tokens, with data being the concatenation of the acknowledgement header and incoming-messageId Client.EVM2AnyMessage memory outgoingMessage = Client.EVM2AnyMessage({ receiver: incomingMessage.sender, data: abi.encode(ACK_MESSAGE_HEADER, incomingMessage.messageId), diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index 6590c495a3..88f7d20ff9 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -37,6 +37,7 @@ contract CCIPSender is CCIPClientBase { return "CCIPSender 1.0.0-dev"; } + /// @notice sends a message through CCIP to the router function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] calldata tokenAmounts, @@ -52,7 +53,7 @@ contract CCIPSender is CCIPClientBase { }); for (uint256 i = 0; i < tokenAmounts.length; ++i) { - // Transfer the tokens to pay for tokens in tokenAmounts + // Transfer the tokens to this contract to pay the router for the tokens in tokenAmounts IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); IERC20(tokenAmounts[i].token).safeIncreaseAllowance(i_ccipRouter, tokenAmounts[i].amount); } diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index 375d84d501..e64a5d28ab 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -178,8 +178,6 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { // Check that message status is failed assertEq(s_receiver.getMessageStatus(messageId), 1); - uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); - vm.startPrank(OWNER); vm.expectEmit(); From 1e907e9e16c19c5dcdd95811ad267ffa6dd0b30f Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 00:44:13 +0000 Subject: [PATCH 29/31] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 18 +++++++++--------- .../generated/ccipReceiver/ccipReceiver.go | 18 +++++++++--------- .../ccip/generated/ccipSender/ccipSender.go | 16 ++++++++-------- .../generated/ping_pong_demo/ping_pong_demo.go | 18 +++++++++--------- .../self_funded_ping_pong.go | 18 +++++++++--------- ...wrapper-dependency-versions-do-not-edit.txt | 12 ++++++------ 6 files changed, 50 insertions(+), 50 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 1b906234e0..46b239bdb2 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620045573803806200455783398101604081905262000034916200055f565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200013b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013157620001316001600160a01b03821683600019620001e6565b5050505062000684565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e91906200059e565b6200026a9190620005b8565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002c691869190620002cc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031b906001600160a01b038516908490620003a2565b8051909150156200039d57808060200190518101906200033c9190620005e0565b6200039d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b38484600085620003bb565b949350505050565b6060824710156200041e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200043c919062000631565b60006040518083038185875af1925050503d80600081146200047b576040519150601f19603f3d011682016040523d82523d6000602084013e62000480565b606091505b50909250905062000494878383876200049f565b979650505050505050565b60608315620005135782516000036200050b576001600160a01b0385163b6200050b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b3565b620003b383838151156200052a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200064f565b6001600160a01b03811681146200055c57600080fd5b50565b600080604083850312156200057357600080fd5b8251620005808162000546565b6020840151909250620005938162000546565b809150509250929050565b600060208284031215620005b157600080fd5b5051919050565b80820180821115620005da57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f357600080fd5b815180151581146200060457600080fd5b9392505050565b60005b83811015620006285781810151838201526020016200060e565b50506000910152565b60008251620006458184602087016200060b565b9190910192915050565b6020815260008251806020840152620006708160408501602087016200060b565b601f01601f19169190910160400192915050565b608051613e7f620006d86000396000818161047a015281816105d4015281816106640152818161111501528181611bda01528181611ca301528181611d7b015281816125fb01526126c70152613e7f6000f3fe6080604052600436106101845760003560e01c80636fef519e116100d6578063cf6730f81161007f578063e89b448511610059578063e89b4485146104fe578063f2fde38b14610511578063ff2deec31461053157600080fd5b8063cf6730f81461049e578063d8469e40146104be578063e4ca8754146104de57600080fd5b806385572ffb116100b057806385572ffb146103ff5780638da5cb5b1461041f578063b0f479a11461046b57600080fd5b80636fef519e1461038157806379ba5097146103ca5780638462a2b9146103df57600080fd5b806341eade46116101385780635e35359e116101125780635e35359e146103145780636939cd97146103345780636d62d6331461036157600080fd5b806341eade46146102a65780635075a9d4146102c6578063536c6bfa146102f457600080fd5b806311e85dff1161016957806311e85dff14610206578063181f5a771461022857806335f170ef1461027757600080fd5b806305bfe982146101905780630e958d6b146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab366004612d33565b60086020526000908152604090205460ff1681565b6040516101cd9190612d7b565b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612e1b565b61055e565b60405190151581526020016101cd565b34801561021257600080fd5b50610226610221366004612e92565b6105a9565b005b34801561023457600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101cd9190612f1d565b34801561028357600080fd5b50610297610292366004612f30565b610721565b6040516101cd93929190612f4d565b3480156102b257600080fd5b506102266102c1366004612f30565b610858565b3480156102d257600080fd5b506102e66102e1366004612d33565b6108a3565b6040519081526020016101cd565b34801561030057600080fd5b5061022661030f366004612f84565b6108b6565b34801561032057600080fd5b5061022661032f366004612fb0565b6108cc565b34801561034057600080fd5b5061035461034f366004612d33565b6108fa565b6040516101cd919061304e565b34801561036d57600080fd5b5061022661037c3660046130eb565b610b05565b34801561038d57600080fd5b5061026a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103d657600080fd5b50610226610e1f565b3480156103eb57600080fd5b506102266103fa366004613160565b610f1c565b34801561040b57600080fd5b5061022661041a3660046131cc565b6110fd565b34801561042b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561047757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610446565b3480156104aa57600080fd5b506102266104b93660046131cc565b6113f8565b3480156104ca57600080fd5b506102266104d9366004613207565b611615565b3480156104ea57600080fd5b506102266104f9366004612d33565b611696565b6102e661050c3660046133f0565b6118ff565b34801561051d57600080fd5b5061022661052c366004612e92565b611e83565b34801561053d57600080fd5b506007546104469073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061058d90859085906134fd565b9081526040519081900360200190205460ff1690509392505050565b6105b1611e97565b60075473ffffffffffffffffffffffffffffffffffffffff1615610614576106147f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000611f1a565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106c3576106c37f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61211a565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff90921692916107479061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546107739061350d565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050908060020180546107d59061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546108019061350d565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905083565b610860611e97565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006108b060048361221e565b92915050565b6108be611e97565b6108c88282612231565b5050565b6108d4611e97565b6108f573ffffffffffffffffffffffffffffffffffffffff8416838361238b565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109699061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546109959061350d565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b505050505081526020016003820180546109fb9061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a279061350d565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610af75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610aa2565b505050915250909392505050565b610b0d611e97565b6001610b1a60048461221e565b14610b59576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b698260025b600491906123e1565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610bb19061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd9061350d565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b50505050508152602001600382018054610c439061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f9061350d565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d3f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cea565b5050505081525050905060005b816080015151811015610dce57610dc68383608001518381518110610d7357610d73613560565b60200260200101516020015184608001518481518110610d9557610d95613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661238b9092919063ffffffff16565b600101610d4c565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b50565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f24611e97565b60005b818110156110075760026000848484818110610f4557610f45613560565b9050602002810190610f57919061358f565b610f65906020810190612f30565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9c57610f9c613560565b9050602002810190610fae919061358f565b610fbc9060208101906135cd565b604051610fca9291906134fd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f27565b5060005b838110156110f65760016002600087878581811061102b5761102b613560565b905060200281019061103d919061358f565b61104b906020810190612f30565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061108257611082613560565b9050602002810190611094919061358f565b6110a29060208101906135cd565b6040516110b09291906134fd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161100b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b50565b61117e6040820160208301612f30565b61118b60408301836135cd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e99250849150613632565b9081526040519081900360200190205460ff1661123457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b509190612f1d565b6112446040840160208501612f30565b67ffffffffffffffff8116600090815260026020526040902060018101805461126c9061350d565b1590508061127b5750805460ff165b156112be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112fa908890600401613746565b600060405180830381600087803b15801561131457600080fd5b505af1925050508015611325575060015b6113c5573d808015611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b5061136586356001610b60565b508535600090815260036020526040902086906113828282613b18565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b7908490612f1d565b60405180910390a2506110f6565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b333014611431576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061144060608301836135cd565b81019061144d9190613c12565b905060008160400151600181111561146757611467612d4c565b03611475576108c8826123f6565b60018160400151600181111561148d5761148d612d4c565b036108c85760008082602001518060200190518101906114ad9190613cbe565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611545576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156a5761156a612d4c565b146115a4576040517f3ec8770000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161d611e97565b67ffffffffffffffff851660009081526002602052604090206001810161164585878361389c565b50811561165d576002810161165b83858361389c565b505b805460ff161561168e5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b61169e611e97565b60016116ab60048361221e565b146116e5576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b6116f0816000610b60565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117389061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546117649061350d565b80156117b15780601f10611786576101008083540402835291602001916117b1565b820191906000526020600020905b81548152906001019060200180831161179457829003601f168201915b505050505081526020016003820180546117ca9061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546117f69061350d565b80156118435780601f1061181857610100808354040283529160200191611843565b820191906000526020600020905b81548152906001019060200180831161182657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118c65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611871565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061192b9061350d565b1590508061193a5750805460ff165b1561197d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906119b09061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc9061350d565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611a889061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab49061350d565b8015611b015780601f10611ad657610100808354040283529160200191611b01565b820191906000526020600020905b815481529060010190602001808311611ae457829003601f168201915b5050505050815250905060005b8651811015611c6257611b7e3330898481518110611b2e57611b2e613560565b6020026020010151602001518a8581518110611b4c57611b4c613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127a7909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611bae57611bae613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611c5a57611c5a7f0000000000000000000000000000000000000000000000000000000000000000888381518110611c0b57611c0b613560565b602002602001015160200151898481518110611c2957611c29613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661211a9092919063ffffffff16565b600101611b0e565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611cda908b908690600401613d3f565b602060405180830381865afa158015611cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1b9190613e02565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615611d6157600754611d619073ffffffffffffffffffffffffffffffffffffffff163330846127a7565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615611db0576000611db2565b825b8a856040518463ffffffff1660e01b8152600401611dd1929190613d3f565b60206040518083038185885af1158015611def573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e149190613e02565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611e8b611e97565b611e9481612805565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b50565b565b801580611fba57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613e02565b155b612046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526128fa565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b59190613e02565b6121bf9190613e1b565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506122189085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612098565b50505050565b600061222a8383612a06565b9392505050565b8047101561229b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b50565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122f5576040519150601f19603f3d011682016040523d82523d6000602084013e6122fa565b606091505b50509050806108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612098565b60006123ee848484612a90565b949350505050565b6040805160008082526020820190925281612433565b604080518082019091526000808252602082015281526020019060019003908161240c5790505b50905060006040518060a0016040528084806040019061245391906135cd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124d49288359101613e2e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260075473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600291600091612544918901908901612f30565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020180546125749061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546125a09061350d565b80156125ed5780601f106125c2576101008083540402835291602001916125ed565b820191906000526020600020905b8154815290600101906020018083116125d057829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906126489190612f30565b846040518363ffffffff1660e01b8152600401612666929190613d3f565b602060405180830381865afa158015612683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a79190613e02565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156126fc5760006126fe565b835b61270e6040890160208a01612f30565b866040518463ffffffff1660e01b815260040161272c929190613d3f565b60206040518083038185885af115801561274a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061276f9190613e02565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526122189085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612098565b3373ffffffffffffffffffffffffffffffffffffffff821603612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b50565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061295c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aad9092919063ffffffff16565b8051909150156108f5578080602001905181019061297a9190613e50565b6108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b50565b600081815260028301602052604081205480151580612a2a5750612a2a8484612abc565b61222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b50565b600082815260028401602052604081208290556123ee8484612ac8565b60606123ee8484600085612ad4565b600061222a8383612bed565b600061222a8383612c05565b606082471015612b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b50565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b8f9190613632565b60006040518083038185875af1925050503d8060008114612bcc576040519150601f19603f3d011682016040523d82523d6000602084013e612bd1565b606091505b5091509150612be287838387612c54565b979650505050505050565b6000818152600183016020526040812054151561222a565b6000818152600183016020526040812054612c4c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b0565b5060006108b0565b60608315612cea578251600003612ce35773ffffffffffffffffffffffffffffffffffffffff85163b612ce3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b50565b50816123ee565b6123ee8383815115612cff5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509190612f1d565b600060208284031215612d4557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e9457600080fd5b60008083601f840112612de457600080fd5b50813567ffffffffffffffff811115612dfc57600080fd5b602083019150836020828501011115612e1457600080fd5b9250929050565b600080600060408486031215612e3057600080fd5b8335612e3b81612dbc565b9250602084013567ffffffffffffffff811115612e5757600080fd5b612e6386828701612dd2565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e9457600080fd5b600060208284031215612ea457600080fd5b813561222a81612e70565b60005b83811015612eca578181015183820152602001612eb2565b50506000910152565b60008151808452612eeb816020860160208601612eaf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061222a6020830184612ed3565b600060208284031215612f4257600080fd5b813561222a81612dbc565b8315158152606060208201526000612f686060830185612ed3565b8281036040840152612f7a8185612ed3565b9695505050505050565b60008060408385031215612f9757600080fd5b8235612fa281612e70565b946020939093013593505050565b600080600060608486031215612fc557600080fd5b8335612fd081612e70565b92506020840135612fe081612e70565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613043578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613006565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261308860c0840182612ed3565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130c48383612ed3565b925060808601519150808584030160a0860152506130e28282612ff1565b95945050505050565b600080604083850312156130fe57600080fd5b82359150602083013561311081612e70565b809150509250929050565b60008083601f84011261312d57600080fd5b50813567ffffffffffffffff81111561314557600080fd5b6020830191508360208260051b8501011115612e1457600080fd5b6000806000806040858703121561317657600080fd5b843567ffffffffffffffff8082111561318e57600080fd5b61319a8883890161311b565b909650945060208701359150808211156131b357600080fd5b506131c08782880161311b565b95989497509550505050565b6000602082840312156131de57600080fd5b813567ffffffffffffffff8111156131f557600080fd5b820160a0818503121561222a57600080fd5b60008060008060006060868803121561321f57600080fd5b853561322a81612dbc565b9450602086013567ffffffffffffffff8082111561324757600080fd5b61325389838a01612dd2565b9096509450604088013591508082111561326c57600080fd5b5061327988828901612dd2565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156132dc576132dc61328a565b60405290565b6040516060810167ffffffffffffffff811182821017156132dc576132dc61328a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561334c5761334c61328a565b604052919050565b600067ffffffffffffffff82111561336e5761336e61328a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126133ab57600080fd5b81356133be6133b982613354565b613305565b8181528460208386010111156133d357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561340557600080fd5b833561341081612dbc565b925060208481013567ffffffffffffffff8082111561342e57600080fd5b818701915087601f83011261344257600080fd5b8135818111156134545761345461328a565b613462848260051b01613305565b81815260069190911b8301840190848101908a83111561348157600080fd5b938501935b828510156134cd576040858c03121561349f5760008081fd5b6134a76132b9565b85356134b281612e70565b81528587013587820152825260409094019390850190613486565b9650505060408701359250808311156134e557600080fd5b50506134f38682870161339a565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061352157607f821691505b60208210810361355a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126135c357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261360257600080fd5b83018035915067ffffffffffffffff82111561361d57600080fd5b602001915036819003821315612e1457600080fd5b600082516135c3818460208701612eaf565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261367957600080fd5b830160208101925035905067ffffffffffffffff81111561369957600080fd5b803603821315612e1457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561304357813561371481612e70565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613701565b60208152813560208201526000602083013561376181612dbc565b67ffffffffffffffff808216604085015261377f6040860186613644565b925060a0606086015261379660c0860184836136a8565b9250506137a66060860186613644565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526137dc8583856136a8565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261381557600080fd5b6020928801928301923591508382111561382e57600080fd5b8160061b360383131561384057600080fd5b8685030160a0870152612be28482846136f1565b601f8211156108f5576000816000526020600020601f850160051c8101602086101561387d5750805b601f850160051c820191505b8181101561168e57828155600101613889565b67ffffffffffffffff8311156138b4576138b461328a565b6138c8836138c2835461350d565b83613854565b6000601f84116001811461391a57600085156138e45750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139695786850135825560209485019460019092019101613949565b50868210156139a4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139f081612e70565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a5657613a5661328a565b805483825580841015613ae35760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a9757613a976139b6565b8086168614613aa857613aa86139b6565b5060008360005260206000208360011b81018760011b820191505b80821015613ade578282558284830155600282019150613ac3565b505050505b5060008181526020812083915b8581101561168e57613b0283836139e5565b6040929092019160029190910190600101613af0565b81358155600181016020830135613b2e81612dbc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b6e60408601866135cd565b93509150613b8083836002870161389c565b613b8d60608601866135cd565b93509150613b9f83836003870161389c565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613bd657600080fd5b918401918235915080821115613beb57600080fd5b506020820191508060061b3603821315613c0457600080fd5b612218818360048601613a3d565b600060208284031215613c2457600080fd5b813567ffffffffffffffff80821115613c3c57600080fd5b9083019060608286031215613c5057600080fd5b613c586132e2565b823582811115613c6757600080fd5b613c738782860161339a565b825250602083013582811115613c8857600080fd5b613c948782860161339a565b6020830152506040830135925060028310613cae57600080fd5b6040810192909252509392505050565b60008060408385031215613cd157600080fd5b825167ffffffffffffffff811115613ce857600080fd5b8301601f81018513613cf957600080fd5b8051613d076133b982613354565b818152866020838501011115613d1c57600080fd5b613d2d826020830160208601612eaf565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d6b60e0840182612ed3565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613da78383612ed3565b92506040860151915080858403016080860152613dc48383612ff1565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f7a8282612ed3565b600060208284031215613e1457600080fd5b5051919050565b808201808211156108b0576108b06139b6565b604081526000613e416040830185612ed3565b90508260208301529392505050565b600060208284031215613e6257600080fd5b8151801515811461222a57600080fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620045603803806200456083398101604081905262000034916200055f565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200013b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013157620001316001600160a01b03821683600019620001e6565b5050505062000684565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e91906200059e565b6200026a9190620005b8565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002c691869190620002cc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031b906001600160a01b038516908490620003a2565b8051909150156200039d57808060200190518101906200033c9190620005e0565b6200039d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b38484600085620003bb565b949350505050565b6060824710156200041e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200043c919062000631565b60006040518083038185875af1925050503d80600081146200047b576040519150601f19603f3d011682016040523d82523d6000602084013e62000480565b606091505b50909250905062000494878383876200049f565b979650505050505050565b60608315620005135782516000036200050b576001600160a01b0385163b6200050b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b3565b620003b383838151156200052a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200064f565b6001600160a01b03811681146200055c57600080fd5b50565b600080604083850312156200057357600080fd5b8251620005808162000546565b6020840151909250620005938162000546565b809150509250929050565b600060208284031215620005b157600080fd5b5051919050565b80820180821115620005da57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f357600080fd5b815180151581146200060457600080fd5b9392505050565b60005b83811015620006285781810151838201526020016200060e565b50506000910152565b60008251620006458184602087016200060b565b9190910192915050565b6020815260008251806020840152620006708160408501602087016200060b565b601f01601f19169190910160400192915050565b608051613e88620006d86000396000818161047a015281816105d4015281816106640152818161111501528181611bdb01528181611ca401528181611d7c015281816125fc01526126c80152613e886000f3fe6080604052600436106101845760003560e01c80636fef519e116100d6578063cf6730f81161007f578063e89b448511610059578063e89b4485146104fe578063f2fde38b14610511578063ff2deec31461053157600080fd5b8063cf6730f81461049e578063d8469e40146104be578063e4ca8754146104de57600080fd5b806385572ffb116100b057806385572ffb146103ff5780638da5cb5b1461041f578063b0f479a11461046b57600080fd5b80636fef519e1461038157806379ba5097146103ca5780638462a2b9146103df57600080fd5b806341eade46116101385780635e35359e116101125780635e35359e146103145780636939cd97146103345780636d62d6331461036157600080fd5b806341eade46146102a65780635075a9d4146102c6578063536c6bfa146102f457600080fd5b806311e85dff1161016957806311e85dff14610206578063181f5a771461022857806335f170ef1461027757600080fd5b806305bfe982146101905780630e958d6b146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab366004612d3c565b60086020526000908152604090205460ff1681565b6040516101cd9190612d84565b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612e24565b61055e565b60405190151581526020016101cd565b34801561021257600080fd5b50610226610221366004612e9b565b6105a9565b005b34801561023457600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101cd9190612f26565b34801561028357600080fd5b50610297610292366004612f39565b610721565b6040516101cd93929190612f56565b3480156102b257600080fd5b506102266102c1366004612f39565b610858565b3480156102d257600080fd5b506102e66102e1366004612d3c565b6108a3565b6040519081526020016101cd565b34801561030057600080fd5b5061022661030f366004612f8d565b6108b6565b34801561032057600080fd5b5061022661032f366004612fb9565b6108cc565b34801561034057600080fd5b5061035461034f366004612d3c565b6108fa565b6040516101cd9190613057565b34801561036d57600080fd5b5061022661037c3660046130f4565b610b05565b34801561038d57600080fd5b5061026a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103d657600080fd5b50610226610e1f565b3480156103eb57600080fd5b506102266103fa366004613169565b610f1c565b34801561040b57600080fd5b5061022661041a3660046131d5565b6110fd565b34801561042b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561047757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610446565b3480156104aa57600080fd5b506102266104b93660046131d5565b6113f8565b3480156104ca57600080fd5b506102266104d9366004613210565b611615565b3480156104ea57600080fd5b506102266104f9366004612d3c565b611696565b6102e661050c3660046133f9565b611900565b34801561051d57600080fd5b5061022661052c366004612e9b565b611e84565b34801561053d57600080fd5b506007546104469073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061058d9085908590613506565b9081526040519081900360200190205460ff1690509392505050565b6105b1611e98565b60075473ffffffffffffffffffffffffffffffffffffffff1615610614576106147f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000611f1b565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106c3576106c37f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61211b565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff909216929161074790613516565b80601f016020809104026020016040519081016040528092919081815260200182805461077390613516565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050908060020180546107d590613516565b80601f016020809104026020016040519081016040528092919081815260200182805461080190613516565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905083565b610860611e98565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006108b060048361221f565b92915050565b6108be611e98565b6108c88282612232565b5050565b6108d4611e98565b6108f573ffffffffffffffffffffffffffffffffffffffff8416838361238c565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161096990613516565b80601f016020809104026020016040519081016040528092919081815260200182805461099590613516565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b505050505081526020016003820180546109fb90613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2790613516565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610af75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610aa2565b505050915250909392505050565b610b0d611e98565b6001610b1a60048461221f565b14610b59576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b698260025b600491906123e2565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610bb190613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90613516565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b50505050508152602001600382018054610c4390613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90613516565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d3f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cea565b5050505081525050905060005b816080015151811015610dce57610dc68383608001518381518110610d7357610d73613569565b60200260200101516020015184608001518481518110610d9557610d95613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661238c9092919063ffffffff16565b600101610d4c565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b50565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f24611e98565b60005b818110156110075760026000848484818110610f4557610f45613569565b9050602002810190610f579190613598565b610f65906020810190612f39565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9c57610f9c613569565b9050602002810190610fae9190613598565b610fbc9060208101906135d6565b604051610fca929190613506565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f27565b5060005b838110156110f65760016002600087878581811061102b5761102b613569565b905060200281019061103d9190613598565b61104b906020810190612f39565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061108257611082613569565b90506020028101906110949190613598565b6110a29060208101906135d6565b6040516110b0929190613506565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161100b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b50565b61117e6040820160208301612f39565b61118b60408301836135d6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e9925084915061363b565b9081526040519081900360200190205460ff1661123457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b509190612f26565b6112446040840160208501612f39565b67ffffffffffffffff8116600090815260026020526040902060018101805461126c90613516565b1590508061127b5750805460ff165b156112be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112fa90889060040161374f565b600060405180830381600087803b15801561131457600080fd5b505af1925050508015611325575060015b6113c5573d808015611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b5061136586356001610b60565b508535600090815260036020526040902086906113828282613b21565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b7908490612f26565b60405180910390a2506110f6565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b333014611431576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061144060608301836135d6565b81019061144d9190613c1b565b905060008160400151600181111561146757611467612d55565b03611475576108c8826123f7565b60018160400151600181111561148d5761148d612d55565b036108c85760008082602001518060200190518101906114ad9190613cc7565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611545576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156a5761156a612d55565b146115a4576040517f3ec8770000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161d611e98565b67ffffffffffffffff85166000908152600260205260409020600181016116458587836138a5565b50811561165d576002810161165b8385836138a5565b505b805460ff161561168e5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016116a360048361221f565b146116dd576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b6116e8816000610b60565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161173090613516565b80601f016020809104026020016040519081016040528092919081815260200182805461175c90613516565b80156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b505050505081526020016003820180546117c290613516565b80601f01602080910402602001604051908101604052809291908181526020018280546117ee90613516565b801561183b5780601f106118105761010080835404028352916020019161183b565b820191906000526020600020905b81548152906001019060200180831161181e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118be5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611869565b505050508152505090506118d1816127a8565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061192c90613516565b1590508061193b5750805460ff165b1561197e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906119b190613516565b80601f01602080910402602001604051908101604052809291908181526020018280546119dd90613516565b8015611a2a5780601f106119ff57610100808354040283529160200191611a2a565b820191906000526020600020905b815481529060010190602001808311611a0d57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611a8990613516565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab590613516565b8015611b025780601f10611ad757610100808354040283529160200191611b02565b820191906000526020600020905b815481529060010190602001808311611ae557829003601f168201915b5050505050815250905060005b8651811015611c6357611b7f3330898481518110611b2f57611b2f613569565b6020026020010151602001518a8581518110611b4d57611b4d613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127b0909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611baf57611baf613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611c5b57611c5b7f0000000000000000000000000000000000000000000000000000000000000000888381518110611c0c57611c0c613569565b602002602001015160200151898481518110611c2a57611c2a613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661211b9092919063ffffffff16565b600101611b0f565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611cdb908b908690600401613d48565b602060405180830381865afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c9190613e0b565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615611d6257600754611d629073ffffffffffffffffffffffffffffffffffffffff163330846127b0565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615611db1576000611db3565b825b8a856040518463ffffffff1660e01b8152600401611dd2929190613d48565b60206040518083038185885af1158015611df0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e159190613e0b565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611e8c611e98565b611e958161280e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b50565b565b801580611fbb57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb99190613e0b565b155b612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612903565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b69190613e0b565b6121c09190613e24565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506122199085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612099565b50505050565b600061222b8383612a0f565b9392505050565b8047101561229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b50565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122f6576040519150601f19603f3d011682016040523d82523d6000602084013e6122fb565b606091505b50509050806108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612099565b60006123ef848484612a99565b949350505050565b6040805160008082526020820190925281612434565b604080518082019091526000808252602082015281526020019060019003908161240d5790505b50905060006040518060a0016040528084806040019061245491906135d6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124d59288359101613e37565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260075473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600291600091612545918901908901612f39565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201805461257590613516565b80601f01602080910402602001604051908101604052809291908181526020018280546125a190613516565b80156125ee5780601f106125c3576101008083540402835291602001916125ee565b820191906000526020600020905b8154815290600101906020018083116125d157829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906126499190612f39565b846040518363ffffffff1660e01b8152600401612667929190613d48565b602060405180830381865afa158015612684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a89190613e0b565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156126fd5760006126ff565b835b61270f6040890160208a01612f39565b866040518463ffffffff1660e01b815260040161272d929190613d48565b60206040518083038185885af115801561274b573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127709190613e0b565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b611e95611e98565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526122199085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612099565b3373ffffffffffffffffffffffffffffffffffffffff82160361288d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b50565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612965826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ab69092919063ffffffff16565b8051909150156108f557808060200190518101906129839190613e59565b6108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b50565b600081815260028301602052604081205480151580612a335750612a338484612ac5565b61222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b50565b600082815260028401602052604081208290556123ef8484612ad1565b60606123ef8484600085612add565b600061222b8383612bf6565b600061222b8383612c0e565b606082471015612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b50565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b98919061363b565b60006040518083038185875af1925050503d8060008114612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b5091509150612beb87838387612c5d565b979650505050505050565b6000818152600183016020526040812054151561222b565b6000818152600183016020526040812054612c55575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b0565b5060006108b0565b60608315612cf3578251600003612cec5773ffffffffffffffffffffffffffffffffffffffff85163b612cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b50565b50816123ef565b6123ef8383815115612d085781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509190612f26565b600060208284031215612d4e57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612dbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e9557600080fd5b60008083601f840112612ded57600080fd5b50813567ffffffffffffffff811115612e0557600080fd5b602083019150836020828501011115612e1d57600080fd5b9250929050565b600080600060408486031215612e3957600080fd5b8335612e4481612dc5565b9250602084013567ffffffffffffffff811115612e6057600080fd5b612e6c86828701612ddb565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e9557600080fd5b600060208284031215612ead57600080fd5b813561222b81612e79565b60005b83811015612ed3578181015183820152602001612ebb565b50506000910152565b60008151808452612ef4816020860160208601612eb8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061222b6020830184612edc565b600060208284031215612f4b57600080fd5b813561222b81612dc5565b8315158152606060208201526000612f716060830185612edc565b8281036040840152612f838185612edc565b9695505050505050565b60008060408385031215612fa057600080fd5b8235612fab81612e79565b946020939093013593505050565b600080600060608486031215612fce57600080fd5b8335612fd981612e79565b92506020840135612fe981612e79565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561304c578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161300f565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261309160c0840182612edc565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130cd8383612edc565b925060808601519150808584030160a0860152506130eb8282612ffa565b95945050505050565b6000806040838503121561310757600080fd5b82359150602083013561311981612e79565b809150509250929050565b60008083601f84011261313657600080fd5b50813567ffffffffffffffff81111561314e57600080fd5b6020830191508360208260051b8501011115612e1d57600080fd5b6000806000806040858703121561317f57600080fd5b843567ffffffffffffffff8082111561319757600080fd5b6131a388838901613124565b909650945060208701359150808211156131bc57600080fd5b506131c987828801613124565b95989497509550505050565b6000602082840312156131e757600080fd5b813567ffffffffffffffff8111156131fe57600080fd5b820160a0818503121561222b57600080fd5b60008060008060006060868803121561322857600080fd5b853561323381612dc5565b9450602086013567ffffffffffffffff8082111561325057600080fd5b61325c89838a01612ddb565b9096509450604088013591508082111561327557600080fd5b5061328288828901612ddb565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156132e5576132e5613293565b60405290565b6040516060810167ffffffffffffffff811182821017156132e5576132e5613293565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561335557613355613293565b604052919050565b600067ffffffffffffffff82111561337757613377613293565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126133b457600080fd5b81356133c76133c28261335d565b61330e565b8181528460208386010111156133dc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561340e57600080fd5b833561341981612dc5565b925060208481013567ffffffffffffffff8082111561343757600080fd5b818701915087601f83011261344b57600080fd5b81358181111561345d5761345d613293565b61346b848260051b0161330e565b81815260069190911b8301840190848101908a83111561348a57600080fd5b938501935b828510156134d6576040858c0312156134a85760008081fd5b6134b06132c2565b85356134bb81612e79565b8152858701358782015282526040909401939085019061348f565b9650505060408701359250808311156134ee57600080fd5b50506134fc868287016133a3565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061352a57607f821691505b602082108103613563577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126135cc57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261360b57600080fd5b83018035915067ffffffffffffffff82111561362657600080fd5b602001915036819003821315612e1d57600080fd5b600082516135cc818460208701612eb8565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261368257600080fd5b830160208101925035905067ffffffffffffffff8111156136a257600080fd5b803603821315612e1d57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561304c57813561371d81612e79565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161370a565b60208152813560208201526000602083013561376a81612dc5565b67ffffffffffffffff8082166040850152613788604086018661364d565b925060a0606086015261379f60c0860184836136b1565b9250506137af606086018661364d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526137e58583856136b1565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261381e57600080fd5b6020928801928301923591508382111561383757600080fd5b8160061b360383131561384957600080fd5b8685030160a0870152612beb8482846136fa565b601f8211156108f5576000816000526020600020601f850160051c810160208610156138865750805b601f850160051c820191505b8181101561168e57828155600101613892565b67ffffffffffffffff8311156138bd576138bd613293565b6138d1836138cb8354613516565b8361385d565b6000601f84116001811461392357600085156138ed5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139725786850135825560209485019460019092019101613952565b50868210156139ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139f981612e79565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a5f57613a5f613293565b805483825580841015613aec5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613aa057613aa06139bf565b8086168614613ab157613ab16139bf565b5060008360005260206000208360011b81018760011b820191505b80821015613ae7578282558284830155600282019150613acc565b505050505b5060008181526020812083915b8581101561168e57613b0b83836139ee565b6040929092019160029190910190600101613af9565b81358155600181016020830135613b3781612dc5565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b7760408601866135d6565b93509150613b898383600287016138a5565b613b9660608601866135d6565b93509150613ba88383600387016138a5565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613bdf57600080fd5b918401918235915080821115613bf457600080fd5b506020820191508060061b3603821315613c0d57600080fd5b612219818360048601613a46565b600060208284031215613c2d57600080fd5b813567ffffffffffffffff80821115613c4557600080fd5b9083019060608286031215613c5957600080fd5b613c616132eb565b823582811115613c7057600080fd5b613c7c878286016133a3565b825250602083013582811115613c9157600080fd5b613c9d878286016133a3565b6020830152506040830135925060028310613cb757600080fd5b6040810192909252509392505050565b60008060408385031215613cda57600080fd5b825167ffffffffffffffff811115613cf157600080fd5b8301601f81018513613d0257600080fd5b8051613d106133c28261335d565b818152866020838501011115613d2557600080fd5b613d36826020830160208601612eb8565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d7460e0840182612edc565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613db08383612edc565b92506040860151915080858403016080860152613dcd8383612ffa565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f838282612edc565b600060208284031215613e1d57600080fd5b5051919050565b808201808211156108b0576108b06139bf565b604081526000613e4a6040830185612edc565b90508260208301529392505050565b600060208284031215613e6b57600080fd5b8151801515811461222b57600080fdfea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -321,11 +321,11 @@ func (_CCIPClient *CCIPClientCallerSession) Owner() (common.Address, error) { return _CCIPClient.Contract.Owner(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPClient.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _CCIPClient.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -340,16 +340,16 @@ func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, arg0 uin } -func (_CCIPClient *CCIPClientSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPClient *CCIPClientSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, arg0) + return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, destChainSelector) } -func (_CCIPClient *CCIPClientCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPClient *CCIPClientCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, arg0) + return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, destChainSelector) } func (_CCIPClient *CCIPClientCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -1965,7 +1965,7 @@ type CCIPClientInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go index a7920aa1ff..fd5ede0f3e 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var CCIPReceiverMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002a7e38038062002a7e8339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051612881620001fd600039600081816103760152610e5901526128816000f3fe60806040526004361061012d5760003560e01c806379ba5097116100a5578063b0f479a111610074578063d8469e4011610059578063d8469e40146103ba578063e4ca8754146103da578063f2fde38b146103fa57600080fd5b8063b0f479a114610367578063cf6730f81461039a57600080fd5b806379ba5097146102c65780638462a2b9146102db57806385572ffb146102fb5780638da5cb5b1461031b57600080fd5b80635075a9d4116100fc5780635e35359e116100e15780635e35359e146102595780636939cd97146102795780636d62d633146102a657600080fd5b80635075a9d41461020b578063536c6bfa1461023957600080fd5b80630e958d6b14610139578063181f5a771461016e57806335f170ef146101ba57806341eade46146101e957600080fd5b3661013457005b600080fd5b34801561014557600080fd5b50610159610154366004611c90565b61041a565b60405190151581526020015b60405180910390f35b34801561017a57600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101659190611d53565b3480156101c657600080fd5b506101da6101d5366004611d66565b610465565b60405161016593929190611d83565b3480156101f557600080fd5b50610209610204366004611d66565b61059c565b005b34801561021757600080fd5b5061022b610226366004611dba565b6105e7565b604051908152602001610165565b34801561024557600080fd5b50610209610254366004611df5565b6105fa565b34801561026557600080fd5b50610209610274366004611e21565b610610565b34801561028557600080fd5b50610299610294366004611dba565b61063e565b6040516101659190611e62565b3480156102b257600080fd5b506102096102c1366004611f49565b610849565b3480156102d257600080fd5b50610209610b63565b3480156102e757600080fd5b506102096102f6366004611fbe565b610c60565b34801561030757600080fd5b5061020961031636600461202a565b610e41565b34801561032757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610165565b34801561037357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610342565b3480156103a657600080fd5b506102096103b536600461202a565b611074565b3480156103c657600080fd5b506102096103d5366004612065565b611173565b3480156103e657600080fd5b506102096103f5366004611dba565b6111f4565b34801561040657600080fd5b506102096104153660046120e8565b61145d565b67ffffffffffffffff831660009081526002602052604080822090516003909101906104499085908590612105565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161048b90612115565b80601f01602080910402602001604051908101604052809291908181526020018280546104b790612115565b80156105045780601f106104d957610100808354040283529160200191610504565b820191906000526020600020905b8154815290600101906020018083116104e757829003601f168201915b50505050509080600201805461051990612115565b80601f016020809104026020016040519081016040528092919081815260200182805461054590612115565b80156105925780601f1061056757610100808354040283529160200191610592565b820191906000526020600020905b81548152906001019060200180831161057557829003601f168201915b5050505050905083565b6105a4611471565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006105f46004836114f4565b92915050565b610602611471565b61060c8282611507565b5050565b610618611471565b61063973ffffffffffffffffffffffffffffffffffffffff84168383611661565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106ad90612115565b80601f01602080910402602001604051908101604052809291908181526020018280546106d990612115565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050815260200160038201805461073f90612115565b80601f016020809104026020016040519081016040528092919081815260200182805461076b90612115565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561083b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107e6565b505050915250909392505050565b610851611471565b600161085e6004846114f4565b1461089d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108ad8260025b600491906116ee565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916108f590612115565b80601f016020809104026020016040519081016040528092919081815260200182805461092190612115565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b5050505050815260200160038201805461098790612115565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390612115565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a835760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a2e565b5050505081525050905060005b816080015151811015610b1257610b0a8383608001518381518110610ab757610ab7612168565b60200260200101516020015184608001518481518110610ad957610ad9612168565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166116619092919063ffffffff16565b600101610a90565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610894565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c68611471565b60005b81811015610d4b5760026000848484818110610c8957610c89612168565b9050602002810190610c9b9190612197565b610ca9906020810190611d66565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610ce057610ce0612168565b9050602002810190610cf29190612197565b610d009060208101906121d5565b604051610d0e929190612105565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c6b565b5060005b83811015610e3a57600160026000878785818110610d6f57610d6f612168565b9050602002810190610d819190612197565b610d8f906020810190611d66565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610dc657610dc6612168565b9050602002810190610dd89190612197565b610de69060208101906121d5565b604051610df4929190612105565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d4f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb2576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610894565b610ec26040820160208301611d66565b67ffffffffffffffff81166000908152600260205260409020600181018054610eea90612115565b15905080610ef95750805460ff165b15610f3c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610894565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f78908690600401612347565b600060405180830381600087803b158015610f9257600080fd5b505af1925050508015610fa3575060015b611043573d808015610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50610fe3843560016108a4565b508335600090815260036020526040902084906110008282612740565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611035908490611d53565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b3330146110ad576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110bd6040820160208301611d66565b6110ca60408301836121d5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111289250849150612840565b9081526040519081900360200190205460ff1661063957806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108949190611d53565b61117b611471565b67ffffffffffffffff85166000908152600260205260409020600181016111a38587836124cc565b5081156111bb57600281016111b98385836124cc565b505b805460ff16156111ec5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b6111fc611471565b60016112096004836114f4565b14611243576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610894565b61124e8160006108a4565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161129690612115565b80601f01602080910402602001604051908101604052809291908181526020018280546112c290612115565b801561130f5780601f106112e45761010080835404028352916020019161130f565b820191906000526020600020905b8154815290600101906020018083116112f257829003601f168201915b5050505050815260200160038201805461132890612115565b80601f016020809104026020016040519081016040528092919081815260200182805461135490612115565b80156113a15780601f10611376576101008083540402835291602001916113a1565b820191906000526020600020905b81548152906001019060200180831161138457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156114245760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016113cf565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611465611471565b61146e81611703565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610894565b565b600061150083836117f8565b9392505050565b80471015611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610894565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146115cb576040519150601f19603f3d011682016040523d82523d6000602084013e6115d0565b606091505b5050905080610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610894565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610639908490611882565b60006116fb84848461198e565b949350505050565b3373ffffffffffffffffffffffffffffffffffffffff821603611782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610894565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061181c575061181c84846119ab565b611500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610894565b60006118e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119b79092919063ffffffff16565b80519091501561063957808060200190518101906119029190612852565b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610894565b600082815260028401602052604081208290556116fb84846119c6565b600061150083836119d2565b60606116fb84846000856119ea565b60006115008383611b03565b60008181526001830160205260408120541515611500565b606082471015611a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610894565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611aa59190612840565b60006040518083038185875af1925050503d8060008114611ae2576040519150601f19603f3d011682016040523d82523d6000602084013e611ae7565b606091505b5091509150611af887838387611b52565b979650505050505050565b6000818152600183016020526040812054611b4a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f4565b5060006105f4565b60608315611be8578251600003611be15773ffffffffffffffffffffffffffffffffffffffff85163b611be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610894565b50816116fb565b6116fb8383815115611bfd5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108949190611d53565b67ffffffffffffffff8116811461146e57600080fd5b60008083601f840112611c5957600080fd5b50813567ffffffffffffffff811115611c7157600080fd5b602083019150836020828501011115611c8957600080fd5b9250929050565b600080600060408486031215611ca557600080fd5b8335611cb081611c31565b9250602084013567ffffffffffffffff811115611ccc57600080fd5b611cd886828701611c47565b9497909650939450505050565b60005b83811015611d00578181015183820152602001611ce8565b50506000910152565b60008151808452611d21816020860160208601611ce5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115006020830184611d09565b600060208284031215611d7857600080fd5b813561150081611c31565b8315158152606060208201526000611d9e6060830185611d09565b8281036040840152611db08185611d09565b9695505050505050565b600060208284031215611dcc57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461146e57600080fd5b60008060408385031215611e0857600080fd5b8235611e1381611dd3565b946020939093013593505050565b600080600060608486031215611e3657600080fd5b8335611e4181611dd3565b92506020840135611e5181611dd3565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611ea060c0860183611d09565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611edc8483611d09565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f3d578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611efe565b50979650505050505050565b60008060408385031215611f5c57600080fd5b823591506020830135611f6e81611dd3565b809150509250929050565b60008083601f840112611f8b57600080fd5b50813567ffffffffffffffff811115611fa357600080fd5b6020830191508360208260051b8501011115611c8957600080fd5b60008060008060408587031215611fd457600080fd5b843567ffffffffffffffff80821115611fec57600080fd5b611ff888838901611f79565b9096509450602087013591508082111561201157600080fd5b5061201e87828801611f79565b95989497509550505050565b60006020828403121561203c57600080fd5b813567ffffffffffffffff81111561205357600080fd5b820160a0818503121561150057600080fd5b60008060008060006060868803121561207d57600080fd5b853561208881611c31565b9450602086013567ffffffffffffffff808211156120a557600080fd5b6120b189838a01611c47565b909650945060408801359150808211156120ca57600080fd5b506120d788828901611c47565b969995985093965092949392505050565b6000602082840312156120fa57600080fd5b813561150081611dd3565b8183823760009101908152919050565b600181811c9082168061212957607f821691505b602082108103612162577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126121cb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261220a57600080fd5b83018035915067ffffffffffffffff82111561222557600080fd5b602001915036819003821315611c8957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261226f57600080fd5b830160208101925035905067ffffffffffffffff81111561228f57600080fd5b803603821315611c8957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561233c57813561230a81611dd3565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016122f7565b509495945050505050565b60208152813560208201526000602083013561236281611c31565b67ffffffffffffffff8082166040850152612380604086018661223a565b925060a0606086015261239760c08601848361229e565b9250506123a7606086018661223a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123dd85838561229e565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261241657600080fd5b6020928801928301923591508382111561242f57600080fd5b8160061b360383131561244157600080fd5b8685030160a0870152611af88482846122e7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610639576000816000526020600020601f850160051c810160208610156124ad5750805b601f850160051c820191505b818110156111ec578281556001016124b9565b67ffffffffffffffff8311156124e4576124e4612455565b6124f8836124f28354612115565b83612484565b6000601f84116001811461254a57600085156125145750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e3a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125995786850135825560209485019460019092019101612579565b50868210156125d4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612643577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561265381611dd3565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156126b9576126b9612455565b80548382558084101561270b576126cf816125e6565b6126d8856125e6565b6000848152602081209283019291909101905b82821015612707578082558060018301556002820191506126eb565b5050505b5060008181526020812083915b858110156111ec5761272a8383612648565b6040929092019160029190910190600101612718565b8135815560018101602083013561275681611c31565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561279660408601866121d5565b935091506127a88383600287016124cc565b6127b560608601866121d5565b935091506127c78383600387016124cc565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126127fe57600080fd5b91840191823591508082111561281357600080fd5b506020820191508060061b360382131561282c57600080fd5b61283a8183600486016126a0565b50505050565b600082516121cb818460208701611ce5565b60006020828403121561286457600080fd5b8151801515811461150057600080fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"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\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"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\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002a8738038062002a878339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b60805161288a620001fd600039600081816103760152610e59015261288a6000f3fe60806040526004361061012d5760003560e01c806379ba5097116100a5578063b0f479a111610074578063d8469e4011610059578063d8469e40146103ba578063e4ca8754146103da578063f2fde38b146103fa57600080fd5b8063b0f479a114610367578063cf6730f81461039a57600080fd5b806379ba5097146102c65780638462a2b9146102db57806385572ffb146102fb5780638da5cb5b1461031b57600080fd5b80635075a9d4116100fc5780635e35359e116100e15780635e35359e146102595780636939cd97146102795780636d62d633146102a657600080fd5b80635075a9d41461020b578063536c6bfa1461023957600080fd5b80630e958d6b14610139578063181f5a771461016e57806335f170ef146101ba57806341eade46146101e957600080fd5b3661013457005b600080fd5b34801561014557600080fd5b50610159610154366004611c99565b61041a565b60405190151581526020015b60405180910390f35b34801561017a57600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101659190611d5c565b3480156101c657600080fd5b506101da6101d5366004611d6f565b610465565b60405161016593929190611d8c565b3480156101f557600080fd5b50610209610204366004611d6f565b61059c565b005b34801561021757600080fd5b5061022b610226366004611dc3565b6105e7565b604051908152602001610165565b34801561024557600080fd5b50610209610254366004611dfe565b6105fa565b34801561026557600080fd5b50610209610274366004611e2a565b610610565b34801561028557600080fd5b50610299610294366004611dc3565b61063e565b6040516101659190611e6b565b3480156102b257600080fd5b506102096102c1366004611f52565b610849565b3480156102d257600080fd5b50610209610b63565b3480156102e757600080fd5b506102096102f6366004611fc7565b610c60565b34801561030757600080fd5b50610209610316366004612033565b610e41565b34801561032757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610165565b34801561037357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610342565b3480156103a657600080fd5b506102096103b5366004612033565b611074565b3480156103c657600080fd5b506102096103d536600461206e565b611173565b3480156103e657600080fd5b506102096103f5366004611dc3565b6111f4565b34801561040657600080fd5b506102096104153660046120f1565b61145e565b67ffffffffffffffff83166000908152600260205260408082209051600390910190610449908590859061210e565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161048b9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b79061211e565b80156105045780601f106104d957610100808354040283529160200191610504565b820191906000526020600020905b8154815290600101906020018083116104e757829003601f168201915b5050505050908060020180546105199061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546105459061211e565b80156105925780601f1061056757610100808354040283529160200191610592565b820191906000526020600020905b81548152906001019060200180831161057557829003601f168201915b5050505050905083565b6105a4611472565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006105f46004836114f5565b92915050565b610602611472565b61060c8282611508565b5050565b610618611472565b61063973ffffffffffffffffffffffffffffffffffffffff84168383611662565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106ad9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546106d99061211e565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050815260200160038201805461073f9061211e565b80601f016020809104026020016040519081016040528092919081815260200182805461076b9061211e565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561083b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107e6565b505050915250909392505050565b610851611472565b600161085e6004846114f5565b1461089d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108ad8260025b600491906116ef565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916108f59061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546109219061211e565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b505050505081526020016003820180546109879061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546109b39061211e565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a835760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a2e565b5050505081525050905060005b816080015151811015610b1257610b0a8383608001518381518110610ab757610ab7612171565b60200260200101516020015184608001518481518110610ad957610ad9612171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166116629092919063ffffffff16565b600101610a90565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610894565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c68611472565b60005b81811015610d4b5760026000848484818110610c8957610c89612171565b9050602002810190610c9b91906121a0565b610ca9906020810190611d6f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610ce057610ce0612171565b9050602002810190610cf291906121a0565b610d009060208101906121de565b604051610d0e92919061210e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c6b565b5060005b83811015610e3a57600160026000878785818110610d6f57610d6f612171565b9050602002810190610d8191906121a0565b610d8f906020810190611d6f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610dc657610dc6612171565b9050602002810190610dd891906121a0565b610de69060208101906121de565b604051610df492919061210e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d4f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb2576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610894565b610ec26040820160208301611d6f565b67ffffffffffffffff81166000908152600260205260409020600181018054610eea9061211e565b15905080610ef95750805460ff165b15610f3c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610894565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f78908690600401612350565b600060405180830381600087803b158015610f9257600080fd5b505af1925050508015610fa3575060015b611043573d808015610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50610fe3843560016108a4565b508335600090815260036020526040902084906110008282612749565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611035908490611d5c565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b3330146110ad576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110bd6040820160208301611d6f565b6110ca60408301836121de565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111289250849150612849565b9081526040519081900360200190205460ff1661063957806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108949190611d5c565b61117b611472565b67ffffffffffffffff85166000908152600260205260409020600181016111a38587836124d5565b5081156111bb57600281016111b98385836124d5565b505b805460ff16156111ec5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016112016004836114f5565b1461123b576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610894565b6112468160006108a4565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161128e9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba9061211e565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b505050505081526020016003820180546113209061211e565b80601f016020809104026020016040519081016040528092919081815260200182805461134c9061211e565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561141c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016113c7565b5050505081525050905061142f81611704565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611466611472565b61146f8161170c565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610894565b565b60006115018383611801565b9392505050565b80471015611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610894565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146115cc576040519150601f19603f3d011682016040523d82523d6000602084013e6115d1565b606091505b5050905080610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610894565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261063990849061188b565b60006116fc848484611997565b949350505050565b61146f611472565b3373ffffffffffffffffffffffffffffffffffffffff82160361178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610894565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611825575061182584846119b4565b611501576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610894565b60006118ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119c09092919063ffffffff16565b805190915015610639578080602001905181019061190b919061285b565b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610894565b600082815260028401602052604081208290556116fc84846119cf565b600061150183836119db565b60606116fc84846000856119f3565b60006115018383611b0c565b60008181526001830160205260408120541515611501565b606082471015611a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610894565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611aae9190612849565b60006040518083038185875af1925050503d8060008114611aeb576040519150601f19603f3d011682016040523d82523d6000602084013e611af0565b606091505b5091509150611b0187838387611b5b565b979650505050505050565b6000818152600183016020526040812054611b53575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f4565b5060006105f4565b60608315611bf1578251600003611bea5773ffffffffffffffffffffffffffffffffffffffff85163b611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610894565b50816116fc565b6116fc8383815115611c065781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108949190611d5c565b67ffffffffffffffff8116811461146f57600080fd5b60008083601f840112611c6257600080fd5b50813567ffffffffffffffff811115611c7a57600080fd5b602083019150836020828501011115611c9257600080fd5b9250929050565b600080600060408486031215611cae57600080fd5b8335611cb981611c3a565b9250602084013567ffffffffffffffff811115611cd557600080fd5b611ce186828701611c50565b9497909650939450505050565b60005b83811015611d09578181015183820152602001611cf1565b50506000910152565b60008151808452611d2a816020860160208601611cee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115016020830184611d12565b600060208284031215611d8157600080fd5b813561150181611c3a565b8315158152606060208201526000611da76060830185611d12565b8281036040840152611db98185611d12565b9695505050505050565b600060208284031215611dd557600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461146f57600080fd5b60008060408385031215611e1157600080fd5b8235611e1c81611ddc565b946020939093013593505050565b600080600060608486031215611e3f57600080fd5b8335611e4a81611ddc565b92506020840135611e5a81611ddc565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611ea960c0860183611d12565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611ee58483611d12565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f46578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611f07565b50979650505050505050565b60008060408385031215611f6557600080fd5b823591506020830135611f7781611ddc565b809150509250929050565b60008083601f840112611f9457600080fd5b50813567ffffffffffffffff811115611fac57600080fd5b6020830191508360208260051b8501011115611c9257600080fd5b60008060008060408587031215611fdd57600080fd5b843567ffffffffffffffff80821115611ff557600080fd5b61200188838901611f82565b9096509450602087013591508082111561201a57600080fd5b5061202787828801611f82565b95989497509550505050565b60006020828403121561204557600080fd5b813567ffffffffffffffff81111561205c57600080fd5b820160a0818503121561150157600080fd5b60008060008060006060868803121561208657600080fd5b853561209181611c3a565b9450602086013567ffffffffffffffff808211156120ae57600080fd5b6120ba89838a01611c50565b909650945060408801359150808211156120d357600080fd5b506120e088828901611c50565b969995985093965092949392505050565b60006020828403121561210357600080fd5b813561150181611ddc565b8183823760009101908152919050565b600181811c9082168061213257607f821691505b60208210810361216b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126121d457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261221357600080fd5b83018035915067ffffffffffffffff82111561222e57600080fd5b602001915036819003821315611c9257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261227857600080fd5b830160208101925035905067ffffffffffffffff81111561229857600080fd5b803603821315611c9257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561234557813561231381611ddc565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612300565b509495945050505050565b60208152813560208201526000602083013561236b81611c3a565b67ffffffffffffffff80821660408501526123896040860186612243565b925060a060608601526123a060c0860184836122a7565b9250506123b06060860186612243565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123e68583856122a7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261241f57600080fd5b6020928801928301923591508382111561243857600080fd5b8160061b360383131561244a57600080fd5b8685030160a0870152611b018482846122f0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610639576000816000526020600020601f850160051c810160208610156124b65750805b601f850160051c820191505b818110156111ec578281556001016124c2565b67ffffffffffffffff8311156124ed576124ed61245e565b612501836124fb835461211e565b8361248d565b6000601f841160018114612553576000851561251d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e3a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125a25786850135825560209485019460019092019101612582565b50868210156125dd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216821461264c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561265c81611ddc565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156126c2576126c261245e565b805483825580841015612714576126d8816125ef565b6126e1856125ef565b6000848152602081209283019291909101905b82821015612710578082558060018301556002820191506126f4565b5050505b5060008181526020812083915b858110156111ec576127338383612651565b6040929092019160029190910190600101612721565b8135815560018101602083013561275f81611c3a565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561279f60408601866121de565b935091506127b18383600287016124d5565b6127be60608601866121de565b935091506127d08383600387016124d5565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261280757600080fd5b91840191823591508082111561281c57600080fd5b506020820191508060061b360382131561283557600080fd5b6128438183600486016126a9565b50505050565b600082516121d4818460208701611cee565b60006020828403121561286d57600080fd5b8151801515811461150157600080fdfea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -299,11 +299,11 @@ func (_CCIPReceiver *CCIPReceiverCallerSession) Owner() (common.Address, error) return _CCIPReceiver.Contract.Owner(&_CCIPReceiver.CallOpts) } -func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPReceiver.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _CCIPReceiver.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -318,16 +318,16 @@ func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, arg0 } -func (_CCIPReceiver *CCIPReceiverSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPReceiver *CCIPReceiverSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, arg0) + return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, destChainSelector) } -func (_CCIPReceiver *CCIPReceiverCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPReceiver *CCIPReceiverCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, arg0) + return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, destChainSelector) } func (_CCIPReceiver *CCIPReceiverCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -1343,7 +1343,7 @@ type CCIPReceiverInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index 8ed77d40ce..c309ab05e4 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -41,7 +41,7 @@ type ClientEVMTokenAmount struct { } var CCIPSenderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", Bin: "0x60a06040523480156200001157600080fd5b506040516200219c3803806200219c8339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611f8a620002126000396000818161028401528181610b8d01528181610c5601528181610d2a0152610d660152611f8a6000f3fe6080604052600436106100d65760003560e01c806379ba50971161007f578063b0f479a111610059578063b0f479a114610275578063d8469e40146102a8578063effde240146102c8578063f2fde38b146102e957600080fd5b806379ba5097146101f45780638462a2b9146102095780638da5cb5b1461022957600080fd5b806341eade46116100b057806341eade4614610192578063536c6bfa146101b45780635e35359e146101d457600080fd5b80630e958d6b146100e2578063181f5a771461011757806335f170ef1461016357600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101026100fd3660046116e6565b610309565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b50604080518082018252601481527f4343495053656e64657220312e302e302d6465760000000000000000000000006020820152905161010e91906117a7565b34801561016f57600080fd5b5061018361017e3660046117c1565b610354565b60405161010e939291906117dc565b34801561019e57600080fd5b506101b26101ad3660046117c1565b61048b565b005b3480156101c057600080fd5b506101b26101cf366004611835565b6104d6565b3480156101e057600080fd5b506101b26101ef36600461186c565b6104ec565b34801561020057600080fd5b506101b261051a565b34801561021557600080fd5b506101b26102243660046118f2565b61061c565b34801561023557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010e565b34801561028157600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610250565b3480156102b457600080fd5b506101b26102c336600461195e565b6107fd565b6102db6102d63660046119df565b61087e565b60405190815260200161010e565b3480156102f557600080fd5b506101b2610304366004611aa0565b610e49565b67ffffffffffffffff831660009081526002602052604080822090516003909101906103389085908590611abd565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161037a90611acd565b80601f01602080910402602001604051908101604052809291908181526020018280546103a690611acd565b80156103f35780601f106103c8576101008083540402835291602001916103f3565b820191906000526020600020905b8154815290600101906020018083116103d657829003601f168201915b50505050509080600201805461040890611acd565b80601f016020809104026020016040519081016040528092919081815260200182805461043490611acd565b80156104815780601f1061045657610100808354040283529160200191610481565b820191906000526020600020905b81548152906001019060200180831161046457829003601f168201915b5050505050905083565b610493610e5d565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6104de610e5d565b6104e88282610ee0565b5050565b6104f4610e5d565b61051573ffffffffffffffffffffffffffffffffffffffff8416838361103a565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610624610e5d565b60005b81811015610707576002600084848481811061064557610645611b20565b90506020028101906106579190611b4f565b6106659060208101906117c1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030183838381811061069c5761069c611b20565b90506020028101906106ae9190611b4f565b6106bc906020810190611b8d565b6040516106ca929190611abd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610627565b5060005b838110156107f65760016002600087878581811061072b5761072b611b20565b905060200281019061073d9190611b4f565b61074b9060208101906117c1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061078257610782611b20565b90506020028101906107949190611b4f565b6107a2906020810190611b8d565b6040516107b0929190611abd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161070b565b5050505050565b610805610e5d565b67ffffffffffffffff851660009081526002602052604090206001810161082d858783611c69565b5081156108455760028101610843838583611c69565b505b805460ff16156108765780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b67ffffffffffffffff86166000908152600260205260408120600181018054899291906108aa90611acd565b159050806108b95750805460ff165b156108fc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610597565b6040805160a08101825267ffffffffffffffff8b1660009081526002602052918220600101805482919061092f90611acd565b80601f016020809104026020016040519081016040528092919081815260200182805461095b90611acd565b80156109a85780601f1061097d576101008083540402835291602001916109a8565b820191906000526020600020905b81548152906001019060200180831161098b57829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610a3857610a2960408302860136819003810190611d83565b81526020019060010190610a0c565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600260008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018054610a9390611acd565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90611acd565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b5050505050815250905060005b88811015610c1557610b8833308c8c85818110610b3857610b38611b20565b905060400201602001358d8d86818110610b5457610b54611b20565b610b6a9260206040909202019081019150611aa0565b73ffffffffffffffffffffffffffffffffffffffff1692919061110e565b610c0d7f00000000000000000000000000000000000000000000000000000000000000008b8b84818110610bbe57610bbe611b20565b905060400201602001358c8c85818110610bda57610bda611b20565b610bf09260206040909202019081019150611aa0565b73ffffffffffffffffffffffffffffffffffffffff169190611172565b600101610b19565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90610c8d908e908690600401611ddb565b602060405180830381865afa158015610caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cce9190611ef0565b905073ffffffffffffffffffffffffffffffffffffffff861615610d4f57610d0e73ffffffffffffffffffffffffffffffffffffffff871633308461110e565b610d4f73ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000083611172565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615610d9c576000610d9e565b825b8d856040518463ffffffff1660e01b8152600401610dbd929190611ddb565b60206040518083038185885af1158015610ddb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e009190611ef0565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051610e3391815260200190565b60405180910390a1505050509695505050505050565b610e51610e5d565b610e5a81611270565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610597565b565b80471015610f4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610597565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610fa4576040519150601f19603f3d011682016040523d82523d6000602084013e610fa9565b606091505b5050905080610515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610597565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526105159084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611365565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261116c9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161108c565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190611ef0565b6112179190611f09565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061116c9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161108c565b3373ffffffffffffffffffffffffffffffffffffffff8216036112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610597565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006113c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114719092919063ffffffff16565b80519091501561051557808060200190518101906113e59190611f49565b610515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610597565b60606114808484600085611488565b949350505050565b60608247101561151a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610597565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115439190611f6b565b60006040518083038185875af1925050503d8060008114611580576040519150601f19603f3d011682016040523d82523d6000602084013e611585565b606091505b5091509150611596878383876115a1565b979650505050505050565b606083156116375782516000036116305773ffffffffffffffffffffffffffffffffffffffff85163b611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610597565b5081611480565b611480838381511561164c5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059791906117a7565b803567ffffffffffffffff8116811461169857600080fd5b919050565b60008083601f8401126116af57600080fd5b50813567ffffffffffffffff8111156116c757600080fd5b6020830191508360208285010111156116df57600080fd5b9250929050565b6000806000604084860312156116fb57600080fd5b61170484611680565b9250602084013567ffffffffffffffff81111561172057600080fd5b61172c8682870161169d565b9497909650939450505050565b60005b8381101561175457818101518382015260200161173c565b50506000910152565b60008151808452611775816020860160208601611739565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117ba602083018461175d565b9392505050565b6000602082840312156117d357600080fd5b6117ba82611680565b83151581526060602082015260006117f7606083018561175d565b8281036040840152611809818561175d565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e5a57600080fd5b6000806040838503121561184857600080fd5b823561185381611813565b946020939093013593505050565b803561169881611813565b60008060006060848603121561188157600080fd5b833561188c81611813565b9250602084013561189c81611813565b929592945050506040919091013590565b60008083601f8401126118bf57600080fd5b50813567ffffffffffffffff8111156118d757600080fd5b6020830191508360208260051b85010111156116df57600080fd5b6000806000806040858703121561190857600080fd5b843567ffffffffffffffff8082111561192057600080fd5b61192c888389016118ad565b9096509450602087013591508082111561194557600080fd5b50611952878288016118ad565b95989497509550505050565b60008060008060006060868803121561197657600080fd5b61197f86611680565b9450602086013567ffffffffffffffff8082111561199c57600080fd5b6119a889838a0161169d565b909650945060408801359150808211156119c157600080fd5b506119ce8882890161169d565b969995985093965092949392505050565b600080600080600080608087890312156119f857600080fd5b611a0187611680565b9550602087013567ffffffffffffffff80821115611a1e57600080fd5b818901915089601f830112611a3257600080fd5b813581811115611a4157600080fd5b8a60208260061b8501011115611a5657600080fd5b602083019750809650506040890135915080821115611a7457600080fd5b50611a8189828a0161169d565b9094509250611a94905060608801611861565b90509295509295509295565b600060208284031215611ab257600080fd5b81356117ba81611813565b8183823760009101908152919050565b600181811c90821680611ae157607f821691505b602082108103611b1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611b8357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bc257600080fd5b83018035915067ffffffffffffffff821115611bdd57600080fd5b6020019150368190038213156116df57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610515576000816000526020600020601f850160051c81016020861015611c4a5750805b601f850160051c820191505b8181101561087657828155600101611c56565b67ffffffffffffffff831115611c8157611c81611bf2565b611c9583611c8f8354611acd565b83611c21565b6000601f841160018114611ce75760008515611cb15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556107f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611d365786850135825560209485019460019092019101611d16565b5086821015611d71577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060408284031215611d9557600080fd5b6040516040810181811067ffffffffffffffff82111715611db857611db8611bf2565b6040528235611dc681611813565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a06040860152611e0a60e086018261175d565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878403016060880152611e45838361175d565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611ea6578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190611e67565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a01529550611ee2818761175d565b9a9950505050505050505050565b600060208284031215611f0257600080fd5b5051919050565b80820180821115611f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b600060208284031215611f5b57600080fd5b815180151581146117ba57600080fd5b60008251611b8381846020870161173956fea164736f6c6343000818000a", } @@ -247,11 +247,11 @@ func (_CCIPSender *CCIPSenderCallerSession) Owner() (common.Address, error) { return _CCIPSender.Contract.Owner(&_CCIPSender.CallOpts) } -func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPSender.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _CCIPSender.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -266,16 +266,16 @@ func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, arg0 uin } -func (_CCIPSender *CCIPSenderSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPSender *CCIPSenderSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, arg0) + return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, destChainSelector) } -func (_CCIPSender *CCIPSenderCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPSender *CCIPSenderCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, arg0) + return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, destChainSelector) } func (_CCIPSender *CCIPSenderCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -963,7 +963,7 @@ type CCIPSenderInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index cba0ab7ac8..6f043ea949 100644 --- a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go +++ b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var PingPongDemoMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620046bf380380620046bf833981016040819052620000349162000563565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c4816200013f565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013357620001336001600160a01b03821683600019620001ea565b50505050505062000688565b336001600160a01b03821603620001995760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002629190620005a2565b6200026e9190620005bc565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002ca91869190620002d016565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031f906001600160a01b038516908490620003a6565b805190915015620003a15780806020019051810190620003409190620005e4565b620003a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003b78484600085620003bf565b949350505050565b606082471015620004225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b0316858760405162000440919062000635565b60006040518083038185875af1925050503d80600081146200047f576040519150601f19603f3d011682016040523d82523d6000602084013e62000484565b606091505b5090925090506200049887838387620004a3565b979650505050505050565b60608315620005175782516000036200050f576001600160a01b0385163b6200050f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003b7565b620003b783838151156200052e5781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000653565b6001600160a01b03811681146200056057600080fd5b50565b600080604083850312156200057757600080fd5b825162000584816200054a565b602084015190925062000597816200054a565b809150509250929050565b600060208284031215620005b557600080fd5b5051919050565b80820180821115620005de57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f757600080fd5b815180151581146200060857600080fd5b9392505050565b60005b838110156200062c57818101518382015260200162000612565b50506000910152565b60008251620006498184602087016200060f565b9190910192915050565b6020815260008251806020840152620006748160408501602087016200060f565b601f01601f19169190910160400192915050565b608051613ff1620006ce6000396000818161057e01528181610759015281816107e90152818161137301528181612033015281816120fc01526121d40152613ff16000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b5a1101111610095578063e4ca875411610064578063e4ca875414610663578063e89b448514610683578063f2fde38b14610696578063ff2deec3146106b657600080fd5b8063b5a11011146105da578063bee518a4146105fa578063cf6730f814610623578063d8469e401461064357600080fd5b80638da5cb5b116100d15780638da5cb5b146105245780639d2aede51461054f578063b0f479a11461056f578063b187bd26146105a257600080fd5b80636fef519e1461048657806379ba5097146104cf5780638462a2b9146104e457806385572ffb1461050457600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f95780635e35359e146104195780636939cd97146104395780636d62d6331461046657600080fd5b80632b6e5d631461032457806335f170ef1461037c57806341eade46146103ab5780635075a9d4146103cb57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004612ee6565b60086020526000908152604090205460ff1681565b6040516102259190612eff565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612f9f565b6106e3565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e610279366004613016565b61072e565b005b34801561028c57600080fd5b5061027e61029b366004613041565b6108a6565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906130cc565b3480156102fb57600080fd5b5061027e61030a3660046130df565b610900565b34801561031b57600080fd5b5061027e610943565b34801561033057600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046130df565b61097f565b604051610225939291906130fc565b3480156103b757600080fd5b5061027e6103c63660046130df565b610ab6565b3480156103d757600080fd5b506103eb6103e6366004612ee6565b610b01565b604051908152602001610225565b34801561040557600080fd5b5061027e610414366004613133565b610b14565b34801561042557600080fd5b5061027e61043436600461315f565b610b2a565b34801561044557600080fd5b50610459610454366004612ee6565b610b58565b60405161022591906131fd565b34801561047257600080fd5b5061027e61048136600461329a565b610d63565b34801561049257600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104db57600080fd5b5061027e61107d565b3480156104f057600080fd5b5061027e6104ff36600461330f565b61117a565b34801561051057600080fd5b5061027e61051f36600461337b565b61135b565b34801561053057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055b57600080fd5b5061027e61056a366004613016565b611656565b34801561057b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156105ae57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105e657600080fd5b5061027e6105f53660046133b6565b611710565b34801561060657600080fd5b5060095460405167ffffffffffffffff9091168152602001610225565b34801561062f57600080fd5b5061027e61063e36600461337b565b611883565b34801561064f57600080fd5b5061027e61065e3660046133e4565b611a70565b34801561066f57600080fd5b5061027e61067e366004612ee6565b611aef565b6103eb61069136600461359c565b611d58565b3480156106a257600080fd5b5061027e6106b1366004613016565b6122dc565b3480156106c257600080fd5b506007546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071290859085906136a9565b9081526040519081900360200190205460ff1690509392505050565b6107366122f0565b60075473ffffffffffffffffffffffffffffffffffffffff1615610799576107997f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000612371565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610848576108487f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612571565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ae6122f0565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109086122f0565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61094b6122f0565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097d6001612675565b565b6002602052600090815260409020805460018201805460ff90921692916109a5906136b9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906136b9565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806002018054610a33906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f906136b9565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905083565b610abe6122f0565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610b0e600483612782565b92915050565b610b1c6122f0565b610b268282612795565b5050565b610b326122f0565b610b5373ffffffffffffffffffffffffffffffffffffffff841683836128ef565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610bc7906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf3906136b9565b8015610c405780601f10610c1557610100808354040283529160200191610c40565b820191906000526020600020905b815481529060010190602001808311610c2357829003601f168201915b50505050508152602001600382018054610c59906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c85906136b9565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d555760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d00565b505050915250909392505050565b610d6b6122f0565b6001610d78600484612782565b14610db7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610dc78260025b60049190612945565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610e0f906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b906136b9565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b50505050508152602001600382018054610ea1906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecd906136b9565b8015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f9d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f48565b5050505081525050905060005b81608001515181101561102c576110248383608001518381518110610fd157610fd161370c565b60200260200101516020015184608001518481518110610ff357610ff361370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128ef9092919063ffffffff16565b600101610faa565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610dae565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111826122f0565b60005b8181101561126557600260008484848181106111a3576111a361370c565b90506020028101906111b5919061373b565b6111c39060208101906130df565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111fa576111fa61370c565b905060200281019061120c919061373b565b61121a906020810190613779565b6040516112289291906136a9565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611185565b5060005b83811015611354576001600260008787858181106112895761128961370c565b905060200281019061129b919061373b565b6112a99060208101906130df565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112e0576112e061370c565b90506020028101906112f2919061373b565b611300906020810190613779565b60405161130e9291906136a9565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611269565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113cc576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610dae565b6113dc60408201602083016130df565b6113e96040830183613779565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061144792508491506137de565b9081526040519081900360200190205460ff1661149257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b6114a260408401602085016130df565b67ffffffffffffffff811660009081526002602052604090206001810180546114ca906136b9565b159050806114d95750805460ff165b1561151c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115589088906004016138f2565b600060405180830381600087803b15801561157257600080fd5b505af1925050508015611583575060015b611623573d8080156115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b506115c386356001610dbe565b508535600090815260036020526040902086906115e08282613cc4565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116159084906130cc565b60405180910390a250611354565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165e6122f0565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610b269082613dbe565b6117186122f0565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d3916137de565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610b539082613dbe565b3330146118bc576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118cc60408201602083016130df565b6118d96040830183613779565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061193792508491506137de565b9081526040519081900360200190205460ff1661198257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b61199260408401602085016130df565b67ffffffffffffffff811660009081526002602052604090206001810180546119ba906136b9565b159050806119c95750805460ff165b15611a0c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6000611a1b6060870187613779565b810190611a289190612ee6565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6857611a68611a63826001613ed8565b612675565b505050505050565b611a786122f0565b67ffffffffffffffff8516600090815260026020526040902060018101611aa0858783613a48565b508115611ab85760028101611ab6838583613a48565b505b805460ff1615611a685780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b611af76122f0565b6001611b04600483612782565b14611b3e576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610dae565b611b49816000610dbe565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b91906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbd906136b9565b8015611c0a5780601f10611bdf57610100808354040283529160200191611c0a565b820191906000526020600020905b815481529060010190602001808311611bed57829003601f168201915b50505050508152602001600382018054611c23906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f906136b9565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611d1f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611cca565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611d84906136b9565b15905080611d935750805460ff165b15611dd6576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e09906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e35906136b9565b8015611e825780601f10611e5757610100808354040283529160200191611e82565b820191906000526020600020905b815481529060010190602001808311611e6557829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611ee1906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0d906136b9565b8015611f5a5780601f10611f2f57610100808354040283529160200191611f5a565b820191906000526020600020905b815481529060010190602001808311611f3d57829003601f168201915b5050505050815250905060005b86518110156120bb57611fd73330898481518110611f8757611f8761370c565b6020026020010151602001518a8581518110611fa557611fa561370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661295a909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106120075761200761370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120b3576120b37f00000000000000000000000000000000000000000000000000000000000000008883815181106120645761206461370c565b6020026020010151602001518984815181106120825761208261370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125719092919063ffffffff16565b600101611f67565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90612133908b908690600401613eeb565b602060405180830381865afa158015612150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121749190613fae565b60075490915073ffffffffffffffffffffffffffffffffffffffff16156121ba576007546121ba9073ffffffffffffffffffffffffffffffffffffffff1633308461295a565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f991161561220957600061220b565b825b8a856040518463ffffffff1660e01b815260040161222a929190613eeb565b60206040518083038185885af1158015612248573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061226d9190613fae565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6122e46122f0565b6122ed816129b8565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610dae565b80158061241157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190613fae565b155b61249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612aad565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260c9190613fae565b6126169190613ed8565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061266f9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016124ef565b50505050565b806001166001036126b8576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126ec565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161270191815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610b539267ffffffffffffffff9091169161277b565b60408051808201909152600080825260208201528152602001906001900390816127545790505b5083611d58565b600061278e8383612bb9565b9392505050565b804710156127ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dae565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612859576040519150601f19603f3d011682016040523d82523d6000602084013e61285e565b606091505b5050905080610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124ef565b6000612952848484612c43565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261266f9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016124ef565b3373ffffffffffffffffffffffffffffffffffffffff821603612a37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610dae565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c609092919063ffffffff16565b805190915015610b535780806020019051810190612b2d9190613fc7565b610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dae565b600081815260028301602052604081205480151580612bdd5750612bdd8484612c6f565b61278e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610dae565b600082815260028401602052604081208290556129528484612c7b565b60606129528484600085612c87565b600061278e8383612da0565b600061278e8383612db8565b606082471015612d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dae565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d4291906137de565b60006040518083038185875af1925050503d8060008114612d7f576040519150601f19603f3d011682016040523d82523d6000602084013e612d84565b606091505b5091509150612d9587838387612e07565b979650505050505050565b6000818152600183016020526040812054151561278e565b6000818152600183016020526040812054612dff57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0e565b506000610b0e565b60608315612e9d578251600003612e965773ffffffffffffffffffffffffffffffffffffffff85163b612e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dae565b5081612952565b6129528383815115612eb25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b600060208284031215612ef857600080fd5b5035919050565b6020810160038310612f3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146122ed57600080fd5b60008083601f840112612f6857600080fd5b50813567ffffffffffffffff811115612f8057600080fd5b602083019150836020828501011115612f9857600080fd5b9250929050565b600080600060408486031215612fb457600080fd5b8335612fbf81612f40565b9250602084013567ffffffffffffffff811115612fdb57600080fd5b612fe786828701612f56565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122ed57600080fd5b60006020828403121561302857600080fd5b813561278e81612ff4565b80151581146122ed57600080fd5b60006020828403121561305357600080fd5b813561278e81613033565b60005b83811015613079578181015183820152602001613061565b50506000910152565b6000815180845261309a81602086016020860161305e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061278e6020830184613082565b6000602082840312156130f157600080fd5b813561278e81612f40565b83151581526060602082015260006131176060830185613082565b82810360408401526131298185613082565b9695505050505050565b6000806040838503121561314657600080fd5b823561315181612ff4565b946020939093013593505050565b60008060006060848603121561317457600080fd5b833561317f81612ff4565b9250602084013561318f81612ff4565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156131f2578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016131b5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261323760c0840182613082565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526132738383613082565b925060808601519150808584030160a08601525061329182826131a0565b95945050505050565b600080604083850312156132ad57600080fd5b8235915060208301356132bf81612ff4565b809150509250929050565b60008083601f8401126132dc57600080fd5b50813567ffffffffffffffff8111156132f457600080fd5b6020830191508360208260051b8501011115612f9857600080fd5b6000806000806040858703121561332557600080fd5b843567ffffffffffffffff8082111561333d57600080fd5b613349888389016132ca565b9096509450602087013591508082111561336257600080fd5b5061336f878288016132ca565b95989497509550505050565b60006020828403121561338d57600080fd5b813567ffffffffffffffff8111156133a457600080fd5b820160a0818503121561278e57600080fd5b600080604083850312156133c957600080fd5b82356133d481612f40565b915060208301356132bf81612ff4565b6000806000806000606086880312156133fc57600080fd5b853561340781612f40565b9450602086013567ffffffffffffffff8082111561342457600080fd5b61343089838a01612f56565b9096509450604088013591508082111561344957600080fd5b5061345688828901612f56565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156134b9576134b9613467565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561350657613506613467565b604052919050565b600082601f83011261351f57600080fd5b813567ffffffffffffffff81111561353957613539613467565b61356a60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134bf565b81815284602083860101111561357f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156135b157600080fd5b83356135bc81612f40565b925060208481013567ffffffffffffffff808211156135da57600080fd5b818701915087601f8301126135ee57600080fd5b81358181111561360057613600613467565b61360e848260051b016134bf565b81815260069190911b8301840190848101908a83111561362d57600080fd5b938501935b82851015613679576040858c03121561364b5760008081fd5b613653613496565b853561365e81612ff4565b81528587013587820152825260409094019390850190613632565b96505050604087013592508083111561369157600080fd5b505061369f8682870161350e565b9150509250925092565b8183823760009101908152919050565b600181811c908216806136cd57607f821691505b602082108103613706577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261376f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137ae57600080fd5b83018035915067ffffffffffffffff8211156137c957600080fd5b602001915036819003821315612f9857600080fd5b6000825161376f81846020870161305e565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261382557600080fd5b830160208101925035905067ffffffffffffffff81111561384557600080fd5b803603821315612f9857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156131f25781356138c081612ff4565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016138ad565b60208152813560208201526000602083013561390d81612f40565b67ffffffffffffffff808216604085015261392b60408601866137f0565b925060a0606086015261394260c086018483613854565b92505061395260608601866137f0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613988858385613854565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126139c157600080fd5b602092880192830192359150838211156139da57600080fd5b8160061b36038313156139ec57600080fd5b8685030160a0870152612d9584828461389d565b601f821115610b53576000816000526020600020601f850160051c81016020861015613a295750805b601f850160051c820191505b81811015611a6857828155600101613a35565b67ffffffffffffffff831115613a6057613a60613467565b613a7483613a6e83546136b9565b83613a00565b6000601f841160018114613ac65760008515613a905750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611354565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b155786850135825560209485019460019092019101613af5565b5086821015613b50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b9c81612ff4565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c0257613c02613467565b805483825580841015613c8f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613c4357613c43613b62565b8086168614613c5457613c54613b62565b5060008360005260206000208360011b81018760011b820191505b80821015613c8a578282558284830155600282019150613c6f565b505050505b5060008181526020812083915b85811015611a6857613cae8383613b91565b6040929092019160029190910190600101613c9c565b81358155600181016020830135613cda81612f40565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d1a6040860186613779565b93509150613d2c838360028701613a48565b613d396060860186613779565b93509150613d4b838360038701613a48565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d8257600080fd5b918401918235915080821115613d9757600080fd5b506020820191508060061b3603821315613db057600080fd5b61266f818360048601613be9565b815167ffffffffffffffff811115613dd857613dd8613467565b613dec81613de684546136b9565b84613a00565b602080601f831160018114613e3f5760008415613e095750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a68565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e8c57888601518255948401946001909101908401613e6d565b5085821015613ec857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610b0e57610b0e613b62565b67ffffffffffffffff83168152604060208201526000825160a06040840152613f1760e0840182613082565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613f538383613082565b92506040860151915080858403016080860152613f7083836131a0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506131298282613082565b600060208284031215613fc057600080fd5b5051919050565b600060208284031215613fd957600080fd5b815161278e8161303356fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620046c8380380620046c8833981016040819052620000349162000563565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c4816200013f565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013357620001336001600160a01b03821683600019620001ea565b50505050505062000688565b336001600160a01b03821603620001995760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002629190620005a2565b6200026e9190620005bc565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002ca91869190620002d016565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031f906001600160a01b038516908490620003a6565b805190915015620003a15780806020019051810190620003409190620005e4565b620003a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003b78484600085620003bf565b949350505050565b606082471015620004225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b0316858760405162000440919062000635565b60006040518083038185875af1925050503d80600081146200047f576040519150601f19603f3d011682016040523d82523d6000602084013e62000484565b606091505b5090925090506200049887838387620004a3565b979650505050505050565b60608315620005175782516000036200050f576001600160a01b0385163b6200050f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003b7565b620003b783838151156200052e5781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000653565b6001600160a01b03811681146200056057600080fd5b50565b600080604083850312156200057757600080fd5b825162000584816200054a565b602084015190925062000597816200054a565b809150509250929050565b600060208284031215620005b557600080fd5b5051919050565b80820180821115620005de57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f757600080fd5b815180151581146200060857600080fd5b9392505050565b60005b838110156200062c57818101518382015260200162000612565b50506000910152565b60008251620006498184602087016200060f565b9190910192915050565b6020815260008251806020840152620006748160408501602087016200060f565b601f01601f19169190910160400192915050565b608051613ffa620006ce6000396000818161057e01528181610759015281816107e90152818161137301528181612034015281816120fd01526121d50152613ffa6000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b5a1101111610095578063e4ca875411610064578063e4ca875414610663578063e89b448514610683578063f2fde38b14610696578063ff2deec3146106b657600080fd5b8063b5a11011146105da578063bee518a4146105fa578063cf6730f814610623578063d8469e401461064357600080fd5b80638da5cb5b116100d15780638da5cb5b146105245780639d2aede51461054f578063b0f479a11461056f578063b187bd26146105a257600080fd5b80636fef519e1461048657806379ba5097146104cf5780638462a2b9146104e457806385572ffb1461050457600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f95780635e35359e146104195780636939cd97146104395780636d62d6331461046657600080fd5b80632b6e5d631461032457806335f170ef1461037c57806341eade46146103ab5780635075a9d4146103cb57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004612eef565b60086020526000908152604090205460ff1681565b6040516102259190612f08565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612fa8565b6106e3565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e61027936600461301f565b61072e565b005b34801561028c57600080fd5b5061027e61029b36600461304a565b6108a6565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906130d5565b3480156102fb57600080fd5b5061027e61030a3660046130e8565b610900565b34801561031b57600080fd5b5061027e610943565b34801561033057600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046130e8565b61097f565b60405161022593929190613105565b3480156103b757600080fd5b5061027e6103c63660046130e8565b610ab6565b3480156103d757600080fd5b506103eb6103e6366004612eef565b610b01565b604051908152602001610225565b34801561040557600080fd5b5061027e61041436600461313c565b610b14565b34801561042557600080fd5b5061027e610434366004613168565b610b2a565b34801561044557600080fd5b50610459610454366004612eef565b610b58565b6040516102259190613206565b34801561047257600080fd5b5061027e6104813660046132a3565b610d63565b34801561049257600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104db57600080fd5b5061027e61107d565b3480156104f057600080fd5b5061027e6104ff366004613318565b61117a565b34801561051057600080fd5b5061027e61051f366004613384565b61135b565b34801561053057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055b57600080fd5b5061027e61056a36600461301f565b611656565b34801561057b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156105ae57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105e657600080fd5b5061027e6105f53660046133bf565b611710565b34801561060657600080fd5b5060095460405167ffffffffffffffff9091168152602001610225565b34801561062f57600080fd5b5061027e61063e366004613384565b611883565b34801561064f57600080fd5b5061027e61065e3660046133ed565b611a70565b34801561066f57600080fd5b5061027e61067e366004612eef565b611aef565b6103eb6106913660046135a5565b611d59565b3480156106a257600080fd5b5061027e6106b136600461301f565b6122dd565b3480156106c257600080fd5b506007546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071290859085906136b2565b9081526040519081900360200190205460ff1690509392505050565b6107366122f1565b60075473ffffffffffffffffffffffffffffffffffffffff1615610799576107997f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000612372565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610848576108487f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612572565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ae6122f1565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109086122f1565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61094b6122f1565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097d6001612676565b565b6002602052600090815260409020805460018201805460ff90921692916109a5906136c2565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906136c2565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806002018054610a33906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f906136c2565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905083565b610abe6122f1565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610b0e600483612783565b92915050565b610b1c6122f1565b610b268282612796565b5050565b610b326122f1565b610b5373ffffffffffffffffffffffffffffffffffffffff841683836128f0565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610bc7906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf3906136c2565b8015610c405780601f10610c1557610100808354040283529160200191610c40565b820191906000526020600020905b815481529060010190602001808311610c2357829003601f168201915b50505050508152602001600382018054610c59906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c85906136c2565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d555760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d00565b505050915250909392505050565b610d6b6122f1565b6001610d78600484612783565b14610db7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610dc78260025b60049190612946565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610e0f906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b906136c2565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b50505050508152602001600382018054610ea1906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecd906136c2565b8015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f9d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f48565b5050505081525050905060005b81608001515181101561102c576110248383608001518381518110610fd157610fd1613715565b60200260200101516020015184608001518481518110610ff357610ff3613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128f09092919063ffffffff16565b600101610faa565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610dae565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111826122f1565b60005b8181101561126557600260008484848181106111a3576111a3613715565b90506020028101906111b59190613744565b6111c39060208101906130e8565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111fa576111fa613715565b905060200281019061120c9190613744565b61121a906020810190613782565b6040516112289291906136b2565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611185565b5060005b838110156113545760016002600087878581811061128957611289613715565b905060200281019061129b9190613744565b6112a99060208101906130e8565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112e0576112e0613715565b90506020028101906112f29190613744565b611300906020810190613782565b60405161130e9291906136b2565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611269565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113cc576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610dae565b6113dc60408201602083016130e8565b6113e96040830183613782565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061144792508491506137e7565b9081526040519081900360200190205460ff1661149257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b6114a260408401602085016130e8565b67ffffffffffffffff811660009081526002602052604090206001810180546114ca906136c2565b159050806114d95750805460ff165b1561151c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115589088906004016138fb565b600060405180830381600087803b15801561157257600080fd5b505af1925050508015611583575060015b611623573d8080156115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b506115c386356001610dbe565b508535600090815260036020526040902086906115e08282613ccd565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116159084906130d5565b60405180910390a250611354565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165e6122f1565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610b269082613dc7565b6117186122f1565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d3916137e7565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610b539082613dc7565b3330146118bc576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118cc60408201602083016130e8565b6118d96040830183613782565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061193792508491506137e7565b9081526040519081900360200190205460ff1661198257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b61199260408401602085016130e8565b67ffffffffffffffff811660009081526002602052604090206001810180546119ba906136c2565b159050806119c95750805460ff165b15611a0c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6000611a1b6060870187613782565b810190611a289190612eef565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6857611a68611a63826001613ee1565b612676565b505050505050565b611a786122f1565b67ffffffffffffffff8516600090815260026020526040902060018101611aa0858783613a51565b508115611ab85760028101611ab6838583613a51565b505b805460ff1615611a685780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611afc600483612783565b14611b36576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610dae565b611b41816000610dbe565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b89906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb5906136c2565b8015611c025780601f10611bd757610100808354040283529160200191611c02565b820191906000526020600020905b815481529060010190602001808311611be557829003601f168201915b50505050508152602001600382018054611c1b906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611c47906136c2565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611d175760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611cc2565b50505050815250509050611d2a8161295b565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611d85906136c2565b15905080611d945750805460ff165b15611dd7576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e0a906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e36906136c2565b8015611e835780601f10611e5857610100808354040283529160200191611e83565b820191906000526020600020905b815481529060010190602001808311611e6657829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611ee2906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0e906136c2565b8015611f5b5780601f10611f3057610100808354040283529160200191611f5b565b820191906000526020600020905b815481529060010190602001808311611f3e57829003601f168201915b5050505050815250905060005b86518110156120bc57611fd83330898481518110611f8857611f88613715565b6020026020010151602001518a8581518110611fa657611fa6613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612963909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061200857612008613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120b4576120b47f000000000000000000000000000000000000000000000000000000000000000088838151811061206557612065613715565b60200260200101516020015189848151811061208357612083613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125729092919063ffffffff16565b600101611f68565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90612134908b908690600401613ef4565b602060405180830381865afa158015612151573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121759190613fb7565b60075490915073ffffffffffffffffffffffffffffffffffffffff16156121bb576007546121bb9073ffffffffffffffffffffffffffffffffffffffff16333084612963565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f991161561220a57600061220c565b825b8a856040518463ffffffff1660e01b815260040161222b929190613ef4565b60206040518083038185885af1158015612249573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061226e9190613fb7565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6122e56122f1565b6122ee816129c1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610dae565b80158061241257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124109190613fb7565b155b61249e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612ab6565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260d9190613fb7565b6126179190613ee1565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506126709085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016124f0565b50505050565b806001166001036126b9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126ed565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161270291815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610b539267ffffffffffffffff9091169161277c565b60408051808201909152600080825260208201528152602001906001900390816127555790505b5083611d59565b600061278f8383612bc2565b9392505050565b80471015612800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dae565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461285a576040519150601f19603f3d011682016040523d82523d6000602084013e61285f565b606091505b5050905080610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124f0565b6000612953848484612c4c565b949350505050565b6122ee6122f1565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526126709085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016124f0565b3373ffffffffffffffffffffffffffffffffffffffff821603612a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610dae565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b18826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c699092919063ffffffff16565b805190915015610b535780806020019051810190612b369190613fd0565b610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dae565b600081815260028301602052604081205480151580612be65750612be68484612c78565b61278f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610dae565b600082815260028401602052604081208290556129538484612c84565b60606129538484600085612c90565b600061278f8383612da9565b600061278f8383612dc1565b606082471015612d22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dae565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d4b91906137e7565b60006040518083038185875af1925050503d8060008114612d88576040519150601f19603f3d011682016040523d82523d6000602084013e612d8d565b606091505b5091509150612d9e87838387612e10565b979650505050505050565b6000818152600183016020526040812054151561278f565b6000818152600183016020526040812054612e0857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0e565b506000610b0e565b60608315612ea6578251600003612e9f5773ffffffffffffffffffffffffffffffffffffffff85163b612e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dae565b5081612953565b6129538383815115612ebb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b600060208284031215612f0157600080fd5b5035919050565b6020810160038310612f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146122ee57600080fd5b60008083601f840112612f7157600080fd5b50813567ffffffffffffffff811115612f8957600080fd5b602083019150836020828501011115612fa157600080fd5b9250929050565b600080600060408486031215612fbd57600080fd5b8335612fc881612f49565b9250602084013567ffffffffffffffff811115612fe457600080fd5b612ff086828701612f5f565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122ee57600080fd5b60006020828403121561303157600080fd5b813561278f81612ffd565b80151581146122ee57600080fd5b60006020828403121561305c57600080fd5b813561278f8161303c565b60005b8381101561308257818101518382015260200161306a565b50506000910152565b600081518084526130a3816020860160208601613067565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061278f602083018461308b565b6000602082840312156130fa57600080fd5b813561278f81612f49565b8315158152606060208201526000613120606083018561308b565b8281036040840152613132818561308b565b9695505050505050565b6000806040838503121561314f57600080fd5b823561315a81612ffd565b946020939093013593505050565b60008060006060848603121561317d57600080fd5b833561318881612ffd565b9250602084013561319881612ffd565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156131fb578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016131be565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261324060c084018261308b565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261327c838361308b565b925060808601519150808584030160a08601525061329a82826131a9565b95945050505050565b600080604083850312156132b657600080fd5b8235915060208301356132c881612ffd565b809150509250929050565b60008083601f8401126132e557600080fd5b50813567ffffffffffffffff8111156132fd57600080fd5b6020830191508360208260051b8501011115612fa157600080fd5b6000806000806040858703121561332e57600080fd5b843567ffffffffffffffff8082111561334657600080fd5b613352888389016132d3565b9096509450602087013591508082111561336b57600080fd5b50613378878288016132d3565b95989497509550505050565b60006020828403121561339657600080fd5b813567ffffffffffffffff8111156133ad57600080fd5b820160a0818503121561278f57600080fd5b600080604083850312156133d257600080fd5b82356133dd81612f49565b915060208301356132c881612ffd565b60008060008060006060868803121561340557600080fd5b853561341081612f49565b9450602086013567ffffffffffffffff8082111561342d57600080fd5b61343989838a01612f5f565b9096509450604088013591508082111561345257600080fd5b5061345f88828901612f5f565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156134c2576134c2613470565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561350f5761350f613470565b604052919050565b600082601f83011261352857600080fd5b813567ffffffffffffffff81111561354257613542613470565b61357360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134c8565b81815284602083860101111561358857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156135ba57600080fd5b83356135c581612f49565b925060208481013567ffffffffffffffff808211156135e357600080fd5b818701915087601f8301126135f757600080fd5b81358181111561360957613609613470565b613617848260051b016134c8565b81815260069190911b8301840190848101908a83111561363657600080fd5b938501935b82851015613682576040858c0312156136545760008081fd5b61365c61349f565b853561366781612ffd565b8152858701358782015282526040909401939085019061363b565b96505050604087013592508083111561369a57600080fd5b50506136a886828701613517565b9150509250925092565b8183823760009101908152919050565b600181811c908216806136d657607f821691505b60208210810361370f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261377857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137b757600080fd5b83018035915067ffffffffffffffff8211156137d257600080fd5b602001915036819003821315612fa157600080fd5b60008251613778818460208701613067565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261382e57600080fd5b830160208101925035905067ffffffffffffffff81111561384e57600080fd5b803603821315612fa157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156131fb5781356138c981612ffd565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016138b6565b60208152813560208201526000602083013561391681612f49565b67ffffffffffffffff808216604085015261393460408601866137f9565b925060a0606086015261394b60c08601848361385d565b92505061395b60608601866137f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261399185838561385d565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126139ca57600080fd5b602092880192830192359150838211156139e357600080fd5b8160061b36038313156139f557600080fd5b8685030160a0870152612d9e8482846138a6565b601f821115610b53576000816000526020600020601f850160051c81016020861015613a325750805b601f850160051c820191505b81811015611a6857828155600101613a3e565b67ffffffffffffffff831115613a6957613a69613470565b613a7d83613a7783546136c2565b83613a09565b6000601f841160018114613acf5760008515613a995750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611354565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b1e5786850135825560209485019460019092019101613afe565b5086821015613b59577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613ba581612ffd565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c0b57613c0b613470565b805483825580841015613c985760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613c4c57613c4c613b6b565b8086168614613c5d57613c5d613b6b565b5060008360005260206000208360011b81018760011b820191505b80821015613c93578282558284830155600282019150613c78565b505050505b5060008181526020812083915b85811015611a6857613cb78383613b9a565b6040929092019160029190910190600101613ca5565b81358155600181016020830135613ce381612f49565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d236040860186613782565b93509150613d35838360028701613a51565b613d426060860186613782565b93509150613d54838360038701613a51565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d8b57600080fd5b918401918235915080821115613da057600080fd5b506020820191508060061b3603821315613db957600080fd5b612670818360048601613bf2565b815167ffffffffffffffff811115613de157613de1613470565b613df581613def84546136c2565b84613a09565b602080601f831160018114613e485760008415613e125750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a68565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e9557888601518255948401946001909101908401613e76565b5085821015613ed157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610b0e57610b0e613b6b565b67ffffffffffffffff83168152604060208201526000825160a06040840152613f2060e084018261308b565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613f5c838361308b565b92506040860151915080858403016080860152613f7983836131a9565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613132828261308b565b600060208284031215613fc957600080fd5b5051919050565b600060208284031215613fe257600080fd5b815161278f8161303c56fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -387,11 +387,11 @@ func (_PingPongDemo *PingPongDemoCallerSession) Owner() (common.Address, error) return _PingPongDemo.Contract.Owner(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _PingPongDemo.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -406,16 +406,16 @@ func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, arg0 } -func (_PingPongDemo *PingPongDemoSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_PingPongDemo *PingPongDemoSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, arg0) + return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, destChainSelector) } -func (_PingPongDemo *PingPongDemoCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_PingPongDemo *PingPongDemoCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, arg0) + return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, destChainSelector) } func (_PingPongDemo *PingPongDemoCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -2343,7 +2343,7 @@ type PingPongDemoInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go index 19865a5b71..eb5448c4b5 100644 --- a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go +++ b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var SelfFundedPingPongMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162004c3b38038062004c3b833981016040819052620000349162000591565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200016d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013557620001356001600160a01b0382168360001962000218565b5050505050508060026200014a919062000600565b6009601d6101000a81548160ff021916908360ff16021790555050505062000700565b336001600160a01b03821603620001c75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000626565b6200029c919062000640565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002f891869190620002fe16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200034d906001600160a01b038516908490620003d4565b805190915015620003cf57808060200190518101906200036e91906200065c565b620003cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003e58484600085620003ed565b949350505050565b606082471015620004505760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200046e9190620006ad565b60006040518083038185875af1925050503d8060008114620004ad576040519150601f19603f3d011682016040523d82523d6000602084013e620004b2565b606091505b509092509050620004c687838387620004d1565b979650505050505050565b60608315620005455782516000036200053d576001600160a01b0385163b6200053d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003e5565b620003e583838151156200055c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006cb565b6001600160a01b03811681146200058e57600080fd5b50565b600080600060608486031215620005a757600080fd5b8351620005b48162000578565b6020850151909350620005c78162000578565b604085015190925060ff81168114620005df57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200061f576200061f620005ea565b5092915050565b6000602082840312156200063957600080fd5b5051919050565b80820180821115620006565762000656620005ea565b92915050565b6000602082840312156200066f57600080fd5b815180151581146200068057600080fd5b9392505050565b60005b83811015620006a45781810151838201526020016200068a565b50506000910152565b60008251620006c181846020870162000687565b9190910192915050565b6020815260008251806020840152620006ec81604085016020870162000687565b601f01601f19169190910160400192915050565b6080516144e762000754600039600081816105e601528181610827015281816108b701528181611441015281816117bf015281816122e5015281816123ae015281816124860152612b7801526144e76000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e14610744578063f2fde38b14610764578063ff2deec31461078457600080fd5b8063e6c725f5146106eb578063e89b44851461073157600080fd5b8063bee518a414610662578063cf6730f81461068b578063d8469e40146106ab578063e4ca8754146106cb57600080fd5b80639d2aede5116100ec5780639d2aede5146105b7578063b0f479a1146105d7578063b187bd261461060a578063b5a110111461064257600080fd5b80638462a2b91461052c57806385572ffb1461054c5780638da5cb5b1461056c5780638f491cba1461059757600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ae5780636fef519e146104ce57806379ba50971461051757600080fd5b80635e35359e146104615780636939cd971461048157600080fd5b806335f170ef146103c457806341eade46146103f35780635075a9d414610413578063536c6bfa1461044157600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b50610259610244366004613361565b60086020526000908152604090205460ff1681565b604051610266919061337a565b60405180910390f35b34801561027b57600080fd5b5061028f61028a36600461341a565b6107b1565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613491565b6107fc565b005b3480156102cd57600080fd5b506102bf6102dc3660046134bc565b610974565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613547565b34801561034357600080fd5b506102bf61035236600461355a565b6109ce565b34801561036357600080fd5b506102bf610a11565b34801561037857600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df36600461355a565b610a4d565b60405161026693929190613577565b3480156103ff57600080fd5b506102bf61040e36600461355a565b610b84565b34801561041f57600080fd5b5061043361042e366004613361565b610bcf565b604051908152602001610266565b34801561044d57600080fd5b506102bf61045c3660046135ae565b610be2565b34801561046d57600080fd5b506102bf61047c3660046135da565b610bf8565b34801561048d57600080fd5b506104a161049c366004613361565b610c26565b6040516102669190613678565b3480156104ba57600080fd5b506102bf6104c9366004613715565b610e31565b3480156104da57600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052357600080fd5b506102bf61114b565b34801561053857600080fd5b506102bf61054736600461378a565b611248565b34801561055857600080fd5b506102bf6105673660046137f6565b611429565b34801561057857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a357600080fd5b506102bf6105b2366004613361565b611724565b3480156105c357600080fd5b506102bf6105d2366004613491565b611908565b3480156105e357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039f565b34801561061657600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064e57600080fd5b506102bf61065d366004613831565b6119c2565b34801561066e57600080fd5b5060095460405167ffffffffffffffff9091168152602001610266565b34801561069757600080fd5b506102bf6106a63660046137f6565b611b35565b3480156106b757600080fd5b506102bf6106c636600461385f565b611d22565b3480156106d757600080fd5b506102bf6106e6366004613361565b611da1565b3480156106f757600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b61043361073f366004613a17565b61200a565b34801561075057600080fd5b506102bf61075f366004613b24565b61258e565b34801561077057600080fd5b506102bf61077f366004613491565b61261f565b34801561079057600080fd5b5060075461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107e09085908590613b47565b9081526040519081900360200190205460ff1690509392505050565b610804612630565b60075473ffffffffffffffffffffffffffffffffffffffff1615610867576108677f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff169060006126b1565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610916576109167f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128b1565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61097c612630565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109d6612630565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a19612630565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4b60016129b5565b565b6002602052600090815260409020805460018201805460ff9092169291610a7390613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613b57565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505090806002018054610b0190613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613b57565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905083565b610b8c612630565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610bdc600483612bfd565b92915050565b610bea612630565b610bf48282612c10565b5050565b610c00612630565b610c2173ffffffffffffffffffffffffffffffffffffffff84168383612d6a565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c9590613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613b57565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b50505050508152602001600382018054610d2790613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5390613b57565b8015610da05780601f10610d7557610100808354040283529160200191610da0565b820191906000526020600020905b815481529060010190602001808311610d8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dce565b505050915250909392505050565b610e39612630565b6001610e46600484612bfd565b14610e85576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610e958260025b60049190612dc0565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610edd90613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990613b57565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b50505050508152602001600382018054610f6f90613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b90613b57565b8015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611016565b5050505081525050905060005b8160800151518110156110fa576110f2838360800151838151811061109f5761109f613baa565b602002602001015160200151846080015184815181106110c1576110c1613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d6a9092919063ffffffff16565b600101611078565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e7c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611250612630565b60005b81811015611333576002600084848481811061127157611271613baa565b90506020028101906112839190613bd9565b61129190602081019061355a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c8576112c8613baa565b90506020028101906112da9190613bd9565b6112e8906020810190613c17565b6040516112f6929190613b47565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611253565b5060005b838110156114225760016002600087878581811061135757611357613baa565b90506020028101906113699190613bd9565b61137790602081019061355a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ae576113ae613baa565b90506020028101906113c09190613bd9565b6113ce906020810190613c17565b6040516113dc929190613b47565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611337565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461149a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e7c565b6114aa604082016020830161355a565b6114b76040830183613c17565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115159250849150613c7c565b9081526040519081900360200190205460ff1661156057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b611570604084016020850161355a565b67ffffffffffffffff8116600090815260026020526040902060018101805461159890613b57565b159050806115a75750805460ff165b156115ea576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611626908890600401613d90565b600060405180830381600087803b15801561164057600080fd5b505af1925050508015611651575060015b6116f1573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5061169186356001610e8c565b508535600090815260036020526040902086906116ae8282614162565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e3908490613547565b60405180910390a250611422565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177c57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117845750565b6009546001906117b8907d010000000000000000000000000000000000000000000000000000000000900460ff168361425c565b11611905577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c9190614297565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c357600080fd5b505af11580156118d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611910612630565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610bf490826142b4565b6119ca612630565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8591613c7c565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610c2190826142b4565b333014611b6e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e604082016020830161355a565b611b8b6040830183613c17565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be99250849150613c7c565b9081526040519081900360200190205460ff16611c3457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b611c44604084016020850161355a565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6c90613b57565b15905080611c7b5750805460ff165b15611cbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6000611ccd6060870187613c17565b810190611cda9190613361565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1a57611d1a611d158260016143ce565b6129b5565b505050505050565b611d2a612630565b67ffffffffffffffff8516600090815260026020526040902060018101611d52858783613ee6565b508115611d6a5760028101611d68838583613ee6565b505b805460ff1615611d1a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b611da9612630565b6001611db6600483612bfd565b14611df0576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e7c565b611dfb816000610e8c565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e4390613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6f90613b57565b8015611ebc5780601f10611e9157610100808354040283529160200191611ebc565b820191906000526020600020905b815481529060010190602001808311611e9f57829003601f168201915b50505050508152602001600382018054611ed590613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0190613b57565b8015611f4e5780601f10611f2357610100808354040283529160200191611f4e565b820191906000526020600020905b815481529060010190602001808311611f3157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fd15760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f7c565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061203690613b57565b159050806120455750805460ff165b15612088576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906120bb90613b57565b80601f01602080910402602001604051908101604052809291908181526020018280546120e790613b57565b80156121345780601f1061210957610100808354040283529160200191612134565b820191906000526020600020905b81548152906001019060200180831161211757829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526002928390522001805460809092019161219390613b57565b80601f01602080910402602001604051908101604052809291908181526020018280546121bf90613b57565b801561220c5780601f106121e15761010080835404028352916020019161220c565b820191906000526020600020905b8154815290600101906020018083116121ef57829003601f168201915b5050505050815250905060005b865181101561236d57612289333089848151811061223957612239613baa565b6020026020010151602001518a858151811061225757612257613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dd5909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106122b9576122b9613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614612365576123657f000000000000000000000000000000000000000000000000000000000000000088838151811061231657612316613baa565b60200260200101516020015189848151811061233457612334613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128b19092919063ffffffff16565b600101612219565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906123e5908b9086906004016143e1565b602060405180830381865afa158015612402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242691906144a4565b60075490915073ffffffffffffffffffffffffffffffffffffffff161561246c5760075461246c9073ffffffffffffffffffffffffffffffffffffffff16333084612dd5565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156124bb5760006124bd565b825b8a856040518463ffffffff1660e01b81526004016124dc9291906143e1565b60206040518083038185885af11580156124fa573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061251f91906144a4565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612596612630565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612627612630565b61190581612e33565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e7c565b80158061275157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561272b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274f91906144a4565b155b6127dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f28565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294c91906144a4565b61295691906143ce565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129af9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161282f565b50505050565b806001166001036129f8576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a2c565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a3581611724565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a9991815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612b1357816020015b6040805180820190915260008082526020820152815260200190600190039081612aec5790505b50815260075473ffffffffffffffffffffffffffffffffffffffff908116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f991612bba9167ffffffffffffffff9091169085906004016143e1565b6020604051808303816000875af1158015612bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2191906144a4565b6000612c098383613034565b9392505050565b80471015612c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e7c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612cd4576040519150601f19603f3d011682016040523d82523d6000602084013e612cd9565b606091505b5050905080610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161282f565b6000612dcd8484846130be565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129af9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161282f565b3373ffffffffffffffffffffffffffffffffffffffff821603612eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e7c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612f8a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130db9092919063ffffffff16565b805190915015610c215780806020019051810190612fa891906144bd565b610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e7c565b600081815260028301602052604081205480151580613058575061305884846130ea565b612c09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610e7c565b60008281526002840160205260408120829055612dcd84846130f6565b6060612dcd8484600085613102565b6000612c09838361321b565b6000612c098383613233565b606082471015613194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e7c565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131bd9190613c7c565b60006040518083038185875af1925050503d80600081146131fa576040519150601f19603f3d011682016040523d82523d6000602084013e6131ff565b606091505b509150915061321087838387613282565b979650505050505050565b60008181526001830160205260408120541515612c09565b600081815260018301602052604081205461327a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bdc565b506000610bdc565b606083156133185782516000036133115773ffffffffffffffffffffffffffffffffffffffff85163b613311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e7c565b5081612dcd565b612dcd838381511561332d5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b60006020828403121561337357600080fd5b5035919050565b60208101600383106133b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190557600080fd5b60008083601f8401126133e357600080fd5b50813567ffffffffffffffff8111156133fb57600080fd5b60208301915083602082850101111561341357600080fd5b9250929050565b60008060006040848603121561342f57600080fd5b833561343a816133bb565b9250602084013567ffffffffffffffff81111561345657600080fd5b613462868287016133d1565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190557600080fd5b6000602082840312156134a357600080fd5b8135612c098161346f565b801515811461190557600080fd5b6000602082840312156134ce57600080fd5b8135612c09816134ae565b60005b838110156134f45781810151838201526020016134dc565b50506000910152565b600081518084526135158160208601602086016134d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0960208301846134fd565b60006020828403121561356c57600080fd5b8135612c09816133bb565b831515815260606020820152600061359260608301856134fd565b82810360408401526135a481856134fd565b9695505050505050565b600080604083850312156135c157600080fd5b82356135cc8161346f565b946020939093013593505050565b6000806000606084860312156135ef57600080fd5b83356135fa8161346f565b9250602084013561360a8161346f565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561366d578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613630565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136b260c08401826134fd565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136ee83836134fd565b925060808601519150808584030160a08601525061370c828261361b565b95945050505050565b6000806040838503121561372857600080fd5b82359150602083013561373a8161346f565b809150509250929050565b60008083601f84011261375757600080fd5b50813567ffffffffffffffff81111561376f57600080fd5b6020830191508360208260051b850101111561341357600080fd5b600080600080604085870312156137a057600080fd5b843567ffffffffffffffff808211156137b857600080fd5b6137c488838901613745565b909650945060208701359150808211156137dd57600080fd5b506137ea87828801613745565b95989497509550505050565b60006020828403121561380857600080fd5b813567ffffffffffffffff81111561381f57600080fd5b820160a08185031215612c0957600080fd5b6000806040838503121561384457600080fd5b823561384f816133bb565b9150602083013561373a8161346f565b60008060008060006060868803121561387757600080fd5b8535613882816133bb565b9450602086013567ffffffffffffffff8082111561389f57600080fd5b6138ab89838a016133d1565b909650945060408801359150808211156138c457600080fd5b506138d1888289016133d1565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613934576139346138e2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613981576139816138e2565b604052919050565b600082601f83011261399a57600080fd5b813567ffffffffffffffff8111156139b4576139b46138e2565b6139e560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161393a565b8181528460208386010111156139fa57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a2c57600080fd5b8335613a37816133bb565b925060208481013567ffffffffffffffff80821115613a5557600080fd5b818701915087601f830112613a6957600080fd5b813581811115613a7b57613a7b6138e2565b613a89848260051b0161393a565b81815260069190911b8301840190848101908a831115613aa857600080fd5b938501935b82851015613af4576040858c031215613ac65760008081fd5b613ace613911565b8535613ad98161346f565b81528587013587820152825260409094019390850190613aad565b965050506040870135925080831115613b0c57600080fd5b5050613b1a86828701613989565b9150509250925092565b600060208284031215613b3657600080fd5b813560ff81168114612c0957600080fd5b8183823760009101908152919050565b600181811c90821680613b6b57607f821691505b602082108103613ba4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c0d57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c4c57600080fd5b83018035915067ffffffffffffffff821115613c6757600080fd5b60200191503681900382131561341357600080fd5b60008251613c0d8184602087016134d9565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cc357600080fd5b830160208101925035905067ffffffffffffffff811115613ce357600080fd5b80360382131561341357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561366d578135613d5e8161346f565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d4b565b602081528135602082015260006020830135613dab816133bb565b67ffffffffffffffff8082166040850152613dc96040860186613c8e565b925060a06060860152613de060c086018483613cf2565b925050613df06060860186613c8e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e26858385613cf2565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e5f57600080fd5b60209288019283019235915083821115613e7857600080fd5b8160061b3603831315613e8a57600080fd5b8685030160a0870152613210848284613d3b565b601f821115610c21576000816000526020600020601f850160051c81016020861015613ec75750805b601f850160051c820191505b81811015611d1a57828155600101613ed3565b67ffffffffffffffff831115613efe57613efe6138e2565b613f1283613f0c8354613b57565b83613e9e565b6000601f841160018114613f645760008515613f2e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611422565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fb35786850135825560209485019460019092019101613f93565b5086821015613fee577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561403a8161346f565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140a0576140a06138e2565b80548382558084101561412d5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140e1576140e1614000565b80861686146140f2576140f2614000565b5060008360005260206000208360011b81018760011b820191505b8082101561412857828255828483015560028201915061410d565b505050505b5060008181526020812083915b85811015611d1a5761414c838361402f565b604092909201916002919091019060010161413a565b81358155600181016020830135614178816133bb565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141b86040860186613c17565b935091506141ca838360028701613ee6565b6141d76060860186613c17565b935091506141e9838360038701613ee6565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261422057600080fd5b91840191823591508082111561423557600080fd5b506020820191508060061b360382131561424e57600080fd5b6129af818360048601614087565b600082614292577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142a957600080fd5b8151612c098161346f565b815167ffffffffffffffff8111156142ce576142ce6138e2565b6142e2816142dc8454613b57565b84613e9e565b602080601f83116001811461433557600084156142ff5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d1a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561438257888601518255948401946001909101908401614363565b50858210156143be57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610bdc57610bdc614000565b67ffffffffffffffff83168152604060208201526000825160a0604084015261440d60e08401826134fd565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261444983836134fd565b92506040860151915080858403016080860152614466838361361b565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506135a482826134fd565b6000602082840312156144b657600080fd5b5051919050565b6000602082840312156144cf57600080fd5b8151612c09816134ae56fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"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\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162004c4438038062004c44833981016040819052620000349162000591565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200016d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013557620001356001600160a01b0382168360001962000218565b5050505050508060026200014a919062000600565b6009601d6101000a81548160ff021916908360ff16021790555050505062000700565b336001600160a01b03821603620001c75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000626565b6200029c919062000640565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002f891869190620002fe16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200034d906001600160a01b038516908490620003d4565b805190915015620003cf57808060200190518101906200036e91906200065c565b620003cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003e58484600085620003ed565b949350505050565b606082471015620004505760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200046e9190620006ad565b60006040518083038185875af1925050503d8060008114620004ad576040519150601f19603f3d011682016040523d82523d6000602084013e620004b2565b606091505b509092509050620004c687838387620004d1565b979650505050505050565b60608315620005455782516000036200053d576001600160a01b0385163b6200053d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003e5565b620003e583838151156200055c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006cb565b6001600160a01b03811681146200058e57600080fd5b50565b600080600060608486031215620005a757600080fd5b8351620005b48162000578565b6020850151909350620005c78162000578565b604085015190925060ff81168114620005df57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200061f576200061f620005ea565b5092915050565b6000602082840312156200063957600080fd5b5051919050565b80820180821115620006565762000656620005ea565b92915050565b6000602082840312156200066f57600080fd5b815180151581146200068057600080fd5b9392505050565b60005b83811015620006a45781810151838201526020016200068a565b50506000910152565b60008251620006c181846020870162000687565b9190910192915050565b6020815260008251806020840152620006ec81604085016020870162000687565b601f01601f19169190910160400192915050565b6080516144f062000754600039600081816105e601528181610827015281816108b701528181611441015281816117bf015281816122e6015281816123af015281816124870152612b7901526144f06000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e14610744578063f2fde38b14610764578063ff2deec31461078457600080fd5b8063e6c725f5146106eb578063e89b44851461073157600080fd5b8063bee518a414610662578063cf6730f81461068b578063d8469e40146106ab578063e4ca8754146106cb57600080fd5b80639d2aede5116100ec5780639d2aede5146105b7578063b0f479a1146105d7578063b187bd261461060a578063b5a110111461064257600080fd5b80638462a2b91461052c57806385572ffb1461054c5780638da5cb5b1461056c5780638f491cba1461059757600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ae5780636fef519e146104ce57806379ba50971461051757600080fd5b80635e35359e146104615780636939cd971461048157600080fd5b806335f170ef146103c457806341eade46146103f35780635075a9d414610413578063536c6bfa1461044157600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b5061025961024436600461336a565b60086020526000908152604090205460ff1681565b6040516102669190613383565b60405180910390f35b34801561027b57600080fd5b5061028f61028a366004613423565b6107b1565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba36600461349a565b6107fc565b005b3480156102cd57600080fd5b506102bf6102dc3660046134c5565b610974565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613550565b34801561034357600080fd5b506102bf610352366004613563565b6109ce565b34801561036357600080fd5b506102bf610a11565b34801561037857600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613563565b610a4d565b60405161026693929190613580565b3480156103ff57600080fd5b506102bf61040e366004613563565b610b84565b34801561041f57600080fd5b5061043361042e36600461336a565b610bcf565b604051908152602001610266565b34801561044d57600080fd5b506102bf61045c3660046135b7565b610be2565b34801561046d57600080fd5b506102bf61047c3660046135e3565b610bf8565b34801561048d57600080fd5b506104a161049c36600461336a565b610c26565b6040516102669190613681565b3480156104ba57600080fd5b506102bf6104c936600461371e565b610e31565b3480156104da57600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052357600080fd5b506102bf61114b565b34801561053857600080fd5b506102bf610547366004613793565b611248565b34801561055857600080fd5b506102bf6105673660046137ff565b611429565b34801561057857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a357600080fd5b506102bf6105b236600461336a565b611724565b3480156105c357600080fd5b506102bf6105d236600461349a565b611908565b3480156105e357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039f565b34801561061657600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064e57600080fd5b506102bf61065d36600461383a565b6119c2565b34801561066e57600080fd5b5060095460405167ffffffffffffffff9091168152602001610266565b34801561069757600080fd5b506102bf6106a63660046137ff565b611b35565b3480156106b757600080fd5b506102bf6106c6366004613868565b611d22565b3480156106d757600080fd5b506102bf6106e636600461336a565b611da1565b3480156106f757600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b61043361073f366004613a20565b61200b565b34801561075057600080fd5b506102bf61075f366004613b2d565b61258f565b34801561077057600080fd5b506102bf61077f36600461349a565b612620565b34801561079057600080fd5b5060075461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107e09085908590613b50565b9081526040519081900360200190205460ff1690509392505050565b610804612631565b60075473ffffffffffffffffffffffffffffffffffffffff1615610867576108677f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff169060006126b2565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610916576109167f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128b2565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61097c612631565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109d6612631565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a19612631565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4b60016129b6565b565b6002602052600090815260409020805460018201805460ff9092169291610a7390613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613b60565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505090806002018054610b0190613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613b60565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905083565b610b8c612631565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610bdc600483612bfe565b92915050565b610bea612631565b610bf48282612c11565b5050565b610c00612631565b610c2173ffffffffffffffffffffffffffffffffffffffff84168383612d6b565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c9590613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613b60565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b50505050508152602001600382018054610d2790613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5390613b60565b8015610da05780601f10610d7557610100808354040283529160200191610da0565b820191906000526020600020905b815481529060010190602001808311610d8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dce565b505050915250909392505050565b610e39612631565b6001610e46600484612bfe565b14610e85576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610e958260025b60049190612dc1565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610edd90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990613b60565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b50505050508152602001600382018054610f6f90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b90613b60565b8015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611016565b5050505081525050905060005b8160800151518110156110fa576110f2838360800151838151811061109f5761109f613bb3565b602002602001015160200151846080015184815181106110c1576110c1613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d6b9092919063ffffffff16565b600101611078565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e7c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611250612631565b60005b81811015611333576002600084848481811061127157611271613bb3565b90506020028101906112839190613be2565b611291906020810190613563565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c8576112c8613bb3565b90506020028101906112da9190613be2565b6112e8906020810190613c20565b6040516112f6929190613b50565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611253565b5060005b838110156114225760016002600087878581811061135757611357613bb3565b90506020028101906113699190613be2565b611377906020810190613563565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ae576113ae613bb3565b90506020028101906113c09190613be2565b6113ce906020810190613c20565b6040516113dc929190613b50565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611337565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461149a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e7c565b6114aa6040820160208301613563565b6114b76040830183613c20565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115159250849150613c85565b9081526040519081900360200190205460ff1661156057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b6115706040840160208501613563565b67ffffffffffffffff8116600090815260026020526040902060018101805461159890613b60565b159050806115a75750805460ff165b156115ea576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611626908890600401613d99565b600060405180830381600087803b15801561164057600080fd5b505af1925050508015611651575060015b6116f1573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5061169186356001610e8c565b508535600090815260036020526040902086906116ae828261416b565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e3908490613550565b60405180910390a250611422565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177c57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117845750565b6009546001906117b8907d010000000000000000000000000000000000000000000000000000000000900460ff1683614265565b11611905577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c91906142a0565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c357600080fd5b505af11580156118d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611910612631565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610bf490826142bd565b6119ca612631565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8591613c85565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610c2190826142bd565b333014611b6e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e6040820160208301613563565b611b8b6040830183613c20565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be99250849150613c85565b9081526040519081900360200190205460ff16611c3457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b611c446040840160208501613563565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6c90613b60565b15905080611c7b5750805460ff165b15611cbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6000611ccd6060870187613c20565b810190611cda919061336a565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1a57611d1a611d158260016143d7565b6129b6565b505050505050565b611d2a612631565b67ffffffffffffffff8516600090815260026020526040902060018101611d52858783613eef565b508115611d6a5760028101611d68838583613eef565b505b805460ff1615611d1a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611dae600483612bfe565b14611de8576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e7c565b611df3816000610e8c565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e3b90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6790613b60565b8015611eb45780601f10611e8957610100808354040283529160200191611eb4565b820191906000526020600020905b815481529060010190602001808311611e9757829003601f168201915b50505050508152602001600382018054611ecd90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990613b60565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fc95760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f74565b50505050815250509050611fdc81612dd6565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061203790613b60565b159050806120465750805460ff165b15612089576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906120bc90613b60565b80601f01602080910402602001604051908101604052809291908181526020018280546120e890613b60565b80156121355780601f1061210a57610100808354040283529160200191612135565b820191906000526020600020905b81548152906001019060200180831161211857829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526002928390522001805460809092019161219490613b60565b80601f01602080910402602001604051908101604052809291908181526020018280546121c090613b60565b801561220d5780601f106121e25761010080835404028352916020019161220d565b820191906000526020600020905b8154815290600101906020018083116121f057829003601f168201915b5050505050815250905060005b865181101561236e5761228a333089848151811061223a5761223a613bb3565b6020026020010151602001518a858151811061225857612258613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dde909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106122ba576122ba613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614612366576123667f000000000000000000000000000000000000000000000000000000000000000088838151811061231757612317613bb3565b60200260200101516020015189848151811061233557612335613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128b29092919063ffffffff16565b60010161221a565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906123e6908b9086906004016143ea565b602060405180830381865afa158015612403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242791906144ad565b60075490915073ffffffffffffffffffffffffffffffffffffffff161561246d5760075461246d9073ffffffffffffffffffffffffffffffffffffffff16333084612dde565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156124bc5760006124be565b825b8a856040518463ffffffff1660e01b81526004016124dd9291906143ea565b60206040518083038185885af11580156124fb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061252091906144ad565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612597612631565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612628612631565b61190581612e3c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e7c565b80158061275257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561272c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275091906144ad565b155b6127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f31565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d91906144ad565b61295791906143d7565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129b09085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612830565b50505050565b806001166001036129f9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a2d565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a3681611724565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a9a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612b1457816020015b6040805180820190915260008082526020820152815260200190600190039081612aed5790505b50815260075473ffffffffffffffffffffffffffffffffffffffff908116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f991612bbb9167ffffffffffffffff9091169085906004016143ea565b6020604051808303816000875af1158015612bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2191906144ad565b6000612c0a838361303d565b9392505050565b80471015612c7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e7c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612cd5576040519150601f19603f3d011682016040523d82523d6000602084013e612cda565b606091505b5050905080610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612830565b6000612dce8484846130c7565b949350505050565b611905612631565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129b09085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612830565b3373ffffffffffffffffffffffffffffffffffffffff821603612ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e7c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612f93826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130e49092919063ffffffff16565b805190915015610c215780806020019051810190612fb191906144c6565b610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e7c565b600081815260028301602052604081205480151580613061575061306184846130f3565b612c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610e7c565b60008281526002840160205260408120829055612dce84846130ff565b6060612dce848460008561310b565b6000612c0a8383613224565b6000612c0a838361323c565b60608247101561319d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e7c565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131c69190613c85565b60006040518083038185875af1925050503d8060008114613203576040519150601f19603f3d011682016040523d82523d6000602084013e613208565b606091505b50915091506132198783838761328b565b979650505050505050565b60008181526001830160205260408120541515612c0a565b600081815260018301602052604081205461328357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bdc565b506000610bdc565b6060831561332157825160000361331a5773ffffffffffffffffffffffffffffffffffffffff85163b61331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e7c565b5081612dce565b612dce83838151156133365781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b60006020828403121561337c57600080fd5b5035919050565b60208101600383106133be577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190557600080fd5b60008083601f8401126133ec57600080fd5b50813567ffffffffffffffff81111561340457600080fd5b60208301915083602082850101111561341c57600080fd5b9250929050565b60008060006040848603121561343857600080fd5b8335613443816133c4565b9250602084013567ffffffffffffffff81111561345f57600080fd5b61346b868287016133da565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190557600080fd5b6000602082840312156134ac57600080fd5b8135612c0a81613478565b801515811461190557600080fd5b6000602082840312156134d757600080fd5b8135612c0a816134b7565b60005b838110156134fd5781810151838201526020016134e5565b50506000910152565b6000815180845261351e8160208601602086016134e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0a6020830184613506565b60006020828403121561357557600080fd5b8135612c0a816133c4565b831515815260606020820152600061359b6060830185613506565b82810360408401526135ad8185613506565b9695505050505050565b600080604083850312156135ca57600080fd5b82356135d581613478565b946020939093013593505050565b6000806000606084860312156135f857600080fd5b833561360381613478565b9250602084013561361381613478565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613676578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613639565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136bb60c0840182613506565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136f78383613506565b925060808601519150808584030160a0860152506137158282613624565b95945050505050565b6000806040838503121561373157600080fd5b82359150602083013561374381613478565b809150509250929050565b60008083601f84011261376057600080fd5b50813567ffffffffffffffff81111561377857600080fd5b6020830191508360208260051b850101111561341c57600080fd5b600080600080604085870312156137a957600080fd5b843567ffffffffffffffff808211156137c157600080fd5b6137cd8883890161374e565b909650945060208701359150808211156137e657600080fd5b506137f38782880161374e565b95989497509550505050565b60006020828403121561381157600080fd5b813567ffffffffffffffff81111561382857600080fd5b820160a08185031215612c0a57600080fd5b6000806040838503121561384d57600080fd5b8235613858816133c4565b9150602083013561374381613478565b60008060008060006060868803121561388057600080fd5b853561388b816133c4565b9450602086013567ffffffffffffffff808211156138a857600080fd5b6138b489838a016133da565b909650945060408801359150808211156138cd57600080fd5b506138da888289016133da565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561393d5761393d6138eb565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561398a5761398a6138eb565b604052919050565b600082601f8301126139a357600080fd5b813567ffffffffffffffff8111156139bd576139bd6138eb565b6139ee60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613943565b818152846020838601011115613a0357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a3557600080fd5b8335613a40816133c4565b925060208481013567ffffffffffffffff80821115613a5e57600080fd5b818701915087601f830112613a7257600080fd5b813581811115613a8457613a846138eb565b613a92848260051b01613943565b81815260069190911b8301840190848101908a831115613ab157600080fd5b938501935b82851015613afd576040858c031215613acf5760008081fd5b613ad761391a565b8535613ae281613478565b81528587013587820152825260409094019390850190613ab6565b965050506040870135925080831115613b1557600080fd5b5050613b2386828701613992565b9150509250925092565b600060208284031215613b3f57600080fd5b813560ff81168114612c0a57600080fd5b8183823760009101908152919050565b600181811c90821680613b7457607f821691505b602082108103613bad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c1657600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5557600080fd5b83018035915067ffffffffffffffff821115613c7057600080fd5b60200191503681900382131561341c57600080fd5b60008251613c168184602087016134e2565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ccc57600080fd5b830160208101925035905067ffffffffffffffff811115613cec57600080fd5b80360382131561341c57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613676578135613d6781613478565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d54565b602081528135602082015260006020830135613db4816133c4565b67ffffffffffffffff8082166040850152613dd26040860186613c97565b925060a06060860152613de960c086018483613cfb565b925050613df96060860186613c97565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e2f858385613cfb565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e6857600080fd5b60209288019283019235915083821115613e8157600080fd5b8160061b3603831315613e9357600080fd5b8685030160a0870152613219848284613d44565b601f821115610c21576000816000526020600020601f850160051c81016020861015613ed05750805b601f850160051c820191505b81811015611d1a57828155600101613edc565b67ffffffffffffffff831115613f0757613f076138eb565b613f1b83613f158354613b60565b83613ea7565b6000601f841160018114613f6d5760008515613f375750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611422565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fbc5786850135825560209485019460019092019101613f9c565b5086821015613ff7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561404381613478565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140a9576140a96138eb565b8054838255808410156141365760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140ea576140ea614009565b80861686146140fb576140fb614009565b5060008360005260206000208360011b81018760011b820191505b80821015614131578282558284830155600282019150614116565b505050505b5060008181526020812083915b85811015611d1a576141558383614038565b6040929092019160029190910190600101614143565b81358155600181016020830135614181816133c4565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141c16040860186613c20565b935091506141d3838360028701613eef565b6141e06060860186613c20565b935091506141f2838360038701613eef565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261422957600080fd5b91840191823591508082111561423e57600080fd5b506020820191508060061b360382131561425757600080fd5b6129b0818360048601614090565b60008261429b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142b257600080fd5b8151612c0a81613478565b815167ffffffffffffffff8111156142d7576142d76138eb565b6142eb816142e58454613b60565b84613ea7565b602080601f83116001811461433e57600084156143085750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d1a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561438b5788860151825594840194600190910190840161436c565b50858210156143c757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610bdc57610bdc614009565b67ffffffffffffffff83168152604060208201526000825160a0604084015261441660e0840182613506565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526144528383613506565b9250604086015191508085840301608086015261446f8383613624565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506135ad8282613506565b6000602082840312156144bf57600080fd5b5051919050565b6000602082840312156144d857600080fd5b8151612c0a816134b756fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -409,11 +409,11 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) Owner() (common.Addr return _SelfFundedPingPong.Contract.Owner(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _SelfFundedPingPong.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -428,16 +428,16 @@ func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.Ca } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_SelfFundedPingPong *SelfFundedPingPongSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, arg0) + return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, destChainSelector) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, arg0) + return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, destChainSelector) } func (_SelfFundedPingPong *SelfFundedPingPongCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -2636,7 +2636,7 @@ type SelfFundedPingPongInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, 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 4f53971262..ee211921f8 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,10 +5,10 @@ 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 fee3f82935ce7a26c65e12f19a472a4fccdae62755abdb42d8b0a01f0f06981a burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin c7efa00d2be62a97a814730c8e13aa70794ebfdd38a9f3b3c11554a5dfd70478 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin a0728e186af74968101135a58a483320ced9ab79b22b1b24ac6994254ee79097 -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 7a02b5e5da9f1ec593e6916d45a2972330dfe8d4a40eeb3d76fd57b852a7d230 -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 4ff0f5166791975a28c8cca820d5b23636877a39db90090aa18ad7d2d122b785 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 8f0cb5cff5611460db2527342ac74723ffc2c57afb3866eefe862b0dad2e75bc -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin f79420dab435b1c44d695cc1cfb1771e4ba1a7224814198b4818c043219e337a +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 7f7045fe8bd0d0a5bfb69a74cb782c1def4e40c6690f78f3686abf8702411cca +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0aa9dc4d97b89bbd3fb273d1386b8bd46b2d8c5fa2a4e26cc0ab0589b20c7269 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 02a339415eb7dc90e167a7122beeed340b4171930b28646df16432e692f05b6d +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 96fade4180f686c927f7a599ba18a29efd05df117e1d31b57427b16cfcda370f ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c44460757ca0e1b228734b32b9ab03221b93d77bb9f8e2970830779a8be2cb78 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 @@ -28,11 +28,11 @@ 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 abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin fa113052eafd644fd9d25558bf13ebf0be15e51de93477d74eea913801d0f752 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin d41d1f20d767c4b050045a1909e6d7a87e919f0fd3a17831e1fe455c87a21e1d price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 0b3e253684d7085aa11f9179b71453b9db9d11cabea41605d5b4ac4128f85bfb registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin cbe7698bfd811b485ac3856daf073a7bdebeefdf2583403ca4a19d5b7e2d4ae8 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin eedfacbd19d13edfbddae5a693aa58c31595732ecb54f371d3155da244b65344 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 9dd31e03f6c414fc8961e95515962039f093f35d0f27bfde32fce5add2b6d15a token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin 48caf06855a2f60455364d384e5fb2e6ecdf0a9ce4c1fc706b54b9885df76695 From 19830ddcf6aefa6c43f55d02bd59dd61662fb760 Mon Sep 17 00:00:00 2001 From: Matt Yang Date: Wed, 3 Jul 2024 23:17:46 -0400 Subject: [PATCH 30/31] more comments to address --- .../applications/external/CCIPClientBase.sol | 40 ++++++++++++++----- .../applications/external/CCIPReceiver.sol | 20 +++++++++- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 09a532c20e..714fcda4f1 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -8,6 +8,8 @@ import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; import {Address} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; +// TODO how do you feel about just renaming this to `CCIPBase` +// TODO add natspec comments on top of every contract abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { using SafeERC20 for IERC20; using Address for address; @@ -18,18 +20,25 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { error InvalidSender(bytes sender); error InvalidRecipient(bytes recipient); + // TODO every field in a struct should have comment, also do spack comments alignment, for example struct ApprovedSenderUpdate { - uint64 destChainSelector; - bytes sender; // The address which initiated source-chain message, abi-encoded in case of a non-EVM-compatible network + uint64 destChainSelector; // Chainselector for a source chain that is allowed to call this dapp + bytes sender; // The sender address on source chain that is allowed to call, ABI encoded in the case of a remote EVM chain } + // TODO change disabled to enabled so the default value is false if it is not configured + // TODO actually, can you use recipient.length != 0 as the enabled flag? Saves 1 slot struct ChainConfig { bool disabled; - bytes recipient; // The address to send messages to on the destination-chain, abi.encode(addr) if an EVM-compatible networks - bytes extraArgsBytes; // Includes additional configs such as manual gas limit, and out-of-order-execution. Should not be supplied at runtime to prevent unexpected contract behavior + bytes recipient; // The address to send messages to on the destination chain, ABI encoded in the case of a remote EVM chain. + bytes extraArgsBytes; // Specifies extraArgs to pass into ccipSend, includes configs such as gas limit, and OOO execution. + + + // TODO important to add context on why this is a nested mapping; afaik it is to support remote one-sided dapp upgrades mapping(bytes recipient => bool isApproved) approvedSender; } + // TODO I recall there were some discussions about upgradable Router, was it confirmed with GTM/Devrel we can have immutable router? address internal immutable i_ccipRouter; mapping(uint64 destChainSelector => ChainConfig) public s_chainConfigs; @@ -43,7 +52,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Router Management │ // ================================================================ - /// @notice returns the address of the CCIP Router set at contract-deployment + /// @notice returns the address of the CCIP Router set at contract deployment function getRouter() public view virtual returns (address) { return i_ccipRouter; } @@ -58,8 +67,10 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Sender/Receiver Management │ // ================================================================ - /// @notice modify the list of approved source-chain contracts which can send messages to this contract through CCIP + // TODO we should be consistent in our styles, "source chain" is preferred over "soure-chain", when in doubt, check other contracts for reference + /// @notice modify the list of approved source chain contracts which can send messages to this contract through CCIP /// @dev removes are executed before additions, so a contract present in both will be approved at the end of execution + // TODO emit events here function updateApprovedSenders( ApprovedSenderUpdate[] calldata adds, ApprovedSenderUpdate[] calldata removes @@ -77,6 +88,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { /// @param sourceChainSelector A unique CCIP-specific identifier for the source chain /// @param senderAddr The address which sent the message on the source-chain, abi-encoded if evm-compatible /// @return bool Whether the address is approved or not to invoke functions on this contract + // TODO this function isn't being used elsewhere, this implies we are missing validation in receiver function isApprovedSender(uint64 sourceChainSelector, bytes calldata senderAddr) external view returns (bool) { return s_chainConfigs[sourceChainSelector].approvedSender[senderAddr]; } @@ -85,19 +97,25 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Fee Token Management │ // =============================================================== - /// @notice function support native-fee-token pre-funding in all children implementing the ccipSend function + // TODO update comments to be explicit about what the function does. + /// @notice Accepts prefunding in native fee token. + /// @dev All the example applications accept prefunding. This function should be removed if prefunding in native fee token is not required. receive() external payable {} /// @notice Allow the owner to recover any native-tokens sent to this contract out of error. - /// @dev Function should not be used to recover tokens from failed-messages, abandonFailedMessage() should be used instead + /// TODO this is withdraw native, it isn't related to token recovery + /// @dev Function should not be used to recover tokens from failed messages, abandonFailedMessage() should be used instead /// @param to A payable address to send the recovered tokens to /// @param amount the amount of native tokens to recover, denominated in wei function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { Address.sendValue(to, amount); } + // TODO provide context on instructions, instead of just saying what to do, also explain why /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error. - /// @dev Function should not be used to recover tokens from failed-messages, abandonFailedMessage() should be used instead + /// @dev This should NOT be used for recoverying tokens from a failed message. Token recoveries can happen only if + /// the failed message is guaranteed to not succeed upon retry, otherwise this can lead to double spend. + /// For implementation of token recovery, see inheriting contracts. /// @param to A payable address to send the recovered tokens to /// @param amount the amount of native tokens to recover, denominated in wei function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { @@ -108,6 +126,8 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Chain Management │ // ================================================================ + // TODO let's combine `enabledChain` and `disableChain` into a single `applyChainUpdates` that takes in an array to allow for bulk edits + // Reference similar function in TokenPool /// @notice Enable a remote-chain to send and receive messages to/from this contract via CCIP /// @param chainSelector A unique CCIP-specific identifier for the source chain /// @param recipient The address a message should be sent to on the destination chain. There should only be one per-chain, and is abi-encoded if EVM-compatible. @@ -124,7 +144,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // Set any additional args such as enabling out-of-order execution or manual gas-limit if (_extraArgsBytes.length != 0) currentConfig.extraArgsBytes = _extraArgsBytes; - // If config was previously disabled, then re-enable it; + // If config was previously disabled, then re-enable it if (currentConfig.disabled) currentConfig.disabled = false; } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index b6dc6fc8b0..02bcfabc59 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -25,6 +25,7 @@ contract CCIPReceiver is CCIPClientBase { // RESOLVED is first so that the default value is resolved. RESOLVED, FAILED, + // TODO comment ABANDONED } @@ -56,6 +57,16 @@ contract CCIPReceiver is CCIPClientBase { { try this.processMessage(message) {} catch (bytes memory err) { + // TODO kinda dangerous comments here. + // The original suggestion was: + // if you want custom retry logic, plus owner extracting tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver + // this means the message will appear as success to CCIP, and you can track the actual message state within the dapp + // if you do not need custom retry logic, and you don't need owner token recovery function, then you don't need the try-catch here + // because you can use ccip manualExecution as a retry function + // + // we should not phrase it such that "Any failures should be tracked by individual Dapps", it's only the case if they want custom retry pattern + // as opposed to default manual exec, or they want token recovery feature. + // Mark the message as having failed. Any failures should be tracked by individual Dapps, since CCIP // will mark the message as having been successfully delivered. CCIP makes no assurances about message delivery // other than invocation with proper gas limit. Any logic/execution errors should be tracked by separately. @@ -87,6 +98,7 @@ contract CCIPReceiver is CCIPClientBase { // │ Failed Message Processing | // ================== ============================================== + // TODO we don't do new @dev on every new line, same for @notice, when in doubt check other contracts. /// @notice Execute a message that failed initial delivery, but with different logic specifically for re-execution. /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. /// @dev function will revert if the messageId was not already stored as having failed its initial execution @@ -108,10 +120,14 @@ contract CCIPReceiver is CCIPClientBase { } /// @notice A function that should contain any special logic needed to "retry" processing of a previously failed message. - /// @dev if the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead + /// TODO these funtions do not exist + /// @dev If the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead /// @dev function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden - function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner {} + function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner { + // TODO how about we add a default implementation that calls `processMessage`, and comments for overrides + } + // TODO double notices /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried /// @notice function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. /// @dev this function is only callable as the owner, and From 3f07b0e59936d400ea1c1880f84a5433797c6dde Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 8 Jul 2024 14:51:10 -0400 Subject: [PATCH 31/31] fixes for more requested feedback. Restructure ACK receivers and ClientBase --- contracts/gas-snapshots/ccip.gas-snapshot | 61 ++++----- .../{CCIPClientBase.sol => CCIPBase.sol} | 119 ++++++++++-------- .../ccip/applications/external/CCIPClient.sol | 46 ++----- .../external/CCIPClientWithACK.sol | 48 +++++++ .../applications/external/CCIPReceiver.sol | 59 ++++----- .../external/CCIPReceiverWithACK.sol | 21 ++-- .../ccip/applications/external/CCIPSender.sol | 18 ++- .../applications/internal/PingPongDemo.sol | 8 +- ...Test.t.sol => CCIPClientWithACKTest.t.sol} | 59 ++++----- .../external/CCIPReceiverTest.t.sol | 75 +++++++---- .../external/CCIPReceiverWithAckTest.t.sol | 30 +++-- .../external/CCIPSenderTest.t.sol | 12 +- .../helpers/receivers/CCIPReceiverBasic.sol | 6 +- 13 files changed, 305 insertions(+), 257 deletions(-) rename contracts/src/v0.8/ccip/applications/external/{CCIPClientBase.sol => CCIPBase.sol} (56%) create mode 100644 contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol rename contracts/src/v0.8/ccip/test/applications/external/{CCIPClientTest.t.sol => CCIPClientWithACKTest.t.sol} (78%) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 04def4f478..20b4c76542 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,10 +34,10 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243568) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 331271) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 347022) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 241425) -CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 552000) +CCIPClientTest:test_ccipReceiveAndSendAck_Success() (gas: 331825) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348272) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241532) +CCIPClientTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552173) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357994) @@ -88,21 +88,22 @@ CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1160583) CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1158919) CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562) -CCIPReceiverTest:test_HappyPath_Success() (gas: 193588) -CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428817) -CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 444784) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205094) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425167) -CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 420799) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18806) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 55172) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 331323) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437616) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2643085) -CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72519) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339182) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224256) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 367940) +CCIPReceiverTest:test_HappyPath_Success() (gas: 193812) +CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 430948) +CCIPReceiverTest:test_Recovery_with_intentional_Revert() (gas: 445121) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_Revert() (gas: 199816) +CCIPReceiverTest:test_modifyRouter_Success() (gas: 26470) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 427992) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 421204) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20689) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 56254) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331794) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438731) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2948564) +CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74835) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339572) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224467) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 368160) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -209,7 +210,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181595) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 189957) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47044) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1408453) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1709977) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 248935) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 174421) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193347) @@ -235,8 +236,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207222) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28130) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 158903) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1479082) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3171008) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1780718) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3496512) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209279) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 209853) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 664710) @@ -375,7 +376,7 @@ EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101458) EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165192) EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177948) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1376538) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1678062) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159863) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175094) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248764) @@ -407,14 +408,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131906) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1457911) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1759547) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186809) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26009) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 189003) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188464) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2844986) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3171279) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144106) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -685,9 +686,9 @@ OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 380711) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308231) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17898) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234226) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308708) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17766) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234292) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -834,8 +835,8 @@ Router_routeMessage:test_ManualExec_Success() (gas: 35381) Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25116) Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44724) Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 290288) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 451971) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 290920) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 456179) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20203) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol similarity index 56% rename from contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol rename to contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index 714fcda4f1..5974e79b70 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -2,15 +2,15 @@ pragma solidity ^0.8.0; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; -import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.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 {Address} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; -// TODO how do you feel about just renaming this to `CCIPBase` -// TODO add natspec comments on top of every contract -abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { +/// @title CCIPBase +/// @notice This contains the boilerplate code for managing chains and tokens your contract may interact with as part of CCIP. It does not send or receive messages through CCIP only manages supported chains and sources/destinations. +/// @dev This contract is abstract, but does not have any functions which must be implemented by a child. +abstract contract CCIPBase is OwnerIsCreator { using SafeERC20 for IERC20; using Address for address; @@ -20,32 +20,38 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { error InvalidSender(bytes sender); error InvalidRecipient(bytes recipient); - // TODO every field in a struct should have comment, also do spack comments alignment, for example + event CCIPRouterModified(address indexed oldRouter, address indexed newRouter); + event TokensWithdrawnByOwner(address indexed token, address indexed to, uint256 amount); + event ApprovedSenderModified(uint64 indexed destChainSelector, bytes indexed recipient, bool isBeingApproved); + + event ChainAdded(uint64 remoteChainSelector, bytes recipient, bytes extraArgsBytes); + event ChainRemoved(uint64 removeChainSelector); + struct ApprovedSenderUpdate { uint64 destChainSelector; // Chainselector for a source chain that is allowed to call this dapp bytes sender; // The sender address on source chain that is allowed to call, ABI encoded in the case of a remote EVM chain } - // TODO change disabled to enabled so the default value is false if it is not configured - // TODO actually, can you use recipient.length != 0 as the enabled flag? Saves 1 slot + struct ChainUpdate { + uint64 chainSelector; + bool allowed; + bytes recipient; + bytes extraArgsBytes; + } + struct ChainConfig { - bool disabled; - bytes recipient; // The address to send messages to on the destination chain, ABI encoded in the case of a remote EVM chain. + bytes recipient; // The address to send messages to on the destination chain, ABI encoded in the case of a remote EVM chain. bytes extraArgsBytes; // Specifies extraArgs to pass into ccipSend, includes configs such as gas limit, and OOO execution. - - - // TODO important to add context on why this is a nested mapping; afaik it is to support remote one-sided dapp upgrades - mapping(bytes recipient => bool isApproved) approvedSender; + mapping(bytes recipient => bool isApproved) approvedSender; // Mapping is nested to support work-flows where Dapps may need to receive messages from one-or-more contracts on a source chain, or to support one-sided dapp upgrades. } - // TODO I recall there were some discussions about upgradable Router, was it confirmed with GTM/Devrel we can have immutable router? - address internal immutable i_ccipRouter; + address internal s_ccipRouter; mapping(uint64 destChainSelector => ChainConfig) public s_chainConfigs; constructor(address router) { if (router == address(0)) revert ZeroAddressNotAllowed(); - i_ccipRouter = router; + s_ccipRouter = router; } // ================================================================ @@ -54,7 +60,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { /// @notice returns the address of the CCIP Router set at contract deployment function getRouter() public view virtual returns (address) { - return i_ccipRouter; + return s_ccipRouter; } /// @dev only calls from the set router are accepted. @@ -67,28 +73,32 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Sender/Receiver Management │ // ================================================================ - // TODO we should be consistent in our styles, "source chain" is preferred over "soure-chain", when in doubt, check other contracts for reference /// @notice modify the list of approved source chain contracts which can send messages to this contract through CCIP /// @dev removes are executed before additions, so a contract present in both will be approved at the end of execution - // TODO emit events here function updateApprovedSenders( ApprovedSenderUpdate[] calldata adds, ApprovedSenderUpdate[] calldata removes ) external onlyOwner { for (uint256 i = 0; i < removes.length; ++i) { delete s_chainConfigs[removes[i].destChainSelector].approvedSender[removes[i].sender]; + + // Third parameter is false to indicate that the sender's previous approval is being revoked, to improve off-chain event indexing + emit ApprovedSenderModified(removes[i].destChainSelector, removes[i].sender, false); } for (uint256 i = 0; i < adds.length; ++i) { s_chainConfigs[adds[i].destChainSelector].approvedSender[adds[i].sender] = true; + + // Third parameter is true to indicate that the sender is being approved, to improve off-chain event indexing + emit ApprovedSenderModified(adds[i].destChainSelector, adds[i].sender, true); } } /// @notice Return whether a contract on the specified source chain is authorized to send messages to this contract through CCIP + /// @dev This function does not revert on an unapproved-sender, and should only be used as a getter-function for querying approvals from a ChainConfig object. The isValidSender modifier should be used instead for incoming message-validation /// @param sourceChainSelector A unique CCIP-specific identifier for the source chain - /// @param senderAddr The address which sent the message on the source-chain, abi-encoded if evm-compatible + /// @param senderAddr The address which sent the message on the source chain, abi-encoded if evm-compatible /// @return bool Whether the address is approved or not to invoke functions on this contract - // TODO this function isn't being used elsewhere, this implies we are missing validation in receiver function isApprovedSender(uint64 sourceChainSelector, bytes calldata senderAddr) external view returns (bool) { return s_chainConfigs[sourceChainSelector].approvedSender[senderAddr]; } @@ -97,22 +107,22 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Fee Token Management │ // =============================================================== - // TODO update comments to be explicit about what the function does. - /// @notice Accepts prefunding in native fee token. + /// @notice Accepts incoming native-tokens to support prefunding in native fee token. /// @dev All the example applications accept prefunding. This function should be removed if prefunding in native fee token is not required. receive() external payable {} - /// @notice Allow the owner to recover any native-tokens sent to this contract out of error. - /// TODO this is withdraw native, it isn't related to token recovery + /// @notice Allow the owner to recover any native-tokens sent to this contract out of error, or to withdraw any native-tokens which were used for pre-funding if the fee-token is switched away from native-tokens. /// @dev Function should not be used to recover tokens from failed messages, abandonFailedMessage() should be used instead /// @param to A payable address to send the recovered tokens to /// @param amount the amount of native tokens to recover, denominated in wei function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { Address.sendValue(to, amount); + + // Use the same withdrawal event signature as withdrawTokens() but use address(0) to denote native-tokens. + emit TokensWithdrawnByOwner(address(0), to, amount); } - // TODO provide context on instructions, instead of just saying what to do, also explain why - /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error. + /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error or withdraw any fee-tokens which were sent as a source of fee-token pre-funding /// @dev This should NOT be used for recoverying tokens from a failed message. Token recoveries can happen only if /// the failed message is guaranteed to not succeed upon retry, otherwise this can lead to double spend. /// For implementation of token recovery, see inheriting contracts. @@ -120,49 +130,60 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { /// @param amount the amount of native tokens to recover, denominated in wei function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).safeTransfer(to, amount); + + emit TokensWithdrawnByOwner(token, to, amount); } // ================================================================ // │ Chain Management │ // ================================================================ - // TODO let's combine `enabledChain` and `disableChain` into a single `applyChainUpdates` that takes in an array to allow for bulk edits + function modifyRouter(address newRouter) external onlyOwner { + if (newRouter == address(0)) revert ZeroAddressNotAllowed(); + + // Store the old router in memory to emit event + address currentRouter = s_ccipRouter; + + s_ccipRouter = newRouter; + + emit CCIPRouterModified(currentRouter, newRouter); + } + // Reference similar function in TokenPool /// @notice Enable a remote-chain to send and receive messages to/from this contract via CCIP - /// @param chainSelector A unique CCIP-specific identifier for the source chain - /// @param recipient The address a message should be sent to on the destination chain. There should only be one per-chain, and is abi-encoded if EVM-compatible. - /// @param _extraArgsBytes additional optional ccipSend parameters. Do not need to be set unless necessary based on the application-logic - function enableChain( - uint64 chainSelector, - bytes calldata recipient, - bytes calldata _extraArgsBytes - ) external onlyOwner { - ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; + function applyChainUpdates(ChainUpdate[] calldata chains) external onlyOwner { + for (uint256 i = 0; i < chains.length; ++i) { + if (!chains[i].allowed) { + delete s_chainConfigs[chains[i].chainSelector].recipient; + emit ChainRemoved(chains[i].chainSelector); + } else { + // The existence of a stored recipient is used to denote a chain being enabled, so the length here cannot be zero + if (chains[i].recipient.length == 0) revert ZeroAddressNotAllowed(); - currentConfig.recipient = recipient; + ChainConfig storage currentConfig = s_chainConfigs[chains[i].chainSelector]; - // Set any additional args such as enabling out-of-order execution or manual gas-limit - if (_extraArgsBytes.length != 0) currentConfig.extraArgsBytes = _extraArgsBytes; + currentConfig.recipient = chains[i].recipient; - // If config was previously disabled, then re-enable it - if (currentConfig.disabled) currentConfig.disabled = false; - } + // Set any additional args such as enabling out-of-order execution or manual gas-limit + if (chains[i].extraArgsBytes.length != 0) currentConfig.extraArgsBytes = chains[i].extraArgsBytes; - /// @notice Mark a chain as not supported for sending-receiving messages to/from this contract via CCIP. - /// @dev If a chain needs to be re-enabled after being disabled, the owner must call enableChain() to support it again. - function disableChain(uint64 chainSelector) external onlyOwner { - s_chainConfigs[chainSelector].disabled = true; + emit ChainAdded(chains[i].chainSelector, chains[i].recipient, chains[i].extraArgsBytes); + } + } } modifier isValidChain(uint64 chainSelector) { // Must be storage and not memory because the struct contains a nested mapping which is not capable of being copied to memory ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; - if (currentConfig.recipient.length == 0 || currentConfig.disabled) revert InvalidChain(chainSelector); + if (currentConfig.recipient.length == 0) revert InvalidChain(chainSelector); _; } modifier isValidSender(uint64 chainSelector, bytes memory sender) { - if (!s_chainConfigs[chainSelector].approvedSender[sender]) revert InvalidSender(sender); + // If the chain is disabled, then short-circuit trigger a revert because no sender should be valid + if (s_chainConfigs[chainSelector].recipient.length == 0 || !s_chainConfigs[chainSelector].approvedSender[sender]) { + revert InvalidSender(sender); + } _; } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 7376a3cabf..f22837b995 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -9,25 +9,20 @@ import {CCIPReceiverWithACK} from "./CCIPReceiverWithACK.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"; -/// @notice CCIPReceiver and CCIPSender cannot be simultaneously imported due to similar parents so CCIPSender functionality has been duplicated +/// @title CCIPClient +/// @notice This contract implements logic for sending and receiving CCIP Messages. It utilizes CCIPReceiver's defensive patterns by default. +/// @dev CCIPReceiver and CCIPSender cannot be simultaneously imported due to similar parents so CCIPSender functionality has been duplicated contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; - error InvalidConfig(); - error CannotAcknowledgeUnsentMessage(bytes32); - constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} - function typeAndVersion() external pure virtual override returns (string memory) { - return "CCIPClient 1.0.0-dev"; - } - /// @notice sends a message through CCIP to the router function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, bytes memory data - ) public payable isValidChain(destChainSelector) returns (bytes32 messageId) { + ) public payable virtual isValidChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: s_chainConfigs[destChainSelector].recipient, data: data, @@ -42,18 +37,18 @@ contract CCIPClient is CCIPReceiverWithACK { // Do not approve the tokens if it is the feeToken, otherwise the approval amount may overflow if (tokenAmounts[i].token != address(s_feeToken)) { - IERC20(tokenAmounts[i].token).safeIncreaseAllowance(i_ccipRouter, tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).safeApprove(s_ccipRouter, tokenAmounts[i].amount); } } - uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); + uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken if (address(s_feeToken) != address(0)) { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } - messageId = IRouterClient(i_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( + messageId = IRouterClient(s_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( destChainSelector, message ); @@ -64,31 +59,4 @@ contract CCIPClient is CCIPReceiverWithACK { return messageId; } - - /// @notice Implementation of arbitrary logic to be executed when a CCIP message is received - /// @dev is only invoked by self on CCIPReceive, and should implement arbitrary dapp-specific logic - function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { - (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); - - if (payload.messageType == MessageType.OUTGOING) { - // Insert Processing workflow here. - - // If the message was outgoing, then send an ack response. - _sendAck(message); - } else if (payload.messageType == MessageType.ACK) { - // Decode message into the message-heacder and the messageId to ensure the message is encoded correctly - (bytes memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); - - // Ensure Ack Message contains proper message header - if (keccak256(messageHeader) != keccak256(ACK_MESSAGE_HEADER)) revert InvalidAckMessageHeader(); - - // Make sure the ACK message was originally sent by this contract - if (s_messageStatus[messageId] != MessageStatus.SENT) revert CannotAcknowledgeUnsentMessage(messageId); - - // Mark the message has finalized from a proper ack-message. - s_messageStatus[messageId] = MessageStatus.ACKNOWLEDGED; - - emit MessageAckReceived(messageId); - } - } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol new file mode 100644 index 0000000000..0c62f4ced9 --- /dev/null +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Client} from "../../libraries/Client.sol"; +import {CCIPClient} from "./CCIPClient.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"; + +/// @title CCIPClientWithACK +/// @notice This contract implements logic for sending and receiving CCIP Messages, as well as responding to incoming messages with an ACK-response pattern. It utilizes CCIPReceiver's defensive patterns by default. +/// @dev ccipSend functionality has been inherited from CCIPClient.sol, and _sendACK() from CCIPReceiverWithACK, so only processMessage() must be overridden to enable full functionality for processing incoming messages for ACK's +contract CCIPClientWithACK is CCIPClient { + using SafeERC20 for IERC20; + + error CannotAcknowledgeUnsentMessage(bytes32); + + constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} + + /// @notice Implementation of arbitrary logic to be executed when a CCIP message is received + /// @dev is only invoked by self on CCIPReceive, and should implement arbitrary dapp-specific logic + function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { + (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); + + if (payload.messageType == MessageType.OUTGOING) { + // Insert Processing workflow here. + + // If the message was outgoing, then send an ack response. + _sendAck(message); + } else if (payload.messageType == MessageType.ACK) { + // Decode message into the message-header and the messageId to ensure the message is encoded correctly + (string memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (string, bytes32)); + + // Ensure Ack Message contains proper message header + if (keccak256(abi.encode(messageHeader)) != keccak256(abi.encode(ACK_MESSAGE_HEADER))) { + revert InvalidAckMessageHeader(); + } + + // Make sure the ACK message was originally sent by this contract + if (s_messageStatus[messageId] != MessageStatus.SENT) revert CannotAcknowledgeUnsentMessage(messageId); + + // Mark the message has finalized from a proper ack-message. + s_messageStatus[messageId] = MessageStatus.ACKNOWLEDGED; + + emit MessageAckReceived(messageId); + } + } +} diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 02bcfabc59..4e071669f7 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -2,13 +2,16 @@ pragma solidity ^0.8.0; import {Client} from "../../libraries/Client.sol"; -import {CCIPClientBase} from "./CCIPClientBase.sol"; +import {CCIPBase} from "./CCIPBase.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/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; -contract CCIPReceiver is CCIPClientBase { +/// @title CCIPReceiver +/// @notice This contract is capable of receiving incoming messages from the CCIP-Router. +/// @dev This contract implements various "defensive" measures to enhance security and efficiency. These include the ability to implement custom-retry logic and ownership-based token-recovery functions. +contract CCIPReceiver is CCIPBase { using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; @@ -20,13 +23,12 @@ contract CCIPReceiver is CCIPClientBase { event MessageRecovered(bytes32 indexed messageId); event MessageAbandoned(bytes32 indexed messageId, address tokenReceiver); - // Example error code, could have many different error codes. enum ErrorCode { - // RESOLVED is first so that the default value is resolved. - RESOLVED, - FAILED, - // TODO comment - ABANDONED + RESOLVED, // RESOLVED is the default status for any incoming message, unless execution fails and it is marked as FAILED. + FAILED, // FAILED messages are messages which reverted during execution of processMessage() as part of the ccipReceive() try catch loop. + ABANDONED // ABANDONED messages are ones which cannot be properly processed, but any sent tokens are recoverable, and can only be triggered by the contract owner. + // Only a message that was previously marked as FAILED can be abandoned. + } // The message contents of failed messages are stored here. @@ -35,18 +37,14 @@ contract CCIPReceiver is CCIPClientBase { // Contains failed messages and their state. EnumerableMap.Bytes32ToUintMap internal s_failedMessages; - constructor(address router) CCIPClientBase(router) {} - - function typeAndVersion() external pure virtual returns (string memory) { - return "CCIPReceiver 1.0.0-dev"; - } + constructor(address router) CCIPBase(router) {} // ================================================================ // │ Incoming Message Processing | // ================================================================ /// @notice The entrypoint for the CCIP router to call. This function should - /// never revert, all errors should be handled internally in this contract. + /// not revert, all errors should be handled internally in this contract. /// @param message The message to process. /// @dev Extremely important to ensure only router calls this. function ccipReceive(Client.Any2EVMMessage calldata message) @@ -57,19 +55,11 @@ contract CCIPReceiver is CCIPClientBase { { try this.processMessage(message) {} catch (bytes memory err) { - // TODO kinda dangerous comments here. - // The original suggestion was: - // if you want custom retry logic, plus owner extracting tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver - // this means the message will appear as success to CCIP, and you can track the actual message state within the dapp - // if you do not need custom retry logic, and you don't need owner token recovery function, then you don't need the try-catch here - // because you can use ccip manualExecution as a retry function - // - // we should not phrase it such that "Any failures should be tracked by individual Dapps", it's only the case if they want custom retry pattern - // as opposed to default manual exec, or they want token recovery feature. - - // Mark the message as having failed. Any failures should be tracked by individual Dapps, since CCIP - // will mark the message as having been successfully delivered. CCIP makes no assurances about message delivery - // other than invocation with proper gas limit. Any logic/execution errors should be tracked by separately. + // If custom retry logic is desired, plus granting the owner the ability to extract tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver. + // This make the message appear as a success to CCIP, and actual message state and any residual errors can be tracked within the dapp with greater granularity. + // If custom retry logic and token recovery functions are not needed, then this try-catch can be removed, + // and ccip manualExecution can be used a retry function instead. + s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); // Store the message contents in case it needs to be retried or abandoned @@ -98,10 +88,9 @@ contract CCIPReceiver is CCIPClientBase { // │ Failed Message Processing | // ================== ============================================== - // TODO we don't do new @dev on every new line, same for @notice, when in doubt check other contracts. - /// @notice Execute a message that failed initial delivery, but with different logic specifically for re-execution. + /// @notice Executes a message that failed initial delivery, but with different logic specifically for re-execution. /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. - /// @dev function will revert if the messageId was not already stored as having failed its initial execution + /// @dev Function will revert if the messageId was not already stored as having failed its initial execution /// @param messageId the unique ID of the CCIP-message which failed initial-execution. function retryFailedMessage(bytes32 messageId) external { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); @@ -120,17 +109,15 @@ contract CCIPReceiver is CCIPClientBase { } /// @notice A function that should contain any special logic needed to "retry" processing of a previously failed message. - /// TODO these funtions do not exist - /// @dev If the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead - /// @dev function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden + /// @dev If the owner wants to retrieve tokens without special logic, then abandonFailedMessage(), withdrawNativeTokens(), or withdrawTokens() should be used instead + /// @dev This function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner { // TODO how about we add a default implementation that calls `processMessage`, and comments for overrides } - // TODO double notices /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried - /// @notice function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. - /// @dev this function is only callable as the owner, and + /// @dev function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. + /// @dev function is only callable by the contract owner function abandonFailedMessage(bytes32 messageId, address receiver) external onlyOwner { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index aee2b4686d..7bda3e9163 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -10,6 +10,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ import {EnumerableMap} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; +/// @title CCIPReceiverWithACK contract CCIPReceiverWithACK is CCIPReceiver { using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; @@ -39,7 +40,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { MessageType messageType; } - bytes public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; + string public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; // Current feeToken IERC20 public s_feeToken; @@ -55,10 +56,6 @@ contract CCIPReceiverWithACK is CCIPReceiver { } } - function typeAndVersion() external pure virtual override returns (string memory) { - return "CCIPReceiverWithACK 1.0.0-dev"; - } - function modifyFeeToken(address token) external onlyOwner { // If the current fee token is not-native, zero out the allowance to the router for safety if (address(s_feeToken) != address(0)) { @@ -109,14 +106,16 @@ contract CCIPReceiverWithACK is CCIPReceiver { if (payload.messageType == MessageType.OUTGOING) { // Insert Processing workflow here. - // If the message was outgoing on the source-chain, then send an ack response. + // If the message was outgoing on the source chain, then send an ack response. _sendAck(message); } else if (payload.messageType == MessageType.ACK) { // Decode message into the message header and the messageId to ensure the message is encoded correctly - (bytes memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); + (string memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (string, bytes32)); - // Ensure Ack Message contains proper message header - if (keccak256(messageHeader) != keccak256(ACK_MESSAGE_HEADER)) revert InvalidAckMessageHeader(); + // Ensure Ack Message contains proper message header. Must abi.encode() before hashing since its of the string type + if (keccak256(abi.encode(messageHeader)) != keccak256(abi.encode(ACK_MESSAGE_HEADER))) { + revert InvalidAckMessageHeader(); + } // Make sure the ACK message has not already been acknowledged if (s_messageStatus[messageId] == MessageStatus.ACKNOWLEDGED) revert MessageAlreadyAcknowledged(messageId); @@ -141,9 +140,9 @@ contract CCIPReceiverWithACK is CCIPReceiver { feeToken: address(s_feeToken) }); - uint256 feeAmount = IRouterClient(i_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); + uint256 feeAmount = IRouterClient(s_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); - bytes32 ACKmessageId = IRouterClient(i_ccipRouter).ccipSend{ + bytes32 ACKmessageId = IRouterClient(s_ccipRouter).ccipSend{ value: address(s_feeToken) == address(0) ? feeAmount : 0 }(incomingMessage.sourceChainSelector, outgoingMessage); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index 88f7d20ff9..3050786fa4 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {IRouterClient} from "../../interfaces/IRouterClient.sol"; import {Client} from "../../libraries/Client.sol"; -import {CCIPClientBase} from "./CCIPClientBase.sol"; +import {CCIPBase} from "./CCIPBase.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"; @@ -22,7 +22,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// like the example below will inherit the trust properties of CCIP (i.e. the oracle network). /// @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting /// new chain family receivers (e.g. a solana encoded receiver address) without upgrading. -contract CCIPSender is CCIPClientBase { +contract CCIPSender is CCIPBase { using SafeERC20 for IERC20; error InvalidConfig(); @@ -31,11 +31,7 @@ contract CCIPSender is CCIPClientBase { event MessageSent(bytes32 messageId); event MessageReceived(bytes32 messageId); - constructor(address router) CCIPClientBase(router) {} - - function typeAndVersion() external pure virtual override returns (string memory) { - return "CCIPSender 1.0.0-dev"; - } + constructor(address router) CCIPBase(router) {} /// @notice sends a message through CCIP to the router function ccipSend( @@ -55,18 +51,18 @@ contract CCIPSender is CCIPClientBase { for (uint256 i = 0; i < tokenAmounts.length; ++i) { // Transfer the tokens to this contract to pay the router for the tokens in tokenAmounts IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).safeIncreaseAllowance(i_ccipRouter, tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).safeIncreaseAllowance(s_ccipRouter, tokenAmounts[i].amount); } - uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); + uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); if (feeToken != address(0)) { IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); - IERC20(feeToken).safeIncreaseAllowance(i_ccipRouter, fee); + IERC20(feeToken).safeIncreaseAllowance(s_ccipRouter, fee); } messageId = - IRouterClient(i_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); + IRouterClient(s_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); emit MessageSent(messageId); diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 64669c3819..cadc2cb857 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -2,13 +2,13 @@ pragma solidity ^0.8.0; import {Client} from "../../libraries/Client.sol"; -import {CCIPClient} from "../external/CCIPClient.sol"; +import {CCIPClientWithACK} from "../external/CCIPClientWithACK.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"; /// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication -contract PingPongDemo is CCIPClient { +contract PingPongDemo is CCIPClientWithACK { using SafeERC20 for IERC20; event Ping(uint256 pingPongCount); @@ -24,9 +24,9 @@ contract PingPongDemo is CCIPClient { bool private s_isPaused; // CCIPClient will handle the token approval so there's no need to do it here - constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} + constructor(address router, IERC20 feeToken) CCIPClientWithACK(router, feeToken) {} - function typeAndVersion() external pure virtual override returns (string memory) { + function typeAndVersion() external pure virtual returns (string memory) { return "PingPongDemo 1.3.0"; } diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol similarity index 78% rename from contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol rename to contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index ae924a8c60..b867637b08 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CCIPClient} from "../../../applications/external/CCIPClient.sol"; +import {CCIPClientWithACK} from "../../../applications/external/CCIPClientWithACK.sol"; -import {CCIPReceiverWithACK} from "../../../applications/external/CCIPClient.sol"; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; +import {CCIPReceiverWithACK} from "../../../applications/external/CCIPReceiverWithACK.sol"; import {IRouterClient} from "../../../interfaces/IRouterClient.sol"; import {Client} from "../../../libraries/Client.sol"; @@ -20,23 +20,32 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { event MessageAckSent(bytes32 incomingMessageId); event MessageAckReceived(bytes32); - CCIPClient internal s_sender; + CCIPClientWithACK internal s_sender; uint64 internal destChainSelector = DEST_CHAIN_SELECTOR; function setUp() public virtual override { EVM2EVMOnRampSetup.setUp(); - s_sender = new CCIPClient(address(s_sourceRouter), IERC20(s_sourceFeeToken)); - s_sender.enableChain(destChainSelector, abi.encode(address(s_sender)), ""); + s_sender = new CCIPClientWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); - CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: destChainSelector, + allowed: true, + recipient: abi.encode(address(s_sender)), + extraArgsBytes: "" + }); + + s_sender.applyChainUpdates(chainUpdates); + + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); senderUpdates[0] = - CCIPClientBase.ApprovedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_sender))}); + CCIPBase.ApprovedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_sender))}); - s_sender.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); + s_sender.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); } - function test_ccipReceiveAndSendAck() public { + function test_ccipReceiveAndSendAck_Success() public { bytes32 messageId = keccak256("messageId"); bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; address token = address(s_sourceFeeToken); @@ -83,7 +92,7 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_sender)), receiverBalanceBefore - feeTokenAmount); } - function test_ccipSend_withNonNativeFeetoken_andNoDestTokens() public { + function test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() public { address token = address(s_sourceFeeToken); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -108,7 +117,7 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); } - function test_ccipSendAndReceiveAck_in_return() public { + function test_ccipSendAndReceiveAck_in_return_Success() public { address token = address(s_sourceFeeToken); uint256 amount = 111333333777; Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); @@ -150,36 +159,13 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { ); } - // function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { - // Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); - - // Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - // receiver: abi.encode(address(s_sender)), - // data: "FAKE_DATA", - // tokenAmounts: destTokenAmounts, - // feeToken: address(0), - // extraArgs: "" - // }); - - // uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); - - // vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); - // s_sender.ccipSend{value: feeTokenAmount / 2}({ - // destChainSelector: DEST_CHAIN_SELECTOR, - // tokenAmounts: destTokenAmounts, - // data: "", - // feeToken: address(0) - // }); - // } - - function test_send_tokens_that_are_not_feeToken() public { + function test_send_tokens_that_are_not_feeToken_Success() public { address token = s_sourceTokens[1]; uint256 amount = 111333333777; Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); // Make sure we give the receiver contract enough tokens like CCIP would. - IERC20(token).approve(address(s_sender), type(uint256).max); IERC20(s_sourceFeeToken).approve(address(s_sender), type(uint256).max); deal(token, address(this), 1e24); @@ -197,7 +183,6 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); - // feeToken: address(s_sourceFeeToken) // Assert that tokens were transfered for bridging + fees assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index e64a5d28ab..bac560975d 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; import {CCIPReceiver} from "../../../applications/external/CCIPReceiver.sol"; import {CCIPReceiverReverting} from "../../helpers/receivers/CCIPReceiverReverting.sol"; @@ -23,18 +23,24 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { EVM2EVMOnRampSetup.setUp(); s_receiver = new CCIPReceiverReverting(address(s_destRouter)); - s_receiver.enableChain(sourceChainSelector, abi.encode(address(1)), ""); - CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ - destChainSelector: sourceChainSelector, - sender: abi.encode(address(s_receiver)) + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: sourceChainSelector, + allowed: true, + recipient: abi.encode(address(s_receiver)), + extraArgsBytes: "" }); + s_receiver.applyChainUpdates(chainUpdates); - s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = + CCIPBase.ApprovedSenderUpdate({destChainSelector: sourceChainSelector, sender: abi.encode(address(s_receiver))}); + + s_receiver.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); } - function test_Recovery_with_intentional_revert() public { + function test_Recovery_with_intentional_Revert() public { bytes32 messageId = keccak256("messageId"); address token = address(s_destFeeToken); uint256 amount = 111333333777; @@ -84,7 +90,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } - function test_Recovery_from_invalid_sender() public { + function test_Recovery_from_invalid_sender_Success() public { bytes32 messageId = keccak256("messageId"); address token = address(s_destFeeToken); uint256 amount = 111333333777; @@ -99,7 +105,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageFailed( - messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(1))) + messageId, abi.encodeWithSelector(bytes4(CCIPBase.InvalidSender.selector), abi.encode(address(1))) ); s_receiver.ccipReceive( @@ -152,7 +158,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageFailed( - messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(1))) + messageId, abi.encodeWithSelector(bytes4(CCIPBase.InvalidSender.selector), abi.encode(address(1))) ); s_receiver.ccipReceive( @@ -214,8 +220,19 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } - function test_disableChain_andRevert_onccipReceive_REVERT() public { - s_receiver.disableChain(sourceChainSelector); + function test_disableChain_andRevert_onccipReceive_Revert() public { + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: sourceChainSelector, + allowed: false, + recipient: abi.encode(address(s_receiver)), + extraArgsBytes: "" + }); + + vm.expectEmit(); + emit CCIPBase.ChainRemoved(sourceChainSelector); + + s_receiver.applyChainUpdates(chainUpdates); bytes32 messageId = keccak256("messageId"); address token = address(s_destFeeToken); @@ -229,7 +246,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { // The receiver contract will revert if the router is not the sender. vm.startPrank(address(s_destRouter)); - vm.expectRevert(abi.encodeWithSelector(CCIPClientBase.InvalidChain.selector, sourceChainSelector)); + vm.expectRevert(abi.encodeWithSelector(CCIPBase.InvalidChain.selector, sourceChainSelector)); s_receiver.ccipReceive( Client.Any2EVMMessage({ @@ -242,14 +259,26 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } - function test_removeSender_from_approvedList_and_revert() public { - CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ - destChainSelector: sourceChainSelector, - sender: abi.encode(address(s_receiver)) - }); + function test_modifyRouter_Success() public { + vm.expectRevert(abi.encodeWithSelector(CCIPBase.ZeroAddressNotAllowed.selector)); + s_receiver.modifyRouter(address(0)); + + address newRouter = address(0x1234); + + vm.expectEmit(); + emit CCIPBase.CCIPRouterModified(address(s_destRouter), newRouter); + + s_receiver.modifyRouter(newRouter); + + assertEq(s_receiver.getRouter(), newRouter, "Router Address not set correctly to the new router"); + } + + function test_removeSender_from_approvedList_and_revert_Success() public { + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = + CCIPBase.ApprovedSenderUpdate({destChainSelector: sourceChainSelector, sender: abi.encode(address(s_receiver))}); - s_receiver.updateApprovedSenders(new CCIPClientBase.ApprovedSenderUpdate[](0), senderUpdates); + s_receiver.updateApprovedSenders(new CCIPBase.ApprovedSenderUpdate[](0), senderUpdates); // assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); assertFalse(s_receiver.isApprovedSender(sourceChainSelector, abi.encode(address(s_receiver)))); @@ -268,7 +297,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageFailed( - messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(s_receiver))) + messageId, abi.encodeWithSelector(bytes4(CCIPBase.InvalidSender.selector), abi.encode(address(s_receiver))) ); s_receiver.ccipReceive( @@ -282,7 +311,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } - function test_withdraw_nativeToken_to_owner() public { + function test_withdraw_nativeToken_to_owner_Success() public { uint256 amount = 100 ether; deal(address(s_receiver), amount); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol index eca03f56f1..de0f4bf800 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; import {CCIPReceiverWithACK} from "../../../applications/external/CCIPReceiverWithACK.sol"; import {Client} from "../../../libraries/Client.sol"; @@ -24,18 +24,24 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { EVM2EVMOnRampSetup.setUp(); s_receiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); - s_receiver.enableChain(destChainSelector, abi.encode(address(s_receiver)), ""); - CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ - destChainSelector: destChainSelector, - sender: abi.encode(address(s_receiver)) + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: destChainSelector, + allowed: true, + recipient: abi.encode(address(s_receiver)), + extraArgsBytes: "" }); + s_receiver.applyChainUpdates(chainUpdates); - s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = + CCIPBase.ApprovedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_receiver))}); + + s_receiver.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); } - function test_ccipReceive_and_respond_with_ack() public { + function test_ccipReceive_and_respond_with_ack_Success() public { bytes32 messageId = keccak256("messageId"); bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; address token = address(s_sourceFeeToken); @@ -82,7 +88,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)), receiverBalanceBefore - feeTokenAmount); } - function test_ccipReceive_ack_message() public { + function test_ccipReceive_ack_message_Success() public { bytes32 messageId = keccak256("messageId"); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -115,7 +121,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { ); } - function test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() public { + function test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() public { bytes32 messageId = keccak256("messageId"); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -147,7 +153,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { assertEq(s_receiver.getMessageStatus(messageId), 1); } - function test_modifyFeeToken() public { + function test_modifyFeeToken_Success() public { // WETH is used as a placeholder for any ERC20 token address WETH = s_sourceRouter.getWrappedNative(); @@ -165,7 +171,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { assertEq(IERC20(s_sourceFeeToken).allowance(address(s_receiver), address(s_sourceRouter)), 0); } - function test_feeTokenApproval_in_constructor() public { + function test_feeTokenApproval_in_constructor_Success() public { CCIPReceiverWithACK newReceiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); assertEq(IERC20(s_sourceFeeToken).allowance(address(newReceiver), address(s_sourceRouter)), type(uint256).max); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol index 5dda0bf18f..5e74236b41 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; import {CCIPSender} from "../../../applications/external/CCIPSender.sol"; import {Client} from "../../../libraries/Client.sol"; @@ -21,7 +21,15 @@ contract CCIPSenderTest is EVM2EVMOnRampSetup { EVM2EVMOnRampSetup.setUp(); s_sender = new CCIPSender(address(s_sourceRouter)); - s_sender.enableChain(DEST_CHAIN_SELECTOR, abi.encode(address(s_sender)), ""); + + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: DEST_CHAIN_SELECTOR, + allowed: true, + recipient: abi.encode(address(s_sender)), + extraArgsBytes: "" + }); + s_sender.applyChainUpdates(chainUpdates); } function test_ccipSend_withNonNativeFeetoken_andDestTokens() public { diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol index a457ea1793..7d7c54e89b 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol @@ -5,12 +5,12 @@ import {IAny2EVMMessageReceiver} from "../../../interfaces/IAny2EVMMessageReceiv import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; import {Client} from "../../../libraries/Client.sol"; /// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. -contract CCIPReceiverBasic is CCIPClientBase, IAny2EVMMessageReceiver, IERC165 { - constructor(address router) CCIPClientBase(router) {} +contract CCIPReceiverBasic is CCIPBase, IAny2EVMMessageReceiver, IERC165 { + constructor(address router) CCIPBase(router) {} function typeAndVersion() external pure virtual returns (string memory) { return "CCIPReceiverBasic 1.0.0-dev";