From 31f917d37d740be8017d701a7ba1ee04e5ce1b46 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 29 May 2024 12:04:42 -0400 Subject: [PATCH 01/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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/28] 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();